From 8cfc2c045045042b4206cc4cc5e01e7aef86656c Mon Sep 17 00:00:00 2001 From: dduu <1303384099@qq.com> Date: Sun, 21 May 2023 18:41:09 +0800 Subject: [PATCH 1/2] feat: SsoSecure pb field --- client/pb/data.pb.go | 19 +++++++++++++++++++ client/pb/data.proto | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/client/pb/data.pb.go b/client/pb/data.pb.go index f3bc5051b..c395f6b98 100644 --- a/client/pb/data.pb.go +++ b/client/pb/data.pb.go @@ -3,6 +3,25 @@ package pb +type SSOReserveField struct { + Flag int32 `protobuf:"varint,9,opt"` + Qimei string `protobuf:"bytes,12,opt"` + NewconnFlag int32 `protobuf:"varint,14,opt"` + Uid string `protobuf:"bytes,16,opt"` + Imsi int32 `protobuf:"varint,18,opt"` + NetworkType int32 `protobuf:"varint,19,opt"` + IpStackType int32 `protobuf:"varint,20,opt"` + MessageType int32 `protobuf:"varint,21,opt"` + SecInfo *SsoSecureInfo `protobuf:"bytes,24,opt"` + SsoIpOrigin int32 `protobuf:"varint,28,opt"` +} + +type SsoSecureInfo struct { + SecSig []byte `protobuf:"bytes,1,opt"` + SecDeviceToken []byte `protobuf:"bytes,2,opt"` + SecExtra []byte `protobuf:"bytes,3,opt"` +} + type DeviceInfo struct { Bootloader string `protobuf:"bytes,1,opt"` ProcVersion string `protobuf:"bytes,2,opt"` diff --git a/client/pb/data.proto b/client/pb/data.proto index 3e9562708..dc3ed3089 100644 --- a/client/pb/data.proto +++ b/client/pb/data.proto @@ -2,6 +2,25 @@ syntax = "proto3"; option go_package = "github.com/Mrs4s/MiraiGo/client/pb"; +message SSOReserveField { + int32 flag = 9; + string qimei = 12; + int32 newconn_flag = 14; + string uid = 16; + int32 imsi = 18; + int32 network_type = 19; + int32 ip_stack_type = 20; + int32 message_type = 21; + SsoSecureInfo sec_info = 24; + int32 sso_ip_origin = 28; +} + +message SsoSecureInfo { + bytes sec_sig = 1; + bytes sec_device_token = 2; + bytes sec_extra = 3; +} + message DeviceInfo { string bootloader = 1; string procVersion = 2; From 425f3e4d0c7e31584174573195c8219d40b87bc4 Mon Sep 17 00:00:00 2001 From: dduu <1303384099@qq.com> Date: Sun, 21 May 2023 18:50:36 +0800 Subject: [PATCH 2/2] feat: pack sec head --- client/internal/network/transport.go | 41 ++++++++++++++++++++++++++++ wrapper/codec.go | 4 +++ 2 files changed, 45 insertions(+) diff --git a/client/internal/network/transport.go b/client/internal/network/transport.go index 380155ccf..004ed758e 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 1cbb67061..259a958ef 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