1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-03 18:47:41 +08:00

perf(writer): drop some lambda expressions (#224)

* perf(writer): drop some lambda expressions

* perf(writer): drop more lambda expressions

* fix: resolve conflicts

* perf(writer): drop more lambda expressions

* fix: modify function name

* perf(writer): drop more lambda expressions

* fix: some error
This commit is contained in:
源文雨 2021-12-23 21:04:15 +08:00 committed by GitHub
parent 24b75e45c7
commit b1279cf08f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 359 additions and 336 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.idea
vendor/
.DS_Store

View File

@ -26,7 +26,7 @@ func SelectWriter() *Writer {
func PutWriter(w *Writer) {
// See https://golang.org/issue/23199
const maxSize = 1 << 16
if w.Cap() < maxSize { // 对于大Buffer直接丢弃
if (*bytes.Buffer)(w).Cap() < maxSize { // 对于大Buffer直接丢弃
w.Reset()
bufferPool.Put(w)
}

View File

@ -4,8 +4,6 @@ import (
"bytes"
"encoding/binary"
"encoding/hex"
"github.com/Mrs4s/MiraiGo/utils"
)
// Writer 写入
@ -15,7 +13,7 @@ func NewWriterF(f func(writer *Writer)) []byte {
w := SelectWriter()
f(w)
b := append([]byte(nil), w.Bytes()...)
PutWriter(w)
w.put()
return b
}
@ -23,7 +21,40 @@ func NewWriterF(f func(writer *Writer)) []byte {
func OpenWriterF(f func(*Writer)) (b []byte, cl func()) {
w := SelectWriter()
f(w)
return w.Bytes(), func() { PutWriter(w) }
return w.Bytes(), w.put
}
func (w *Writer) AllocUInt16Head() (pos int) {
pos = (*bytes.Buffer)(w).Len()
(*bytes.Buffer)(w).Write([]byte{0, 0})
return
}
/*
func (w *Writer) WriteUInt16HeadAt(pos int) {
newdata := (*bytes.Buffer)(w).Bytes()[pos:]
binary.BigEndian.PutUint16(newdata, uint16(len(newdata)))
}
*/
func (w *Writer) WriteUInt16HeadUsingTotalBufferLenAt(pos int) {
binary.BigEndian.PutUint16((*bytes.Buffer)(w).Bytes()[pos:], uint16((*bytes.Buffer)(w).Len()))
}
func (w *Writer) WriteUInt16HeadExcludeSelfAt(pos int) {
newdata := (*bytes.Buffer)(w).Bytes()[pos:]
binary.BigEndian.PutUint16(newdata, uint16(len(newdata)-2))
}
func (w *Writer) AllocUInt32Head() (pos int) {
pos = (*bytes.Buffer)(w).Len()
(*bytes.Buffer)(w).Write([]byte{0, 0, 0, 0})
return
}
func (w *Writer) WriteUInt32HeadAt(pos int) {
newdata := (*bytes.Buffer)(w).Bytes()[pos:]
binary.BigEndian.PutUint32(newdata, uint32(len(newdata)))
}
func (w *Writer) Write(b []byte) {
@ -35,8 +66,8 @@ func (w *Writer) WriteHex(h string) {
w.Write(b)
}
func (w *Writer) WriteByte(b byte) {
(*bytes.Buffer)(w).WriteByte(b)
func (w *Writer) WriteByte(b byte) error {
return (*bytes.Buffer)(w).WriteByte(b)
}
func (w *Writer) WriteUInt16(v uint16) {
@ -58,13 +89,13 @@ func (w *Writer) WriteUInt64(v uint64) {
}
func (w *Writer) WriteString(v string) {
payload := utils.S2B(v)
w.WriteUInt32(uint32(len(payload) + 4))
w.Write(payload)
w.WriteUInt32(uint32(len(v) + 4))
(*bytes.Buffer)(w).WriteString(v)
}
func (w *Writer) WriteStringShort(v string) {
w.WriteBytesShort(utils.S2B(v))
w.WriteUInt16(uint16(len(v)))
(*bytes.Buffer)(w).WriteString(v)
}
func (w *Writer) WriteBool(b bool) {
@ -86,27 +117,6 @@ func (w *Writer) WriteIntLvPacket(offset int, f func(*Writer)) {
cl()
}
func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) {
w1 := SelectWriter()
{ // WriteIntLvPacket
w1.WriteString(commandName)
w1.WriteUInt32(8)
w1.Write(sessionId)
if len(extraData) == 0 {
w1.WriteUInt32(0x04)
} else {
w1.WriteUInt32(uint32(len(extraData) + 4))
w1.Write(extraData)
}
}
data := w1.Bytes()
w.WriteUInt32(uint32(len(data) + 4))
w.Write(data)
PutWriter(w1)
w.WriteUInt32(uint32(len(body) + 4)) // WriteIntLvPacket
w.Write(body)
}
func (w *Writer) WriteBytesShort(data []byte) {
w.WriteUInt16(uint16(len(data)))
w.Write(data)
@ -124,10 +134,6 @@ func (w *Writer) Bytes() []byte {
return (*bytes.Buffer)(w).Bytes()
}
func (w *Writer) Cap() int {
return (*bytes.Buffer)(w).Cap()
}
func (w *Writer) Reset() {
(*bytes.Buffer)(w).Reset()
}
@ -135,3 +141,7 @@ func (w *Writer) Reset() {
func (w *Writer) Grow(n int) {
(*bytes.Buffer)(w).Grow(n)
}
func (w *Writer) put() {
PutWriter(w)
}

View File

@ -1097,12 +1097,7 @@ func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool)
b, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(groupCode))
w.WriteUInt32(uint32(member))
w.WriteByte(func() byte {
if flag {
return 1
}
return 0
}())
w.WriteBool(flag)
})
payload := c.packOIDBPackage(1372, 1, b)
cl()

View File

@ -19,9 +19,7 @@ type Transport struct {
// conn *TCPListener
}
func (t *Transport) packBody(req *Request) []byte {
w := binary.SelectWriter()
defer binary.PutWriter(w)
func (t *Transport) packBody(req *Request, w *binary.Writer) {
w.WriteIntLvPacket(4, func(writer *binary.Writer) {
if req.Type == RequestTypeLogin {
writer.WriteUInt32(uint32(req.SequenceID))
@ -58,7 +56,6 @@ func (t *Transport) packBody(req *Request) []byte {
})
// w.WriteUInt32(uint32(len(req.Body) + 4))
// w.Write(req.Body)
return append([]byte(nil), w.Bytes()...)
}
// PackPacket packs a packet.
@ -67,16 +64,10 @@ func (t *Transport) PackPacket(req *Request) []byte {
if len(t.Sig.D2) == 0 {
req.EncryptType = EncryptTypeEmptyKey
}
body := t.packBody(req)
// encrypt body
switch req.EncryptType {
case EncryptTypeD2Key:
body = binary.NewTeaCipher(t.Sig.D2Key).Encrypt(body)
case EncryptTypeEmptyKey:
body = binary.NewTeaCipher(emptyKey).Encrypt(body)
}
head := binary.NewWriterF(func(w *binary.Writer) {
return binary.NewWriterF(func(w *binary.Writer) {
pos := w.AllocUInt32Head()
// vvv w.Write(head) vvv
w.WriteUInt32(uint32(req.Type))
w.WriteByte(byte(req.EncryptType))
switch req.Type {
@ -93,14 +84,24 @@ func (t *Transport) PackPacket(req *Request) []byte {
}
w.WriteByte(0x00)
w.WriteString(strconv.FormatInt(req.Uin, 10))
// ^^^ w.Write(head) ^^^
w.Write(binary.NewWriterF(func(w *binary.Writer) {
// encrypt body
switch req.EncryptType {
case EncryptTypeD2Key:
wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) })
w.EncryptAndWrite(t.Sig.D2Key, wt)
cl()
case EncryptTypeEmptyKey:
wt, cl := binary.OpenWriterF(func(w *binary.Writer) { t.packBody(req, w) })
w.EncryptAndWrite(emptyKey, wt)
cl()
default:
t.packBody(req, w)
}
}))
w.WriteUInt32HeadAt(pos)
})
w := binary.SelectWriter()
defer binary.PutWriter(w)
w.WriteUInt32(uint32(len(head)+len(body)) + 4)
w.Write(head)
w.Write(body)
return append([]byte(nil), w.Bytes()...) // copy
}
func (t *Transport) parse(head []byte) *Request {

View File

@ -111,7 +111,13 @@ func (c *QQClient) decodeT119(data, ek []byte) {
s.PsKeyMap = psKeyMap
s.Pt4TokenMap = pt4TokenMap
if len(c.PasswordMd5[:]) > 0 {
key := md5.Sum(append(append(c.PasswordMd5[:], []byte{0x00, 0x00, 0x00, 0x00}...), binary.NewWriterF(func(w *binary.Writer) { w.WriteUInt32(uint32(c.Uin)) })...))
data, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.Write(c.PasswordMd5[:])
w.WriteUInt32(0) // []byte{0x00, 0x00, 0x00, 0x00}...
w.WriteUInt32(uint32(c.Uin))
})
key := md5.Sum(data)
cl()
decrypted := binary.NewTeaCipher(key[:]).Decrypt(c.sig.EncryptedA1)
if len(decrypted) > 51+16 {
dr := binary.NewReader(decrypted)

View File

@ -31,9 +31,8 @@ type IncomingPacket struct {
func BuildCode2DRequestPacket(seq uint32, j uint64, cmd uint16, bodyFunc func(writer *binary.Writer)) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
body := binary.NewWriterF(bodyFunc)
w.WriteByte(2)
w.WriteUInt16(uint16(43 + len(body) + 1))
pos := w.AllocUInt16Head()
w.WriteUInt16(cmd)
w.Write(make([]byte, 21))
w.WriteByte(3)
@ -41,8 +40,9 @@ func BuildCode2DRequestPacket(seq uint32, j uint64, cmd uint16, bodyFunc func(wr
w.WriteUInt16(50) // version
w.WriteUInt32(seq)
w.WriteUInt64(j)
w.Write(body)
bodyFunc(w)
w.WriteByte(3)
w.WriteUInt16HeadUsingTotalBufferLenAt(pos)
})
}

View File

@ -13,13 +13,13 @@ func T1(uin uint32, ip []byte) []byte {
}
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x01)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(uin)
w.WriteUInt32(uint32(time.Now().UnixNano() / 1e6))
w.Write(ip)
w.WriteUInt16(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(1)
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(uin)
w.WriteUInt32(uint32(time.Now().UnixNano() / 1e6))
w.Write(ip)
w.WriteUInt16(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -7,13 +7,13 @@ import (
func T100(ssoVersion, protocol, mainSigMap uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x100)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.WriteUInt32(ssoVersion)
w.WriteUInt32(16)
w.WriteUInt32(protocol)
w.WriteUInt32(0) // App client version
w.WriteUInt32(mainSigMap) // 34869472
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(1)
w.WriteUInt32(ssoVersion)
w.WriteUInt32(16)
w.WriteUInt32(protocol)
w.WriteUInt32(0) // App client version
w.WriteUInt32(mainSigMap) // 34869472
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -2,7 +2,6 @@ package tlv
import (
"crypto/md5"
binary2 "encoding/binary"
"math/rand"
"strconv"
"time"
@ -13,7 +12,19 @@ import (
func T106(uin, salt, appId, ssoVer uint32, passwordMd5 [16]byte, guidAvailable bool, guid, tgtgtKey []byte, wtf uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x106)
body := binary.NewWriterF(func(w *binary.Writer) {
pos := w.AllocUInt16Head()
keydata, kcl := binary.OpenWriterF(func(w *binary.Writer) {
w.Write(passwordMd5[:])
w.WriteUInt32(0) // []byte{0x00, 0x00, 0x00, 0x00}...
if salt != 0 {
w.WriteUInt32(salt)
} else {
w.WriteUInt32(uin)
}
})
key := md5.Sum(keydata)
kcl()
body, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt16(4)
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(ssoVer)
@ -25,33 +36,27 @@ func T106(uin, salt, appId, ssoVer uint32, passwordMd5 [16]byte, guidAvailable b
w.WriteUInt64(uint64(uin))
}
w.WriteUInt32(uint32(time.Now().UnixNano() / 1e6))
w.Write([]byte{0x00, 0x00, 0x00, 0x00}) // fake ip
w.WriteUInt32(0) // fake ip w.Write([]byte{0x00, 0x00, 0x00, 0x00})
w.WriteByte(0x01)
w.Write(passwordMd5[:])
w.Write(tgtgtKey)
w.WriteUInt32(wtf)
w.WriteBool(guidAvailable)
if len(guid) == 0 {
for i := 0; i < 4; i++ {
w.WriteUInt32(rand.Uint32())
}
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(rand.Uint32())
w.WriteUInt32(rand.Uint32())
} else {
w.Write(guid)
}
w.WriteUInt32(appId)
w.WriteUInt32(1) // password login
w.WriteBytesShort([]byte(strconv.FormatInt(int64(uin), 10)))
w.WriteStringShort(strconv.FormatInt(int64(uin), 10))
w.WriteUInt16(0)
})
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
b := make([]byte, 4)
if salt != 0 {
binary2.BigEndian.PutUint32(b, salt)
} else {
binary2.BigEndian.PutUint32(b, uin)
}
key := md5.Sum(append(append(passwordMd5[:], []byte{0x00, 0x00, 0x00, 0x00}...), b...))
w.EncryptAndWrite(key[:], body)
}))
w.EncryptAndWrite(key[:], body)
w.WriteUInt16HeadExcludeSelfAt(pos)
cl()
})
}

View File

@ -5,11 +5,11 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T107(picType uint16) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x107)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(picType)
w.WriteByte(0x00)
w.WriteUInt16(0)
w.WriteByte(0x01)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(picType)
w.WriteByte(0x00)
w.WriteUInt16(0)
w.WriteByte(0x01)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -9,9 +9,9 @@ import (
func T109(androidId []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x109)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
h := md5.Sum(androidId)
w.Write(h[:])
}))
pos := w.AllocUInt16Head()
h := md5.Sum(androidId)
w.Write(h[:])
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,12 +5,12 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T116(miscBitmap, subSigMap uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x116)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(0x00)
w.WriteUInt32(miscBitmap)
w.WriteUInt32(subSigMap)
w.WriteByte(0x01)
w.WriteUInt32(1600000226) // app id list
}))
pos := w.AllocUInt16Head()
w.WriteByte(0x00)
w.WriteUInt32(miscBitmap)
w.WriteUInt32(subSigMap)
w.WriteByte(0x01)
w.WriteUInt32(1600000226) // app id list
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,13 +5,13 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T124(osType, osVersion, simInfo, apn []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x124)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteTlvLimitedSize(osType, 16)
w.WriteTlvLimitedSize(osVersion, 16)
w.WriteUInt16(2) // Network type wifi
w.WriteTlvLimitedSize(simInfo, 16)
w.WriteTlvLimitedSize([]byte{}, 16)
w.WriteTlvLimitedSize(apn, 16)
}))
pos := w.AllocUInt16Head()
w.WriteTlvLimitedSize(osType, 16)
w.WriteTlvLimitedSize(osVersion, 16)
w.WriteUInt16(2) // Network type wifi
w.WriteTlvLimitedSize(simInfo, 16)
w.WriteTlvLimitedSize([]byte{}, 16)
w.WriteTlvLimitedSize(apn, 16)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,15 +5,15 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T128(isGuidFromFileNull, isGuidAvailable, isGuidChanged bool, guidFlag uint32, buildModel, guid, buildBrand []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x128)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0)
w.WriteBool(isGuidFromFileNull)
w.WriteBool(isGuidAvailable)
w.WriteBool(isGuidChanged)
w.WriteUInt32(guidFlag)
w.WriteTlvLimitedSize(buildModel, 32)
w.WriteTlvLimitedSize(guid, 16)
w.WriteTlvLimitedSize(buildBrand, 16)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(0)
w.WriteBool(isGuidFromFileNull)
w.WriteBool(isGuidAvailable)
w.WriteBool(isGuidChanged)
w.WriteUInt32(guidFlag)
w.WriteTlvLimitedSize(buildModel, 32)
w.WriteTlvLimitedSize(guid, 16)
w.WriteTlvLimitedSize(buildBrand, 16)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,11 +5,11 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T141(simInfo, apn []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x141)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.WriteBytesShort(simInfo)
w.WriteUInt16(2) // network type wifi
w.WriteBytesShort(apn)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(1)
w.WriteBytesShort(simInfo)
w.WriteUInt16(2) // network type wifi
w.WriteBytesShort(apn)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,9 +5,9 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T142(apkId string) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x142)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0)
w.WriteTlvLimitedSize([]byte(apkId), 32)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(0)
w.WriteTlvLimitedSize([]byte(apkId), 32)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -12,15 +12,15 @@ func T144(
) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x144)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.EncryptAndWrite(tgtgtKey, binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(5)
w.Write(T109(imei))
w.Write(T52D(devInfo))
w.Write(T124(osType, osVersion, simInfo, apn))
w.Write(T128(isGuidFromFileNull, isGuidAvailable, isGuidChanged, guidFlag, buildModel, guid, buildBrand))
w.Write(T16E(buildModel))
}))
pos := w.AllocUInt16Head()
w.EncryptAndWrite(tgtgtKey, binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(5)
w.Write(T109(imei))
w.Write(T52D(devInfo))
w.Write(T124(osType, osVersion, simInfo, apn))
w.Write(T128(isGuidFromFileNull, isGuidAvailable, isGuidChanged, guidFlag, buildModel, guid, buildBrand))
w.Write(T16E(buildModel))
}))
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T145(guid []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x145)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write(guid)
}))
pos := w.AllocUInt16Head()
w.Write(guid)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,10 +5,10 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T147(appId uint32, apkVersionName, apkSignatureMd5 []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x147)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(appId)
w.WriteTlvLimitedSize(apkVersionName, 32)
w.WriteTlvLimitedSize(apkSignatureMd5, 32)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(appId)
w.WriteTlvLimitedSize(apkVersionName, 32)
w.WriteTlvLimitedSize(apkSignatureMd5, 32)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T154(seq uint16) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x154)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(seq))
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(uint32(seq))
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,14 +5,14 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T16(ssoVersion, appId, subAppId uint32, guid, apkId, apkVersionName, apkSign []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x16)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(ssoVersion)
w.WriteUInt32(appId)
w.WriteUInt32(subAppId)
w.Write(guid)
w.WriteBytesShort(apkId)
w.WriteBytesShort(apkVersionName)
w.WriteBytesShort(apkSign)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(ssoVersion)
w.WriteUInt32(appId)
w.WriteUInt32(subAppId)
w.Write(guid)
w.WriteBytesShort(apkId)
w.WriteBytesShort(apkVersionName)
w.WriteBytesShort(apkSign)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T166(imageType byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x166)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(imageType)
}))
pos := w.AllocUInt16Head()
w.WriteByte(imageType)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T16E(buildModel []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x16e)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write(buildModel)
}))
pos := w.AllocUInt16Head()
w.Write(buildModel)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,10 +5,10 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T177(buildTime uint32, sdkVersion string) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x177)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(0x01)
w.WriteUInt32(buildTime)
w.WriteBytesShort([]byte(sdkVersion))
}))
pos := w.AllocUInt16Head()
w.WriteByte(0x01)
w.WriteUInt32(buildTime)
w.WriteStringShort(sdkVersion)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T17A(value int32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x17a)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(value))
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(uint32(value))
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T17C(code string) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x17c)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteStringShort(code)
}))
pos := w.AllocUInt16Head()
w.WriteStringShort(code)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,14 +5,14 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T18(appId uint32, uin uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x18)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.WriteUInt32(1536)
w.WriteUInt32(appId)
w.WriteUInt32(0)
w.WriteUInt32(uin)
w.WriteUInt16(0)
w.WriteUInt16(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(1)
w.WriteUInt32(1536)
w.WriteUInt32(appId)
w.WriteUInt32(0)
w.WriteUInt32(uin)
w.WriteUInt16(0)
w.WriteUInt16(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -9,9 +9,9 @@ import (
func T187(macAddress []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x187)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
h := md5.Sum(macAddress)
w.Write(h[:])
}))
pos := w.AllocUInt16Head()
h := md5.Sum(macAddress)
w.Write(h[:])
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -9,9 +9,9 @@ import (
func T188(androidId []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x188)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
h := md5.Sum(androidId)
w.Write(h[:])
}))
pos := w.AllocUInt16Head()
h := md5.Sum(androidId)
w.Write(h[:])
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T191(k byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x191)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(k)
}))
pos := w.AllocUInt16Head()
w.WriteByte(k)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T193(ticket string) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x193)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write([]byte(ticket))
}))
pos := w.AllocUInt16Head()
w.Write([]byte(ticket))
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T194(imsiMd5 []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x194)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write(imsiMd5)
}))
pos := w.AllocUInt16Head()
w.Write(imsiMd5)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,6 +5,6 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T197() []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x197)
w.WriteBytesShort([]byte{0})
w.Write([]byte{0, 1, 0}) // w.WriteBytesShort([]byte{0})
})
}

