查看qq so中tea算法加密前后数据

环境:qq android 7.9.7.3915

 

之前是hook的java层的encoderequest函数,但是这里面入参太多,不知道最终组包是如何进行的也,这篇先看一下腾讯的tea算法加解密前后数据是什么样子的。

 

通过peid的插件krypto analyzer分析qq的so文件,找到libcoderwrapperV2。里面使用了tea算法,

故我们只要hook这个函数里面的函数就好,放到IDA中,连函数名都没有隐藏:

猜测这里的TeaEncryptECB就是加密,另一个就是解密了,参数感觉第一个和第二个一个是明文,一个是密钥,第三个应该就是最终输出的密文了。后面就开始写frida代码了:

frida直接用pip install frida==12.0.3即可安装,这里注意frida是针对特定python版本的,如果你的版本号和frida对应不上的话,会报错:

 import _frida
ImportError: DLL load failed: 找不到指定的模块。

我这里是python3.6.5的

还下载了:frida-tools==1.0.0

然后上https://github.com/frida/frida/releases下载对应的android版本的frida-server类似IDA,我这里使用的nexus 6p,下载的就是

 

然后push到安卓测试机里,修改权限后跑起来。

chmod 777 frida-server-12.2.30-android-arm64

./frida-server-12.2.30-android-arm64

 

我们先看一下连上了没:

C:\Users\liuti>frida-ps -U
  PID  Name
-----  ---------------------------------------------------
 3896  ATFWD-daemon
 5934  adbd
 3907  android.hardware.biometrics.fingerprint@2.1-service
  411  android.hardware.configstore@1.0-service
  412  android.hardware.graphics.allocator@2.0-service
  413  android.hardware.usb@1.0-service
  414  android.hardware.wifi@1.0-service
  410  android.hidl.allocator@1.0-service
10561  android.process.acore
 6127  android.process.media
 3814  audioserver
 3815  cameraserver
 3888  cnd
 6018  com.android.nfc
 5703  com.android.phone
 5552  com.android.systemui
 7852  com.android.vending
10616  com.google.android.apps.gcs
 8209  com.google.android.apps.messaging:rcs
 8250  com.google.android.apps.photos
 8284  com.google.android.apps.turbo:aab
10744  com.google.android.apps.walletnfcrel
11150  com.google.android.contacts
 6527  com.google.android.gms
 5952  com.google.android.gms.persistent
11190  com.google.android.gms.ui
 8724  com.google.android.gms.unstable
 6104  com.google.android.googlequicksearchbox
 5989  com.google.android.googlequicksearchbox:interactor
 6216  com.google.android.googlequicksearchbox:search
 8681  com.google.android.ims
11067  com.google.android.videos
10876  com.google.android.youtube
 6066  com.google.process.gapps
10540  com.google.process.gapps
 9343  com.huawei.sarcontrolservice
 9379  com.qualcomm.qcrilmsgtunnel
 9363  com.qualcomm.telephony
 6005  com.quicinc.cne.CNEService
 6243  com.sohu.inputmethod.sogou
 9755  com.tencent.mm
 6570  com.tencent.mm:push
 9834  com.tencent.mobileqq
 6628  com.tencent.mobileqq:MSF
 6841  com.wandoujia.phoenix2
 6917  com.wandoujia.phoenix2:aid
 7247  com.wandoujia.phoenix2:channel
 9980  com.whatsapp
 8226  daemonsu:0
 8232  daemonsu:0:8223
 9314  daemonsu:0:8668

左边是进程号,右边是进程名,-U是usb的意思。因为这里我是用的调试真机。然后这里qq的聊天消息时6628进程,com.tencent.mobileqq:MSF。后面我们hook这个进程即可。

这里虽然TeaEncryptECB是导出函数应该,但是不知道腾讯用了什么方式,hook不到,我用IDA跟进去,这段代码也没有被认为是函数,只能通过基址加偏移的方式来Hook了,先进去看看so库的基址:

