diff --git a/Util/XBase64.go b/Util/XBase64.go new file mode 100644 index 0000000..e0220f6 --- /dev/null +++ b/Util/XBase64.go @@ -0,0 +1,43 @@ +package Util + +import ( + "fmt" + "os" +) + +func getbyte(a byte)int{ + x := int(a) + if x > 255 { + fmt.Println("INVALID_CHARACTER_ERR: DOM Exception 5") + os.Exit(3) + } + return x +} + +func Base64(s []byte)string{ + const ALPHA = "LVoJPiCN2R8G90yg+hmFHuacZ1OWMnrsSTXkYpUq/3dlbfKwv6xztjI7DeBE45QA" + const PADCHAR = "=" + i:=0 + b10:=0 + var x []byte + imax:=len(s)-len(s)%3 + if len(s)==0{ + return "" + } + for i:=0;i>18)]) + x=append(x,ALPHA[((b10 >> 12) & 63)]) + x=append(x,ALPHA[((b10 >> 6) & 63)]) + x=append(x,ALPHA[(b10 & 63)]) + } + i=imax + if len(s)-imax==1{ + b10=getbyte(s[i])<<16 + x=append(x,ALPHA[(b10 >> 18)],ALPHA[((b10 >> 12) & 63)],PADCHAR[0],PADCHAR[0]) + }else if len(s)-imax ==2{ + b10=(getbyte(s[i])<<16)|(getbyte(s[i+1])<<8) + x=append(x,ALPHA[(b10 >> 18)],ALPHA[((b10 >> 12) & 63)],ALPHA[((b10 >> 6) & 63)],PADCHAR[0]) + } + return string(x) +} \ No newline at end of file diff --git a/Util/Xencode.go b/Util/Xencode.go index 455e52e..9e63c27 100644 --- a/Util/Xencode.go +++ b/Util/Xencode.go @@ -4,16 +4,16 @@ import ( "math" ) -func ordat(msg string, idx int) byte { +func ordat(msg string, idx int) uint32 { if len(msg) > idx { - return []byte(msg)[idx] + return uint32([]byte(msg)[idx]) } - return byte(0) + return 0 } -func sensCode(content string, key bool) []byte { +func sensCode(content string, key bool) []uint32 { l := len(content) - pwd := make([]byte, 0) + pwd := make([]uint32, 0) for i := 0; i < l; i += 4 { pwd = append( pwd, @@ -21,28 +21,29 @@ func sensCode(content string, key bool) []byte { ) } if key { - pwd = append(pwd, byte(l)) + pwd = append(pwd, uint32(l)) } return pwd } -func lenCode(msg []byte, key bool) []byte { - l := len(msg) +func lenCode(msg []uint32, key bool) []byte { + l := uint32(len(msg)) ll := (l - 1) << 2 if key { - m := int(msg[l-1]) + m := msg[l-1] if m < ll-3 || m > ll { return nil } ll = m } + var t []byte for i := range msg { - msg[i] = byte(int(msg[i])&0xff) + byte(int(msg[i])>>8&0xff) + byte(int(msg[i])>>16&0xff) + byte(int(msg[i])>>24&0xff) + t = append(t, byte(msg[i]&0xff),byte(msg[i]>>8&0xff),byte(msg[i]>>16&0xff),byte(msg[i]>>24&0xff)) } if key { - return msg[0:ll] + return t[0:ll] } - return msg + return t } func XEncode(content string, key string) []byte { @@ -53,36 +54,36 @@ func XEncode(content string, key string) []byte { pwdk := sensCode(key, false) if len(pwdk) < 4 { for i := 0; i < (4 - len(pwdk)); i++ { - pwdk = append(pwdk, byte(0)) + pwdk = append(pwdk, 0) } } - n := len(pwd) - 1 + var n = uint32(len(pwd) - 1) z := pwd[n] y := pwd[0] - c := 0x86014019 | 0x183639A0 - m := 0 - e := 0 - p := 0 + var c uint32 = 0x86014019 | 0x183639A0 + var m uint32 = 0 + var e uint32 = 0 + var p uint32 = 0 q := math.Floor(6 + 52/(float64(n)+1)) - d := 0 + var d uint32 = 0 for 0 < q { d = d + c&(0x8CE0D9BF|0x731F2640) e = d >> 2 & 3 p = 0 for p < n { y = pwd[p+1] - m = int(z)>>5 ^ int(y)<<2 - m = m + ((int(y)>>3 ^ int(z)<<4) ^ (d ^ int(y))) - m = m + (int(pwdk[(p&3)^e]) ^ int(z)) - pwd[p] = byte(int(pwd[p]) + m&(0xEFB8D130|0x10472ECF)) + m = z>>5 ^ y<<2 + m = m + ((y>>3 ^ z<<4) ^ (d ^ y)) + m = m + (pwdk[(p&3)^e] ^ z) + pwd[p] = pwd[p] + m&(0xEFB8D130|0x10472ECF) z = pwd[p] p = p + 1 } y = pwd[0] - m = int(z)>>5 ^ int(y)<<2 - m = m + ((int(y)>>3 ^ int(z)<<4) ^ (int(d) ^ int(y))) - m = m + (int(pwdk[(p&3)^e]) ^ int(z)) - pwd[n] = byte(int(pwd[n]) + m&(0xBB390742|0x44C6F8BD)) + m = z>>5 ^ y<<2 + m = m + ((y>>3 ^ z<<4) ^ (d ^ y)) + m = m + (pwdk[(p&3)^e] ^ z) + pwd[n] = pwd[n] + m&(0xBB390742|0x44C6F8BD) z = pwd[n] q = q - 1 } diff --git a/Util/util.go b/Util/util.go index 0678e60..52d0736 100644 --- a/Util/util.go +++ b/Util/util.go @@ -26,11 +26,11 @@ func GetIp(body string) (string, error) { } func GetToken(body string) (string, error) { - return Search(body, "\"challenge\":\"(.*?)\"") + return Search("\"challenge\":\"(.*?)\"",body) } func GetResult(body string)(string,error){ - return Search(body,"\"error_msg\":\"(.+)\"") + return Search("\"error\":\"(.+?)\"",body) } func Md5(content string) string { diff --git a/main.go b/main.go index e6af030..ab54a12 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,6 @@ package main import ( "Mmx/Request" "Mmx/Util" - "encoding/base64" "encoding/json" "fmt" "os" @@ -52,15 +51,16 @@ func Generate(Domain string, Username string, Password string) *LoginInfo { func ErrHandler(err error) { if err != nil { defer os.Exit(3) + fmt.Println("Error") panic(err) } } func main() { G := Generate( - "", - "", - "", + "", //登录地址域名或ip + "", //账号 + "", //密码 ) fmt.Println("Step1: Get local ip returned from srun server.") { @@ -90,7 +90,7 @@ func main() { "enc_ver": G.Enc, }) ErrHandler(err) - G.EncryptedInfo = "{SRBX1}" + base64.StdEncoding.EncodeToString(Util.XEncode(string(info), G.Token)) + G.EncryptedInfo = "{SRBX1}" + Util.Base64(Util.XEncode(string(info), G.Token)) G.Md5=Util.Md5(G.Token) G.EncryptedMd5 = "{MD5}"+G.Md5 @@ -115,7 +115,7 @@ func main() { "chksum": G.EncryptedChkstr, "n": G.N, "type": G.VType, - "os": "Windows+10", + "os": "Windows 10", "name": "windows", "double_stack": "0", "_": "1602812428675", @@ -124,6 +124,5 @@ func main() { G.LoginResult,err=Util.GetResult(res) ErrHandler(err) } - fmt.Println("The loggin result is: " + G.LoginResult) }