diff --git a/client/internal/network/transport.go b/client/internal/network/transport.go index 380155cc..004ed758 100644 --- a/client/internal/network/transport.go +++ b/client/internal/network/transport.go @@ -5,6 +5,10 @@ import ( "github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/client/internal/auth" + "github.com/Mrs4s/MiraiGo/client/pb" + "github.com/Mrs4s/MiraiGo/internal/proto" + "github.com/Mrs4s/MiraiGo/wrapper" + "github.com/pkg/errors" ) // Transport is a network transport. @@ -41,6 +45,15 @@ func (t *Transport) packBody(req *Request, w *binary.Writer) { w.WriteUInt16(uint16(len(t.Sig.Ksid)) + 2) w.Write(t.Sig.Ksid) + + secSign := t.PackSecSign(req) + w.WriteUInt32(uint32(len(secSign) + 4)) + w.Write(secSign) + } + if wrapper.AllowSignSendMsg() && req.CommandName == "MessageSvc.PbSendMsg" { + secSign := t.PackSecSign(req) + w.WriteUInt32(uint32(len(secSign) + 4)) + w.Write(secSign) } w.WriteUInt32(0x04 + uint32(len(t.Device.QImei16))) @@ -52,6 +65,34 @@ func (t *Transport) packBody(req *Request, w *binary.Writer) { w.Write(req.Body) } +func (t *Transport) PackSecSign(req *Request) []byte { + if wrapper.FekitGetSign == nil { + return []byte{} + } + sign, extra, token, err := wrapper.FekitGetSign(uint64(req.SequenceID), strconv.FormatInt(req.Uin, 10), req.CommandName, "V1_AND_SQ_8.9.50_3898_YYB_D", req.Body) + m := &pb.SSOReserveField{ + Flag: 0, + Qimei: t.Device.QImei16, + NewconnFlag: 0, + Uid: strconv.FormatInt(req.Uin, 10), + Imsi: 0, + NetworkType: 1, + IpStackType: 1, + MessageType: 0, + SecInfo: &pb.SsoSecureInfo{ + SecSig: sign, + SecDeviceToken: token, + SecExtra: extra, + }, + SsoIpOrigin: 0, + } + data, err := proto.Marshal(m) + if err != nil { + panic(errors.Wrap(err, "failed to unmarshal protobuf SSOReserveField")) + } + return data +} + // PackPacket packs a packet. func (t *Transport) PackPacket(req *Request) []byte { // todo(wdvxdr): combine pack packet, send packet and return the response diff --git a/wrapper/codec.go b/wrapper/codec.go index 1cbb6706..259a958e 100644 --- a/wrapper/codec.go +++ b/wrapper/codec.go @@ -1,3 +1,7 @@ package wrapper var DandelionEnergy func(uint64, string, string, []byte) ([]byte, error) + +var FekitGetSign func(uint64, string, string, string, []byte) ([]byte, []byte, []byte, error) + +var AllowSignSendMsg func() bool