由于导师的要求,我做网络协议分析开发工作已经有2年时间了。对于主流的IM都有研究。很早以前我就在看雪论坛注册了,不过发现搞网络分析的人太少了就很少发帖。最近看加百力也是搞网络分析的,发了一篇分析QQ的帖子得了精华于是也想发帖交流一下,万一版主开恩也给个精华我也可以升级了。哈哈。

前面加百力已经分析了QQ发送聊天信息的协议,想必很多人都看过了。这里我就顺着继续写下去也节约一些时间,我毕竟还是很懒得发贴的人。

还是那两个问题:
01、如何确定某个数据包包含有接收到的QQ信息?
02、如何得到会话密钥?

会话密钥就不用多说了。加百力已经说过了。

关键是第一个问题,一般QQ接收到的含有对方发来消息的数据包格式为:
0000:   02    QQ数据包开头都是02
0001 -  0002  10 00:  这两个字节本来代表QQ版本号,但是腾讯显然不希望也不需要接受者知道对方的QQ版本号就始终设置为10 00。如果想知道就自己解密吧,后面再说这个。
0003 -  0004  00 17:  QQ命令。前面说过发送消息的QQ命令为00 16。而接收为00 17也很好记忆。
0005 -  0006  2字节的序列号。
0007 -  倒数第二字节: 为加密的接收信息数据。除了聊天内容还有丰富的信息,后面详细说明。
最后一个字节  03 QQ数据包结束标志为03。刚好和前面的02呼应。

找接收数据包的判断条件是:QQ命令为00 17。不过这只是一个粗糙的判据。服务器也经常用这个格式发送一些信息等等。所以找到的未必全是对方发送给你的消息。呵呵。

找到之后拷贝整个数据块到QQDebugger解密文本框中。然后去掉首尾的无用信息解密。(搞错了可解不出来的!)

前面说了这个解密信息内容很丰富,加百力前面只是分析得到了发送出去的消息。其实那个发送数据包里面的东西也很丰富。


对于接收到的数据包解密后大体是这样的结构:


发送者QQ号,4字节

接收者QQ号,4字节

包序号(并非我们发送时候的序号,因为这个是4字节,应该是服务器端的总序号)

发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节

发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节

消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节

发送者QQ版本,2字节:想得到对方QQ版本号的从这里得到。

发送者的QQ号,4字节

接受者的QQ号,4字节

MD5处理的发送方的UID和Session key,16字节

普通消息类型,比如是文本消息还是其他什么消息,2字节

会话ID,2字节,如果是一个操作需要发送多个包才能完成,则这个ID一致

发送时间,4字节,time_t类型数据。用加百力的方法用PETool查看可以看到时间。

发送者头像,2字节

是否有字体属性,4字节,有一般是0x00000001

8字节固定内容。一般为0。

消息的分片数,1字节。大多数消息都比较短这个数据就是1,分一片。

分片序号,1字节,从0开始。经常是0。

消息id,2字节,同一条消息的不同分片id相同

消息类型,这里的类型表示是正常回复还是自动回复之类的信息, 1字节。正常回复为01。

消息正文,长度 = 剩余字节数 - 包尾字体属性长度

字体属性


所以不管你想要什么就可以自己计算偏移量就是了。