angler:/ # cat proc/6628/maps |grep libcodec
cd646000-cd68d000 r-xp 00000000 fd:00 1721364                            /data/app/com.tencent.mobileqq-1f7mpIqT9_JQi9fNMEP5fQ==/lib/arm/libcodecwrapperV2.so
cd68d000-cd68e000 r--p 00046000 fd:00 1721364                            /data/app/com.tencent.mobileqq-1f7mpIqT9_JQi9fNMEP5fQ==/lib/arm/libcodecwrapperV2.so
cd68e000-cd690000 rw-p 00047000 fd:00 1721364                            /data/app/com.tencent.mobileqq-1f7mpIqT9_JQi9fNMEP5fQ==/lib/arm/libcodecwrapperV2.so
angler:/ #

这里cd646000就是so的基址,然后再找偏移:

偏移为0x00038E30

参数如下:

所以最终我们要hook的地址就是:0xcd646000 + 0x00038E30 = CD67EE30。看四哥的博客说这里最后因为thumb和arm指令的区别,最后还得加1,变为CD67EE31。

这里地址也可以直接通过代码获取:

var codecwraperAddr = Process.findModuleByName("libcodecwrapperV2.so").base.add(0x38e31);

而后编写js的hook代码:

var codecwraperAddr = Process.findModuleByName("libcodecwrapperV2.so").base.add(0x38e31);
var nativePointer = new NativePointer(codecwraperAddr);
send("net native pointers:" + nativePointer);
var result_pointer;
Interceptor.attach(nativePointer,{
	onEnter:function(args){
		result_pointer = args[2].toInt32();
		send("Teacrypt so args: " + Memory.readByteArray(args[0]) + " arg2 = " + Memory.readByteArray(args[1]);
	},
	onLeave:function(retval){
		var resultPointer = new NativePointer(result_pointer);
		var arybuffer = Memory.readByteArray(resultPointer);
		var intary = new Uint32Array(arybuffer);
		var resultstr = "";
		for(var i = 0;i<intary.length;i++){
			send("hex: " + intary[i].toString());
			resultstr = resultstr + revertHex(intary[i].toString());
		}
		send("Teacrypt so result: " + resultPointer + ", result: " + resultstr);
		
	}
}

一顿操作写完,程序跑起来,qq崩了。。崩了。。。

应该是使用了反hook吧,不知如何解决,到知识星球提问,有前辈给了建议:

那就都研究一下吧。不过领导要求年前要有明文数据,来不及看这个了。。留个白

。。。。。。。

直接IDA分析入手:

 

这里IDA分析不出这个TEA算法的加密函数,需要通过上述手动计算函数地址:

libcodecwrapper基址加上0x38E30的偏移获得,这里我没有+1反正。然后跳转到函数开头,发现并没有被认为是函数:

按 C将当前段理解为代码段。然后在函数开始下断点:

发送消息,此时断下来后,看到r1寄存器指向了一个16字节的可见字符串,猜测这里就是密钥了。

而后通过网上很多的qq解密工具,输入抓到的密文,IDA跟到的字符串进行解密,即可得到加密前的明文数据:

比如这里:(和上次不是同一次调试了,每次连接之后密钥是不会变得)

我们得到的报文是:

这里开头部分是报文长度,报文组包格式,qq号,然后才是加密内容,即从85 fc开始,才是加密后的数据,从这里开始解密。

从IDA中得到的密钥是:

这里可以解密,得到明文数据是:

这里有一个知识点就是,明文和密文的长度关系,开始以为是明文直接补齐到8的长度,比如2个字节,直接补6个字节变成8个字节,后来发现怎么都对不上号,后来发现TEA算法的这个补齐还是比较奇异的,参考了https://blog.csdn.net/mingzznet/article/details/46906933,也看了qq的代码:

了解到他是先加10位在补到8的倍数的,而且补齐的时候用到了一个随机数,这就导致了同样的明文和密钥,可以加密成不一样的密文。还有长度也是比如2个字节,

(2 + 10 + 4 )%8 = 0;所以最终会加密成16个字节的长度。

具体的填充方法:第一个字节为:(random()&0xf8)|n,随后填充(n+2)个字节random()&0xff ,后面接原始数据,最后填充7 个字节0x00 。n就是上面那个4,待填充长度。

比如待加密数据是:0x22,0x33,随机数就取0xad吧:

第一位:(0xad&0xf8)|0x04 = 0xac

随后填充4 + 2 个随机数:0xad

加上原来的明文:0x22,0x33

最后补7个0x00

最终得到明文:ac ad ad ad ad ad ad 22 33 00 00 00 00 00 00 00

解密的时候,得到最终的明文,通过运算可以得到哪些位是填充的,直接过滤掉即可得到真正的原始数据。

这个填充方式解除了我对分析明文和密文长度的困惑。之前理解的直接补齐到8的倍数是有问题的,直接补齐的话,解密的时候怎么知道到底是多少位源数据呢,所以腾讯采用了上述补齐的方式。

如何序列化参考:

https://blog.csdn.net/liutianheng654/article/details/104232612

同理可得整个链路中所有消息的明文,这里留一下大概看的几个报文吧:

秘钥:
[stack:12207]:CC173F91 DCB 0x70 ; p
[stack:12207]:CC173F91 DCB 0x4D ; M
[stack:12207]:CC173F92 DCB 0x28 ; (
[stack:12207]:CC173F93 DCB 0x7D ; }
[stack:12207]:CC173F94 DCB 0x36 ; 6
[stack:12207]:CC173F95 DCB 0x47 ; G
[stack:12207]:CC173F96 DCB 0x2D ; -
[stack:12207]:CC173F97 DCB 0x7E ; ~
[stack:12207]:CC173F98 DCB 0x3D ; =
[stack:12207]:CC173F99 DCB 0x60 ; `
[stack:12207]:CC173F9A DCB 0x68 ; h
[stack:12207]:CC173F9B DCB 0x2E ; .
[stack:12207]:CC173F9C DCB 0x64 ; d
[stack:12207]:CC173F9D DCB 0x59 ; Y
[stack:12207]:CC173F9E DCB 0x64 ; d
[stack:12207]:CC173F9F DCB 0x51 ; Q

发送密文:
85 fc 34 cc 5f da 38 f4 65 0b 92 a6 5c 48 90 07 
30 cf 00 87 5f c5 35 e4 89 86 ec 92 2f b5 72 a0 
5e 0d 56 5e 7c dd 9f 41 b5 b8 33 5c 2e b8 48 9d 
db 55 cd 6b 05 ee d1 14 8d d0 9f 95 c1 e7 d2 f3 
1f b8 e1 39 d1 90 6d 55 f2 b0 10 68 17 01 51 91 
ee 90 b2 d5 93 1d 21 4c c1 c0 ea 1d a2 aa 84 e3 
7a fe 21 ef 5e f0 29 7d 4d 0f 34 f1 2c d9 72 c8 
18 0a a0 3f aa 81 49 38 72 3f 2b bf aa 04 b9 3d 
90 71 fa ed ee c0 79 98 8d 09 4f 46 ff bf 69 72 
27 5c ee e7 a8 c2 c7 7b ca f5 aa fc c6 02 a9 b9

明文:
00 00 00 28 00 00 00 18 4D 65 73 73 61 67 65 53 
76 63 2E 50 62 53 65 6E 64 4D 73 67 00 00 00 08 
47 AA 6A 0A 00 00 00 04 00 00 00 6A 0A 08 0A 06 
08 8C C4 CD F5 01 12 06 08 01 10 00 18 00 1A 1E 
0A 1C 12 07 0A 05 0A 03 31 31 31 12 11 AA 02 0E 
88 01 00 9A 01 08 78 00 F8 01 00 C8 02 00 20 B1 
FF 03 28 A0 EB E0 F4 04 32 26 08 CB EA BE E2 05 
10 CB EA BE E2 05 28 89 AA E5 FC 03 48 82 94 9A 
AA 08 58 A3 B8 84 E2 08 68 CB EA BE E2 05 70 00 
40 01





00 00 00 28   //包头长度
00 00 00 18   //serviceCmd 长度 +4 包含自身 
4D 65 73 73 61 67 65 53 76 63 2E 50 62 53 65 6E 64 4D 73 67 // MessageSvc.PbSendMsg
00 00 00 08     //msgcookies长度 + 4
47 AA 6A 0A     //msgcookies
00 00 00 04     //包体长度的长度
00 00 00 6A     //包体长度
一下需要反序列化处理了
0A 08 0A 06 08 8C C4 CD F5 01 12 06 08 01 10 00 
18 00 1A 1E 0A 1C 12 07 0A 05 0A 
03 //发送消息长度
31 31 31 //消息明文内容
12 11 AA 02 0E 88 01 00 9A 01 08 78 00 F8 01 00 C8 
02 00 20 B1 FF 03 28 A0 EB E0 F4 04 32 26 08 CB 
EA BE E2 05 10 CB EA BE E2 05 28 89 AA E5 FC 03 
48 82 94 9A AA 08 58 A3 B8 84 E2 08 68 CB EA BE 
E2 05 70 00 40 01


发送密文2:
AF 8C 23 31 A1 89 A4 D0 D6 B6 BD CC 83 7C D3 62 
B4 C0 8E 22 A8 6D 67 52 10 FF 40 ED BB E2 BC 94 
CD 39 45 49 95 B4 BA 35 15 3C 21 F0 4F 36 B9 B1 
B7 BB 20 F5 22 24 4A 78 B5 7F 69 73 E2 98 A3 FB 
8E 4D 02 D1 FC CA FC C4 56 43 04 5F 81 48 D6 2D 
A6 9C C3 A3 EE 95 18 39 F5 B3 3D 6A C7 E3 12 74 
F4 28 73 7D 75 C0 B2 3E CA 29 62 1D 89 F3 E5 F8 
A5 13 6C DA 09 53 E9 9C B2 A3 2F 85 7E A1 C7 60 
04 FD 47 1D F2 E6 E5 BB F6 F7 38 3A 44 26 52 81 
A9 0D A6 E4 DC 46 E1 E2 42 A2 A0 B3 3F 9B DE 18 

af8c2331a189a4d0d6b6bdcc837cd362b4c08e22a86d675210ff40edbbe2bc94cd39454995b4ba35153c21f04f36b9b1b7bb20f522244a78b57f6973e298a3fb8e4d02d1fccafcc45643045f8148d62da69cc3a3ee951839f5b33d6ac7e31274f428737d75c0b23eca29621d89f3e5f8a5136cda0953e99cb2a32f857ea1c76004fd471df2e6e5bbf6f7383a44265281a90da6e4dc46e1e242a2a0b33f9bde18
发送明文2:

00 00 00 28   //包头长度
00 00 00 18   //serviceCmd 长度 +4 包含自身 
4D 65 73 73 61 67 65 53 76 63 2E 50 62 53 65 6E 64 4D 73 67 // MessageSvc.PbSendMsg
00 00 00 08     //msgcookies长度 + 4
47 AA 6A 0A     //msgcookies
00 00 00 04     //包体长度的长度
00 00 00 6E     //包体长度
0A 08 0A 06 08 8C C4 CD F5 01 12 06 08 01 10 00 
18 00 1A 22 0A 20 12 0B 0A 09 0A 
07 //消息长度
32 33 32 32 32 32 32 //消息内容
12 11 AA 02 0E 88 01 00 9A 01 08 78 00 
F8 01 00 C8 02 00 20 BE FF 03 28 D3 8E BD D4 05 
32 26 08 CB EA BE E2 05 10 CB EA BE E2 05 28 89 
AA E5 FC 03 48 82 94 9A AA 08 58 A3 B8 84 E2 08 
68 CB EA BE E2 05 70 00 40 01

响应明文:
00 00 00 34 
00 01 40 5B 
00 00 00 00 00 00 00 04 
00 00 00 18 
4D 65 73 73 61 67 65 53 76 63 2E 50 62 53 65 6E 64 4D 73 67 
00 00 00 08 
47 AA 6A 0A 
00 00 00 00 00 00 00 0C 08 00 18 82 EB BE E2 05






响应密文:
1
ea d6 81 10 6c 7c 6a 6e 3c 3a 04 12 a2 e8 90 88 
f0 20 b9 67 54 9b b2 4e d4 d6 e5 ee 0e b4 a3 5a 
0f e6 9e b8 46 ba 1b 0c c2 d3 ee b3 38 3b 1e 50 
17 94 9f 91 a6 4f 23 c1 df 7d 0e 4b ca fe b6 b0 
63 13 91 39 88 37 cc 25 c7 7b e5 35 80 a6 ab 75
2
F2 66 CE 56 A5 B2 FA D0 20 5B DC C5 75 A8 47 F6 
A4 00 59 91 13 25 DA 0A 81 F4 D4 D6 6F 8A 50 2A 
25 21 95 C4 A8 94 F5 7F EF 4B 34 B2 CB 84 6F 13 
F7 55 56 3B 7E 37 C2 D6 EB C1 5E DD 64 6D 74 7E 
47 1D A7 9E 41 04 F7 3C 54 0F B0 E9 E1 B2 EE BB



53 1B 38 99 2D 7E 72 5E 40 3E E5 E5 A0 8E AF 23 
BF A9 E8 98 24 97 AC C8 CA 2C 7F CF 2F 38 2E 35 
82 37 8D 27 E4 91 1E EF 42 06 A1 FF 64 1F FA 85 
9D 2A F8 0B A7 A2 5B D1 93 C4 60 89 39 A7 45 45 
58 AF 26 79 EF F0 A6 D4 55 9F 3B B6 FF 75 FD D5 
59 EF FB 08 57 A1 95 4C




响应明文:
1
00 00 00 34 00 01 40 26 00 00 00 00 00 00 00 04 
00 00 00 18 4D 65 73 73 61 67 65 53 76 63 2E 50 
62 53 65 6E 64 4D 73 67 00 00 00 08 47 AA 6A 0A 
00 00 00 00 00 00 00 0C 08 00 18 F2 EA BE E2 05

D3 82 35 CE 27 8E E1 8D 4C 80 78 73 5E DA C0 F9 
E5 49 51 21 97 0A A5 22 B1 12 08 26 B8 3E 38 64 
2E E2 DC A1 12 46 95 F5 34 01 05 A6 6A BF AE 31 
37 8F BB E6 01 83 46 D0 78 2F 3B B4 4B 61 7B B9 
14 39 4E 16 16 1A 35 B6

00 00 00 34   //包头长度
00 01 40 26   //序列号,每次加4
00 00 00 00 00 00 00 04 //下面一个长度的长度
00 00 00 18    //接下来字符串长度,包含自己本身
4D 65 73 73 61 67 65 53 76 63 2E 50 62 53 65 6E 64 4D 73 67 //MessageSvc.PbSendMsg
00 00 00 08 47 AA 6A 0A //00000008表示长度,47 AA 6A 0A 表示msgcookies,和发送的对应。
00 00 00 00 00 00 00 0C 08 00 18 F2 EA BE E2 05

2~4,连续的3个响应报文
00 00 00 34 00 01 40 5B 00 00 00 00 00 00 00 04 
00 00 00 18 4D 65 73 73 61 67 65 53 76 63 2E 50 
62 53 65 6E 64 4D 73 67 00 00 00 08 47 AA 6A 0A 
00 00 00 00 00 00 00 0C 08 00 18 82 EB BE E2 05

00 00 00 34 00 01 40 60 00 00 00 00 00 00 00 04 
00 00 00 18 4D 65 73 73 61 67 65 53 76 63 2E 50 
62 53 65 6E 64 4D 73 67 00 00 00 08 47 AA 6A 0A 
00 00 00 00 00 00 00 0C 08 00 18 84 EB BE E2 05

00 00 00 34 00 01 40 64 00 00 00 00 00 00 00 04 
00 00 00 18 4D 65 73 73 61 67 65 53 76 63 2E 50 
62 53 65 6E 64 4D 73 67 00 00 00 08 47 AA 6A 0A 
00 00 00 00 00 00 00 0C 08 00 18 86 EB BE E2 05





接收密文:
B1 9D 4E 67 82 29 7D D0 E2 17 BA 7D 26 40 2E 2F 
57 FB CA DF CA 98 3E 34 D7 6C 2E 56 B6 4D 72 8C 
59 88 75 28 16 60 C0 D3 6B 58 B2 BB 62 13 79 47 
E9 8B C1 BD FE AB A0 F7 E3 39 69 9A 16 02 A9 68 
4C 60 AC 3A F0 EB 00 F7 52 73 D8 78 00 46 41 E2 
DD 9F B5 12 36 3A BC E9 F6 69 C7 FC 72 07 95 73 
A4 A7 26 CA 43 DA 80 47 EF 83 72 BB A6 65 35 C2 
2B 8A E1 8D BD F1 38 49 1F D7 73 01 36 CB 2B 5A 
FF AF 0E 2E D6 AA 48 40 E8 B7 D6 14 73 FC 3A 68 
8A B7 33 B9 BC 70 D9 B3 11 65 0D 1B 6A 3C A1 25 
C1 65 6B 88 D3 1D 98 80 72 51 15 05 D8 FF CB 7A 
25 4D 99 7C 52 87 82 40 05 37 DC 9D 58 D0 7A 01 
76 CA 27 AD 58 B4 E7 D9 5C 07 4F 87 EE 39 94 87 
DF B3 6C 12 3F 31 9B 96 A1 C8 D1 E3 18 21 1A 84 
8C E6 BA E7 52 DC AA 37 6F F5 71 FA 75 AE 3E 9A 
88 61 F4 9B EE 0E 26 67 01 64 3B B2 3F 69 78 2B 
B0 DD B9 8D 06 23 1D 6D E4 B5 B9 C8 23 23 5D 22 
33 10 7E 06 61 CA 17 53 

接收明文:
00 00 00 40 D0 2F A9 2A 00 00 00 00 00 00 00 04 
00 00 00 19 4D 65 73 73 61 67 65 53 76 63 2E 50 
75 73 68 4E 6F 74 69 66 79 00 00 00 08 47 AA 6A 
0A 00 00 00 00 00 00 00 0B 30 BE BE CE BC 89 2D 
00 00 00 CC 00 00 00 C8 10 02 2C 3C 4C 56 0A 4D 
65 73 73 61 67 65 53 76 63 66 0A 50 75 73 68 4E 
6F 74 69 66 79 7D 00 01 00 9D 08 00 01 06 0E 72 
65 71 5F 50 75 73 68 4E 6F 74 69 66 79 18 00 01 
06 20 50 75 73 68 4E 6F 74 69 66 79 50 61 63 6B 
2E 52 65 71 75 65 73 74 50 75 73 68 4E 6F 74 69 
66 79 1D 00 00 61 0A 02 7D 30 72 6E 10 01 26 0A 
4D 65 73 73 61 67 65 53 76 63 36 0A 50 75 73 68 
4E 6F 74 69 66 79 4D 00 0C 51 00 A6 6C 7C 8C 9A 
0C 1C 2C 3C 46 00 5C 6D 00 0C 7C 8D 00 0C 9D 00 
0C AC B0 01 C9 0C DA 06 00 16 00 26 00 36 00 0B 
EC FD 0F 00 0C F6 10 00 F6 11 00 F9 12 0C 0B A6 
00 BD 00 0C CC DC 0B 8C 98 0C A8 0C


接收响应密文:

b0 b7 47 ca 18 ce de 22 40 e6 ac 2e a1 7c 12 00 
1d ea 11 51 a9 e2 d5 51 42 56 19 4a be e1 cd 15 
d1 64 e2 4a fc 19 3d 7b c2 0b e3 2c 2f 42 59 4d 
86 98 19 e5 8d 8f ea 21 90 d5 27 d6 be 9f f9 cf 
f4 5d dc fc 3e c0 6e b4 36 1a e3 ae 20 5b cf 54 
38 f1 90 18 3b ff 12 dc 3a 7c 2a 03 ee 2c 5f 3a 
fd 3e da da a4 45 eb 7c fb ae f9 86 a0 84 25 93 
eb f5 3c 0e fc 8e 59 3f 54 62 cf 3e d5 13 4f 0f 
30 7d 24 31 e5 dd 30 8b 97 be 7b d3 99 5c 9e e1 
6f 30 e2 1a 30 46 b1 18 e9 ed 6c ca 33 90 a7 09 
99 09 5a 0e 52 08 22 3d 7f 7e ef de 6e a5 75 02 
0d 9e c8 83 ed f8 3f 0d 7e 5b 2d a4 59 df 39 12 
76 12 1e 1c 8e dd 67 21 74 f0 dd f9 d6 fe ae 56

00 00 00 83 
00 00 00 17 4D 65 73 73 61 67 65 53 76 63 2E 50 62 47 65 74 4D 73 67 
00 00 00 08 47 AA 6A 0A 
00 00 00 60 08 00 12 3C 6D 6F 64 65 6C 
3A 4E 65 78 75 73 20 36 50 3B 6F 73 3A 32 36 3B 
76 65 72 73 69 6F 6E 3A 76 32 6D 61 6E 3A 48 75 
61 77 65 69 73 79 73 3A 4F 50 52 35 2E 31 37 30 
36 32 33 2E 30 31 31 18 A3 9D CE BC 89 2D 20 A7 
9D CE BC 89 2D 28 A1 9D CE BC 89 2D 30 BE BE CE 
BC 89 2D 00 00 00 3C 08 00 12 26 08 CB EA BE E2 
05 10 CB EA BE E2 05 28 89 AA E5 FC 03 48 82 94 
9A AA 08 58 A3 B8 84 E2 08 68 CB EA BE E2 05 70 
00 18 00 20 14 28 03 30 01 38 01 48 00 62 00


接收响应明文:
00 00 00 83 
00 00 00 17 4D 65 73 73 61 67 65 53 76 63 2E 50 62 47 65 74 4D 73 67 //MessageSvc.PbGetMsg
00 00 00 08 47 AA 6A 0A 
00 00 00 60 08 00 12 3C 6D 6F 64 65 6C 
3A 4E 65 78 75 73 20 36 50 3B 6F 73 3A 32 36 3B 
76 65 72 73 69 6F 6E 3A 76 32 6D 61 6E 3A 48 75 
61 77 65 69 73 79 73 3A 4F 50 52 35 2E 31 37 30 
36 32 33 2E 30 31 31 18 A3 9D CE BC 89 2D 20 A7 
9D CE BC 89 2D 28 A1 9D CE BC 89 2D 30 BE BE CE 
BC 89 2D 00 00 00 3C 08 00 12 26 08 CB EA BE E2 
05 10 CB EA BE E2 05 28 89 AA E5 FC 03 48 82 94 
9A AA 08 58 A3 B8 84 E2 08 68 CB EA BE E2 05 70 
00 18 00 20 14 28 03 30 01 38 01 48 00 62 00

00 00 00 83 
00 00 00 17 4D 65 73 73 61 67 65 53 76 63 2E 50 62 47 65 74 4D 73 67 
00 00 00 08 47 AA 6A 0A 
00 00 00 60 08 00 12 3C 6D 6F 64 65 6C 
3A 4E 65 78 75 73 20 36 50 3B 6F 73 3A 32 36 3B 
76 65 72 73 69 6F 6E 3A 76 32 6D 61 6E 3A 48 75 
61 77 65 69 73 79 73 3A 4F 50 52 35 2E 31 37 30 
36 32 33 2E 30 31 31 18 AF B5 CE BC 89 2D 20 B4 
B5 CE BC 89 2D 28 AA B5 CE BC 89 2D 30 DB D6 CE 
BC 89 2D 00 00 00 3B 08 00 12 25 08 FF 86 BF E2 
05 10 FF 86 BF E2 05 28 8A D4 97 94 0E 48 A7 A1 
C5 37 58 FB D7 DB BE 26 68 FF 86 BF E2 05 70 00 
18 00 20 14 28 03 30 01 38 01 48 00 62 00

00 00 00 83 00 00 00 17 
4D 65 73 73 61 67 65 53 
76 63 2E 50 62 47 65 74 
4D 73 67 00 00 00 08 47 
AA 6A 0A 00 00 00 60 08 
00 12 3C 6D 6F 64 65 6C 
3A 4E 65 78 75 73 20 36 
50 3B 6F 73 3A 32 36 3B 
76 65 72 73 69 6F 6E 3A 
76 32 6D 61 6E 3A 48 75 
61 77 65 69 73 79 73 3A 
4F 50 52 35 2E 31 37 30 
36 32 33 2E 30 31 31 18 
AF B5 CE BC 89 2D 20 B4 
B5 CE BC 89 2D 28 AA B5 
CE BC 89 2D 30 DB D6 CE 
BC 89 2D 00 00 00 3B 08 
00 12 25 08 FF 86 BF E2 
05 10 FF 86 BF E2 05 28 
8A D4 97 94 0E 48 A7 A1 
C5 37 58 FB D7 DB BE 26 
68 FF 86 BF E2 05 70 00 
18 00 20 14 28 03 30 01 
38 01 48 00 62 00




接收响应密文:
00 00 00 83 00 00 00 17 4D 65 73 73 61 67 65 53 76 63 2E 50 62 47 65 74 4D 73 67 00 00 00 08 47 AA 6A 0A 00 00 00 60 08 00 12 3C 6D 6F 64 65 6C 3A 4E 65 78 75 73 20 36 50 3B 6F 73 3A 32 36 3B 76 65 72 73 69 6F 6E 3A 76 32 6D 61 6E 3A 48 75 61 77 65 69 73 79 73 3A 4F 50 52 35 2E 31 37 30 36 32 33 2E 30 31 31 18 AF B5 CE BC 89 2D 20 B4 B5 CE BC 89 2D 28 AA B5 CE BC 89 2D 30 DB D6 CE BC 89 2D 00 00 00 3B 08 00 12 25 08 FF 86 BF E2 05 10 FF 86 BF E2 05 28 8A D4 97 94 0E 48 A7 A1 C5 37 58 FB D7 DB BE 26 68 FF 86 BF E2 05 70 00 18 00 20 14 28 03 30 01 38 01 48 00 62 00


用上面这个很快就能看出来了。

 

最近这段时间在解这个jcestruct结构,看到请求报文的封装会经过requestpacket这个数据结构。继承自jcestruct,可以解析出第一层封装的内容,在

Lcom/qq/taf/RequestPacket;中的
writeTo 下断点,这个是接收到消息的时候,解密之后将报文导入requestpacket的函数,跟一下可以得到报文格式:

都是形如这样的。其中sBuffer的数据需要再次序列化,用到了

Lcom/qq/jce/wup/UniPacket;的decode函数如下。

最终会走到这个parseBufferV2()这个函数,内容如下:

看到取出sBuffer中的内容,然后存储到_data中,最终_data的内容如下:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值