View File

@ -5,6 +5,6 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T198() []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x198)
w.WriteBytesShort([]byte{0})
w.Write([]byte{0, 1, 0}) // w.WriteBytesShort([]byte{0})
})
}

View File

@ -5,15 +5,15 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T1B(micro, version, size, margin, dpi, ecLevel, hint uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x1B)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(micro)
w.WriteUInt32(version)
w.WriteUInt32(size)
w.WriteUInt32(margin)
w.WriteUInt32(dpi)
w.WriteUInt32(ecLevel)
w.WriteUInt32(hint)
w.WriteUInt16(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(micro)
w.WriteUInt32(version)
w.WriteUInt32(size)
w.WriteUInt32(margin)
w.WriteUInt32(dpi)
w.WriteUInt32(ecLevel)
w.WriteUInt32(hint)
w.WriteUInt16(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,12 +5,12 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T1D(miscBitmap uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x1D)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(1)
w.WriteUInt32(miscBitmap)
w.WriteUInt32(0)
w.WriteByte(0)
w.WriteUInt32(0)
}))
pos := w.AllocUInt16Head()
w.WriteByte(1)
w.WriteUInt32(miscBitmap)
w.WriteUInt32(0)
w.WriteByte(0)
w.WriteUInt32(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,20 +5,14 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T1F(isRoot bool, osName, osVersion, simOperatorName, apn []byte, networkType uint16) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x1F)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteByte(func() byte {
if isRoot {
return 1
} else {
return 0
}
}())
w.WriteBytesShort(osName)
w.WriteBytesShort(osVersion)
w.WriteUInt16(networkType)
w.WriteBytesShort(simOperatorName)
w.WriteBytesShort([]byte{})
w.WriteBytesShort(apn)
}))
pos := w.AllocUInt16Head()
w.WriteBool(isRoot)
w.WriteBytesShort(osName)
w.WriteBytesShort(osVersion)
w.WriteUInt16(networkType)
w.WriteBytesShort(simOperatorName)
w.WriteUInt16(0) // w.WriteBytesShort([]byte{})
w.WriteBytesShort(apn)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,10 +5,10 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T2(result string, sign []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x02)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0)
w.WriteStringShort(result)
w.WriteBytesShort(sign)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(0)
w.WriteStringShort(result)
w.WriteBytesShort(sign)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,9 +5,9 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T202(wifiBSSID, wifiSSID []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x202)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteTlvLimitedSize(wifiBSSID, 16)
w.WriteTlvLimitedSize(wifiSSID, 32)
}))
pos := w.AllocUInt16Head()
w.WriteTlvLimitedSize(wifiBSSID, 16)
w.WriteTlvLimitedSize(wifiSSID, 32)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T35(productType uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x35)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(productType)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(productType)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -9,17 +9,17 @@ import (
func T400(g []byte, uin int64, guid, dpwd []byte, j2, j3 int64, randSeed []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x400)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.EncryptAndWrite(g, binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1) // version
w.WriteUInt64(uint64(uin))
w.Write(guid)
w.Write(dpwd)
w.WriteUInt32(uint32(j2))
w.WriteUInt32(uint32(j3))
w.WriteUInt32(uint32(time.Now().Unix()))
w.Write(randSeed)
}))
pos := w.AllocUInt16Head()
w.EncryptAndWrite(g, binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1) // version
w.WriteUInt64(uint64(uin))
w.Write(guid)
w.Write(dpwd)
w.WriteUInt32(uint32(j2))
w.WriteUInt32(uint32(j3))
w.WriteUInt32(uint32(time.Now().Unix()))
w.Write(randSeed)
}))
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -1,53 +1,64 @@
package tlv
import (
"strconv"
"strings"
"github.com/Mrs4s/MiraiGo/binary"
)
func T511(domains []string) []byte {
var arr2 []string
for _, d := range domains {
if d != "" {
arr2 = append(arr2, d)
nonnildomains := domains
// 目前的所有调用均无 ""
/*
hasnil := false
for _, d := range domains {
if d == "" {
hasnil = true
break
}
}
}
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x511)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(uint16(len(arr2)))
for _, d := range arr2 {
indexOf := strings.Index(d, "(")
indexOf2 := strings.Index(d, ")")
if indexOf != 0 || indexOf2 <= 0 {
w.WriteByte(0x01)
w.WriteBytesShort([]byte(d))
} else {
var b byte
var z bool
i, err := strconv.Atoi(d[indexOf+1 : indexOf2])
if err == nil {
z2 := (1048576 & i) > 0
if (i & 134217728) > 0 {
z = true
} else {
z = false
}
if z2 {
b = 1
} else {
b = 0
}
if z {
b |= 2
}
w.WriteByte(b)
w.WriteBytesShort([]byte(d[indexOf2+1:]))
}
if hasnil {
nonnildomains = nonnildomains[:0]
for _, d := range domains {
if d != "" {
nonnildomains = append(nonnildomains, d)
}
}
}))
}
*/
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x511)
pos := w.AllocUInt16Head()
w.WriteUInt16(uint16(len(nonnildomains)))
for _, d := range nonnildomains {
// 目前的所有调用均不会出现 ()
// indexOf := strings.Index(d, "(")
// indexOf2 := strings.Index(d, ")")
// if indexOf != 0 || indexOf2 <= 0 {
w.WriteByte(0x01)
w.WriteStringShort(d)
/* } else {
var b byte
var z bool
i, err := strconv.Atoi(d[indexOf+1 : indexOf2])
if err == nil {
z2 := (1048576 & i) > 0
if (i & 134217728) > 0 {
z = true
} else {
z = false
}
if z2 {
b = 1
} else {
b = 0
}
if z {
b |= 2
}
w.WriteByte(b)
w.WriteBytesShort([]byte(d[indexOf2+1:]))
}
}*/
}
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T516() []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x516)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,9 +5,9 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T521(i uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x521)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt32(i)
w.WriteUInt16(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt32(i)
w.WriteUInt16(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,9 +5,9 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T525(t536 []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x525)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.Write(t536)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(1)
w.Write(t536)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T52D(devInfo []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x52d)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write(devInfo)
}))
pos := w.AllocUInt16Head()
w.Write(devInfo)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,8 +5,8 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T536(loginExtraData []byte) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x536)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.Write(loginExtraData)
}))
pos := w.AllocUInt16Head()
w.Write(loginExtraData)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}

View File

@ -5,10 +5,10 @@ import "github.com/Mrs4s/MiraiGo/binary"
func T8(localId uint32) []byte {
return binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x8)
w.WriteBytesShort(binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(0)
w.WriteUInt32(localId)
w.WriteUInt16(0)
}))
pos := w.AllocUInt16Head()
w.WriteUInt16(0)
w.WriteUInt32(localId)
w.WriteUInt16(0)
w.WriteUInt16HeadExcludeSelfAt(pos)
})
}