first commit
commit
cacf168a5b
@ -0,0 +1,671 @@
|
||||
package starainrt
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"crypto/md5"
|
||||
"crypto/rc4"
|
||||
"crypto/sha1"
|
||||
"crypto/sha256"
|
||||
"crypto/sha512"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func Exists(filepath string) bool {
|
||||
_, err := os.Stat(filepath)
|
||||
if err != nil && os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
func IsFile(fpath string) bool {
|
||||
s, err := os.Stat(fpath)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return !s.IsDir()
|
||||
}
|
||||
func ReWriteFileByKV(filepath, rem, conn, ret string, kv map[string]string) bool {
|
||||
var outputstr string
|
||||
var ataru bool = false
|
||||
if (!Exists(filepath)) || (!IsFile(filepath)) {
|
||||
return false
|
||||
}
|
||||
fso, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
rempar := regexp.MustCompile("^" + rem)
|
||||
buf := bufio.NewReader(fso)
|
||||
for {
|
||||
bytxt, _, eof := buf.ReadLine()
|
||||
if eof == io.EOF {
|
||||
break
|
||||
}
|
||||
txt := strings.TrimSpace(string(bytxt))
|
||||
if rempar.Match([]byte(txt)) {
|
||||
outputstr += txt + ret
|
||||
continue
|
||||
}
|
||||
for k, v := range kv {
|
||||
keypar := regexp.MustCompile("^" + k)
|
||||
if keypar.Match([]byte(txt)) {
|
||||
ataru = true
|
||||
outputstr += k + conn + v + ret
|
||||
delete(kv, k)
|
||||
}
|
||||
}
|
||||
if ataru {
|
||||
ataru = false
|
||||
continue
|
||||
} else {
|
||||
outputstr += txt + ret
|
||||
}
|
||||
}
|
||||
fso.Close()
|
||||
if len(kv) != 0 {
|
||||
for k, v := range kv {
|
||||
outputstr += k + conn + v + ret
|
||||
delete(kv, k)
|
||||
}
|
||||
}
|
||||
err = ioutil.WriteFile(filepath, []byte(outputstr), 0755)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func GetINIValue(filepath, rem, conn string, kv []string) (bool, map[string]string) {
|
||||
outputstr := make(map[string]string)
|
||||
if (!Exists(filepath)) || (!IsFile(filepath)) {
|
||||
return false, outputstr
|
||||
}
|
||||
fso, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
return false, outputstr
|
||||
}
|
||||
rempar := regexp.MustCompile("^" + rem)
|
||||
buf := bufio.NewReader(fso)
|
||||
for {
|
||||
bytxt, _, eof := buf.ReadLine()
|
||||
if eof == io.EOF {
|
||||
break
|
||||
}
|
||||
txt := strings.TrimSpace(string(bytxt))
|
||||
if rempar.Match([]byte(txt)) {
|
||||
continue
|
||||
}
|
||||
var i int = 0
|
||||
var v2 string
|
||||
for k, v := range kv {
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
v2 = ""
|
||||
for _, b := range []byte(v) {
|
||||
switch string(b) {
|
||||
case ".":
|
||||
v2 += "\\."
|
||||
case "\\":
|
||||
v2 += "\\"
|
||||
case "-":
|
||||
v2 += "\\-"
|
||||
case "(":
|
||||
v2 += "\\("
|
||||
case ")":
|
||||
v2 += "\\)"
|
||||
case "{":
|
||||
v2 += "\\{"
|
||||
case "}":
|
||||
v2 += "\\}"
|
||||
case "[":
|
||||
v2 += "\\["
|
||||
case "]":
|
||||
v2 += "\\]"
|
||||
case "$":
|
||||
v2 += "\\]$"
|
||||
case "^":
|
||||
v2 += "\\^"
|
||||
default:
|
||||
v2 += string(b)
|
||||
}
|
||||
}
|
||||
keypar := regexp.MustCompile("^" + v2 + ".*?" + conn + "(.*)")
|
||||
if keypar.Match([]byte(txt)) {
|
||||
i++
|
||||
kekka := keypar.FindSubmatch([]byte(txt))
|
||||
outputstr[v] = string(kekka[1])
|
||||
kv[k] = ""
|
||||
}
|
||||
}
|
||||
if i != len(kv) {
|
||||
for _, v := range kv {
|
||||
if v != "" {
|
||||
outputstr[v] = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true, outputstr
|
||||
}
|
||||
|
||||
func SmallEncodeFileByBase64(filepath, outputname string, buffer int) bool {
|
||||
if !Exists(filepath) {
|
||||
return false
|
||||
}
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(outputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(outputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
bfile, _ := ioutil.ReadFile(filepath)
|
||||
bitlen := len(bfile)
|
||||
i := 1
|
||||
var seed int = buffer
|
||||
if bitlen > seed {
|
||||
for bitlen > seed {
|
||||
coder := base64.StdEncoding.EncodeToString(bfile[seed*(i-1) : seed*i])
|
||||
ioutil.WriteFile(par1+strconv.Itoa(i)+par2, []byte(coder), 0755)
|
||||
i++
|
||||
bitlen -= seed
|
||||
}
|
||||
}
|
||||
coder := base64.StdEncoding.EncodeToString(bfile[seed*(i-1):])
|
||||
ioutil.WriteFile(par1+strconv.Itoa(i)+par2, []byte(coder), 0755)
|
||||
return true
|
||||
}
|
||||
|
||||
func SmallDecodeFileByBase64(inputname, outputname string, filesum int) bool {
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(inputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(inputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
for i := 1; i <= filesum; i++ {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
i := 1
|
||||
big := filesum
|
||||
res := []byte{}
|
||||
for i <= big {
|
||||
bfile, _ := ioutil.ReadFile(par1 + strconv.Itoa(i) + par2)
|
||||
coder, _ := base64.StdEncoding.DecodeString(string(bfile))
|
||||
for _, v := range coder {
|
||||
res = append(res, v)
|
||||
}
|
||||
i++
|
||||
//time.Sleep(time.Microsecond * 560)
|
||||
}
|
||||
ioutil.WriteFile(outputname, res, 0755)
|
||||
return true
|
||||
}
|
||||
|
||||
func EncodeFileByBase64(filepath, outputname string, buffer int) bool {
|
||||
if !Exists(filepath) {
|
||||
return false
|
||||
}
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(outputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(outputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
ret := SlitFile(filepath, outputname, 0, int64(buffer), int64(buffer)/10)
|
||||
if !ret {
|
||||
return false
|
||||
}
|
||||
i := 1
|
||||
for {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
break
|
||||
} else {
|
||||
bfile, _ := ioutil.ReadFile(par1 + strconv.Itoa(i) + par2)
|
||||
coder := base64.StdEncoding.EncodeToString(bfile)
|
||||
ioutil.WriteFile(par1+strconv.Itoa(i)+par2, []byte(coder), 0755)
|
||||
|
||||
}
|
||||
i++
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func DecodeFileByBase64(inputname, outputname string, filesum int) bool {
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(inputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(inputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
if filesum != 0 {
|
||||
for i := 1; i <= filesum; i++ {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var i int
|
||||
for i = 1; ; i++ {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
break
|
||||
}
|
||||
}
|
||||
filesum = i - 1
|
||||
}
|
||||
i := 1
|
||||
big := filesum
|
||||
fpw, _ := os.Create(outputname)
|
||||
defer fpw.Close()
|
||||
for i <= big {
|
||||
bfile, _ := ioutil.ReadFile(par1 + strconv.Itoa(i) + par2)
|
||||
coder, _ := base64.StdEncoding.DecodeString(string(bfile))
|
||||
fpw.Write(coder)
|
||||
i++
|
||||
//time.Sleep(time.Microsecond * 560)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func SlitFile(filename, outputname string, num int, databig, buffer int64) bool {
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(outputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(outputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
if !Exists(filename) {
|
||||
return false
|
||||
}
|
||||
fileinfo, _ := os.Stat(filename)
|
||||
filesize := fileinfo.Size()
|
||||
var spbyte int64
|
||||
if num != 0 {
|
||||
spbyte = filesize / int64(num)
|
||||
}
|
||||
if databig != 0 {
|
||||
spbyte = databig
|
||||
num = int(filesize/spbyte + 1)
|
||||
}
|
||||
if buffer == 0 {
|
||||
buffer = spbyte / 10
|
||||
}
|
||||
if buffer > 100*1024*1024 {
|
||||
buffer = 50 * 1024 * 1024
|
||||
}
|
||||
fp, _ := os.Open(filename)
|
||||
defer fp.Close()
|
||||
data := make([]byte, buffer)
|
||||
var i int64 = 0
|
||||
var k int = 1
|
||||
fpw, _ := os.Create(par1 + strconv.Itoa(k) + par2)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
i += int64(n)
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
if i > spbyte && k < num {
|
||||
fpw.Close()
|
||||
k++
|
||||
i = 1
|
||||
fpw, _ = os.Create(par1 + strconv.Itoa(k) + par2)
|
||||
defer fpw.Close()
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func SpliceFile(inputname, outputname string, num int, buffer int64) bool {
|
||||
rempar := regexp.MustCompile(`(.*)\*(.*)`)
|
||||
if !rempar.Match([]byte(inputname)) {
|
||||
return false
|
||||
}
|
||||
rest := rempar.FindSubmatch([]byte(inputname))
|
||||
par1 := string(rest[1])
|
||||
par2 := string(rest[2])
|
||||
if num != 0 {
|
||||
for i := 1; i <= num; i++ {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var i int
|
||||
for i = 1; ; i++ {
|
||||
if !Exists(par1 + strconv.Itoa(i) + par2) {
|
||||
break
|
||||
}
|
||||
}
|
||||
num = i - 1
|
||||
}
|
||||
fpw, _ := os.Create(outputname)
|
||||
defer fpw.Close()
|
||||
fileinfo, _ := os.Stat(par1 + "1" + par2)
|
||||
filesize := fileinfo.Size()
|
||||
if buffer == 0 {
|
||||
buffer = filesize / 5
|
||||
}
|
||||
if buffer > 1024*1024*100 {
|
||||
buffer = 1024 * 1024 * 100
|
||||
}
|
||||
data := make([]byte, buffer)
|
||||
for i := 1; i <= num; i++ {
|
||||
fp, _ := os.Open(par1 + strconv.Itoa(i) + par2)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
}
|
||||
fp.Close()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func MixFile(filepath, outputname string, buffer int64, remix bool) bool {
|
||||
if !Exists(filepath) || !IsFile(filepath) {
|
||||
return false
|
||||
}
|
||||
fileinfo, _ := os.Stat(filepath)
|
||||
filesize := fileinfo.Size()
|
||||
if buffer == 0 {
|
||||
buffer = filesize / 5
|
||||
}
|
||||
if buffer > 1024*1024*100 {
|
||||
buffer = 1024 * 1024 * 100
|
||||
}
|
||||
var spbyte int64
|
||||
if !remix {
|
||||
spbyte = filesize / 2
|
||||
} else {
|
||||
spbyte = filesize - filesize/2
|
||||
}
|
||||
fpw, _ := os.Create(outputname)
|
||||
defer fpw.Close()
|
||||
fp, _ := os.Open(filepath)
|
||||
defer fp.Close()
|
||||
data := make([]byte, buffer)
|
||||
_, _ = fp.Seek(spbyte, 0)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
}
|
||||
_, _ = fp.Seek(0, 0)
|
||||
i := int64(0)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
i += int64(n)
|
||||
if i < spbyte {
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
} else {
|
||||
data = data[:(int64(n) - i + spbyte)]
|
||||
fpw.Write(data)
|
||||
break
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func Md5File(filepath string) string {
|
||||
f, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
fmt.Println("Open", err)
|
||||
return ""
|
||||
}
|
||||
defer f.Close()
|
||||
md5hash := md5.New()
|
||||
if _, err := io.Copy(md5hash, f); err != nil {
|
||||
fmt.Println("Copy", err)
|
||||
return ""
|
||||
}
|
||||
result := md5hash.Sum(nil)
|
||||
return hex.EncodeToString(result)
|
||||
}
|
||||
|
||||
func Crc32File(filepath string) string {
|
||||
f, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
fmt.Println("Open", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
crchash := crc32.NewIEEE()
|
||||
if _, err := io.Copy(crchash, f); err != nil {
|
||||
fmt.Println("Copy", err)
|
||||
return ""
|
||||
}
|
||||
result := crchash.Sum(nil)
|
||||
return hex.EncodeToString(result)
|
||||
}
|
||||
|
||||
func Sha1File(filepath string) string {
|
||||
f, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
fmt.Println("Open", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
sha1hash := sha1.New()
|
||||
if _, err := io.Copy(sha1hash, f); err != nil {
|
||||
fmt.Println("Copy", err)
|
||||
return ""
|
||||
}
|
||||
result := sha1hash.Sum(nil)
|
||||
return hex.EncodeToString(result)
|
||||
}
|
||||
|
||||
func Sha256File(filepath string) string {
|
||||
f, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
fmt.Println("Open", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
sha256hash := sha256.New()
|
||||
if _, err := io.Copy(sha256hash, f); err != nil {
|
||||
fmt.Println("Copy", err)
|
||||
return ""
|
||||
}
|
||||
result := sha256hash.Sum(nil)
|
||||
return hex.EncodeToString(result)
|
||||
}
|
||||
|
||||
func Sha512File(filepath string) string {
|
||||
f, err := os.Open(filepath)
|
||||
if err != nil {
|
||||
fmt.Println("Open", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
defer f.Close()
|
||||
sha512hash := sha512.New()
|
||||
if _, err := io.Copy(sha512hash, f); err != nil {
|
||||
fmt.Println("Copy", err)
|
||||
return ""
|
||||
}
|
||||
result := sha512hash.Sum(nil)
|
||||
return hex.EncodeToString(result)
|
||||
}
|
||||
|
||||
func RC4File(filepath string, key []byte) string {
|
||||
rc4obj, _ := rc4.NewCipher(key)
|
||||
plain, _ := ioutil.ReadFile(filepath)
|
||||
res := make([]byte, len(plain))
|
||||
rc4obj.XORKeyStream(res, plain)
|
||||
return hex.EncodeToString(res)
|
||||
}
|
||||
func DetachFile(source, output1, output2 string, key int64) bool {
|
||||
if !Exists(source) {
|
||||
return false
|
||||
}
|
||||
fin, _ := os.Stat(source)
|
||||
filesize := fin.Size()
|
||||
fpw, _ := os.Create(output1)
|
||||
fp, _ := os.Open(source)
|
||||
defer fp.Close()
|
||||
buffer := filesize / 10
|
||||
if buffer > 100*1024*1024 {
|
||||
buffer = 100 * 1024 * 1024
|
||||
}
|
||||
data := make([]byte, buffer)
|
||||
i := int64(0)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
i += int64(n)
|
||||
if i < key {
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
} else {
|
||||
data = data[:(int64(n) - i + key)]
|
||||
fpw.Write(data)
|
||||
break
|
||||
}
|
||||
}
|
||||
fpw.Close()
|
||||
_, _ = fp.Seek(key+20, 0)
|
||||
fpw, _ = os.Create(output2)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
}
|
||||
return true
|
||||
}
|
||||
func AttachFile(source, target, output string) (bool, string) {
|
||||
if !Exists(source) {
|
||||
return false, ""
|
||||
}
|
||||
if !Exists(target) {
|
||||
return false, ""
|
||||
}
|
||||
fin, _ := os.Stat(source)
|
||||
filesize := fin.Size()
|
||||
_ = ioutil.WriteFile(output+".ini", []byte(strconv.FormatInt(filesize, 10)), 0755)
|
||||
fpw, _ := os.Create(output)
|
||||
defer fpw.Close()
|
||||
fp, _ := os.Open(source)
|
||||
buffer := filesize / 10
|
||||
if buffer > 100*1024*1024 {
|
||||
buffer = 100 * 1024 * 1024
|
||||
}
|
||||
data := make([]byte, buffer)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
}
|
||||
fp.Close()
|
||||
fpw.Write([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
|
||||
fin, _ = os.Stat(target)
|
||||
filesize2 := fin.Size()
|
||||
fp, _ = os.Open(target)
|
||||
buffer = filesize2 / 10
|
||||
if buffer > 100*1024*1024 {
|
||||
buffer = 100 * 1024 * 1024
|
||||
}
|
||||
data = make([]byte, buffer)
|
||||
for {
|
||||
data = data[:cap(data)]
|
||||
// read bytes to slice
|
||||
n, err := fp.Read(data)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
fmt.Println(err)
|
||||
break
|
||||
}
|
||||
data = data[:n]
|
||||
fpw.Write(data)
|
||||
}
|
||||
fp.Close()
|
||||
return true, strconv.FormatInt(filesize, 10)
|
||||
}
|
Loading…
Reference in New Issue