PCQQ UDP协议的研究<2>——0825 发送包

      在 PCQQ UDP协议的研究<1>——准备工作   一文里,我们了解PCQQ的大致信息。这里我们开始将具体包体的分析。
    由于QQ2012之后的版本变化太大,在2012这一个版本出来之前,接触包的命令是0091,不过这都成为了过去式了。现在的接触包是0825,也就是说2012之前协议的研究都没用了。那么我们说的这个0825也好,0091也好是指的什么呢?下面我们来看之前我看到的一个包体:

[NO.1 2013-09-13 15:23:32 947 SEND 147字节]
02 34 27 08 25 31 60 17 AC C4 B7 03 00 00 00 01
01 01 00 00 66 7E 00 00 00 00 17 AD 8D B4 DE B3
A9 18 C9 EA 59 46 C9 91 B5 81 AD 91 65 55 44 2C
B6 40 49 17 F1 B0 F3 6E F6 65 44 04 18 63 0C 0F
8A A1 DD 2A F8 B0 4E 3C C1 FD F8 E6 B6 2A B7 86
10 02 B5 BA 62 9B 9A E9 1E 65 09 73 29 4E EE 80
A3 90 20 5D 10 1F 85 F2 A4 5D 19 53 58 11 E5 8A
7E 13 59 0C F1 34 60 E6 51 EE 7B F7 CE C6 B8 32
C4 97 55 61 FD 03 D3 B3 E3 25 EB 4A F0 55 B1 11
2C 0F 03

这里我们从 02...这里开始,算是我们的正式包体。
首先讲一点,QQ协议的所有包体都有一个很明显又固定的特征,那就是它每一个包体的未加密部分基本相同,加密部分也能通过未加密部分找出密钥来解密包体。从我们多次抓包对比后分析可以大致得出,发送包所有的包体头部特征基本一致,接收包也是一致,只是与发送包的不一样而已。

02  是用于区分包体的开始位置。相应整个包还会以03作为包体结束的标志。(固定)
34 27 代表QQ客户端采用的协议版本,不同的版本即便是一次小小的升级都会让这个标志变化。(固定,每个版本会不同)
08 25 重点来了,这就是我们刚才0825来0825去的所说的地方。也就是一个包的功能命令。代表这个包用于完成客户端与服务器的一次握手接触。(固定)
31 60 包序号,用于区分每一个是独特特征。(一般固定,发送消息的包除外)
17 AC C4 B7 这个是我的QQ号码的十六进制数,具体怎么算的稍后我会带上。(按QQ号来)
03 00 00 00 01 01 01 00 00 66 7E 00 00 00 00 这个字符串具体什么意思不太清楚,但是每个发送包都含有,姑且我们称他为 0825_fix0 吧(随便大家怎么叫,知道是这个数据就行了) (这里是固定的,差不多每个包都会用)
17 AD 8D B4 DE B3
A9 18 C9 EA 59 46 C9 91 B5 81 AD 91 65 55 44 2C
B6 40 49 17 F1 B0 F3 6E F6 65 44 04 18 63 0C 0F
8A A1 DD 2A F8 B0 4E 3C C1 FD F8 E6 B6 2A B7 86
10 02 B5 BA 62 9B 9A E9 1E 65 09 73 29 4E EE 80
A3 90 20 5D 10 1F 85 F2 A4 5D 19 53 58 11 E5 8A
7E 13 59 0C F1 34 60 E6 51 EE 7B F7 CE C6 B8 32
C4 97 55 61 FD 03 D3 B3 E3 25 EB 4A F0 55 B1 11
2C 0F
这一长串数据是什么意思呢?没错,肯定是加密后的包体,但是既然是要加密,起码也要看到密钥吧。至于用什么加密算法加的密,IT前辈已经帮我们OD逆向好了,知道这是采用64轮的tea算法。而且算法都已经为我们准备好了。
那么密钥在哪呢?tea算法采用的密钥长度是16位,也就是说,在这一堆数据里,肯定有一个密钥以明文方式存着,而且不可能存在包体后面,因此加密之后的包体长度是不确定的,包体有多长谁也不敢确定,所以最可能就是放在了包体的前面。事实证明,前面的16位字节恰好是能解开后面数据的密钥。也就是这个包的密钥是:17 AD 8D B4 DE B3 A9 18 C9 EA 59 46 C9 91 B5 81
带解密的包体是
AD 91 65 55 44 2C
B6 40 49 17 F1 B0 F3 6E F6 65 44 04 18 63 0C 0F
8A A1 DD 2A F8 B0 4E 3C C1 FD F8 E6 B6 2A B7 86
10 02 B5 BA 62 9B 9A E9 1E 65 09 73 29 4E EE 80
A3 90 20 5D 10 1F 85 F2 A4 5D 19 53 58 11 E5 8A
7E 13 59 0C F1 34 60 E6 51 EE 7B F7 CE C6 B8 32
C4 97 55 61 FD 03 D3 B3 E3 25 EB 4A F0 55 B1 11
2C 0F

我们放到 QQAnalyzer的QQtea加密选项卡里

QQ图片20130913154449.jpg (115.47 KB, 下载次数: 22)

下载附件

前天 15:46 上传


就是这样,将解密出来的包的文本再复制到我们刚才的包文本下面。
解密出来的数据如下:
[
00 18 00 16 00 01 00 00 04 33 00 00 00 01 00 00
14 77 17 AC C4 B7 00 00 00 00 03 09 00 08 00 01
70 5F F2 74 00 02 00 36 00 12 00 02 00 01 00 00
00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D
01 02 00 19 03 0C 8C 2B 7E 75 4F F6 F3 56 D8 99
B3 0F A2 95 A3 8D DD 1E A1 AB 32 C3 F3

]
那这些又有什么规律呢?还是老办法,多抓几次包,重复操作,对比一下便知:

本帖隐藏的内容

[
00 18 00 16 00 01 // 固定,我们取名为 0825_fix1 ,因为后面我们还有好几个地方要用到
00 00 04 33 00 00 00 01 00 00 14 77 //固定,同上,取名为 0825_fix2
17 AC C4 B7 //QQ号码
00 00 //第几次发送0825这个包,就显示第几次,第一次为0,以此类推。为什么是第几次呢,因为有可能要提示要更换服务器登录
00 00 03 09 00 08 00 01 //固定,具体含义不清楚
70 5F F2 74 //这里是IP地址是16进制数,[ IP地址:112.95.242.116]为什么是这样,经验吧!包抓多了就知道了
00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 //固定,具体含义不清楚
00 19 //这个代表接下来会有0x19(换成10进制是25)个字节要出现,具体作用看后边
03 0C 8C 2B 7E 75 4F F6 F3 56 D8 99 B3 0F A2 95 A3 8D DD 1E A1 AB 32 C3 F3 //25个字节,这里是椭圆曲线加密算法的一部分。HDKey.怎么知道,OD逆向分析知道有这么一个函数在这个位置,然后查资料得到的 (为了能解决以后的验证码问题,这里即使能固定也别固定,可以从下面的链接
http://xqin.net/ecc/



以上分析到了0825的发送包。
出于篇幅和时间的考虑,0825的接收包将另起一页来分析。希望大家多多支持本站。

你可能感兴趣的:(PCQQ UDP协议的研究<2>——0825 发送包)