一、 概述
QQ是目前流行的及时聊天工具,QQ协议非常庞大,版本升级比较频繁,而且与多数软件不同的是,它的客户端升级往往伴随着协议响应的改变。本文是基于QQ2008版的QQ协议分析。QQ消息是加密的,QQ的加密解密用的是TEA算法,几乎无法破解QQ消息内容。但是可以根据QQ包头和协议格式识别QQ数据。
QQ支持TCP和UDP传输,经过观察基于UDP可以用端口再根据协议特征方式识别;而基于TCP的HTTP方式可以根据协议识别QQ数据。
二、 QQ协议分析及数据特征
QQ协议有多种包头,每种用途分别代表一类用途的包,但不是所有的包都有包尾,以下是一些存在的包头包尾的格式:
包头 | 包尾 | 包头之后的固定格式 | 说明 |
0x00 | 无 | · 发送方QQ版本,或者是服务器版本,2字节 · 随机密钥,1字节,如果这个字节是0x23,那么密钥就是0x23232323,这个密钥用来加密发送者和接受者的QQ号。加密算法: QQ号取反再与密钥异或 · 发送者QQ号的加密形式,4字节 · 接受者QQ号的加密形式,4字节 |
0x00系列的包,用在文件传输过程中,传递控制信息。也会出现在点对点通信中。 |
0x02 | 0x03 | · 源标志, 2字节,表示了这个包从何处来,主要用来标识客户端版本,如果其标识的是服务器,这个字段的具体用处还不清楚 · 包命令, 2字节 · 包序号, 2字节, 原则是保证短期内这个序号不要重复就可以,一般我们处理的时候都是递增,到最大再归0 |
0x02系列包主要完成一些基本任务,基本上处理了这个系列的包,QQ的功能就差不多了。 |
0x03 | 无 | 格式同第一行 | 0x03系列的包,用在文件传输过程中,传递数据信息 |
0x04 | 0x03 | · 客户端版本号,2字节 · 整个的包长,2字节 · 序号,2字节 · 我的QQ号,4字节 · 未知的8字节 |
0x04系列的包,用在文件传输过程中,如果使用服务器中转模式传送文件,则用到这些包 |
0x06 | 未知 | 未知 |
例1:
00 1b 0c ce 5b c9 00 1d 72 9a 8e 1d 08 00 45 00
00 67 0f 87 00 00 80 11 ed da c0 a8 22 34 3a 3d
20 0b 0f a0 1f 40 00 53 9d b6 02 01 00 00 00 38
05 3d e2 54 00 00 6a 23 01 00 12 37 80 21 ae 29
fe 9f 91 b0 23 48 8d 12 39 8e 5f e9 76 14 80 69
04 1c f1 69 70 6b cf 04 71 66 92 e6 ea 24 41 63
02 54 3a aa e8 17 5e 6b 27 a3 99 2a 18 29 e5 fb
51 64 93 d7 03
-------------------------------------------------【02开头,03结尾】
例2:
00 1b 0c ce 5b c9 00 1d 72 9a 8e 1d 08 00 45 00
00 59 0f c1 00 00 80 11 c1 9a c0 a8 22 34 77 93
0e c9 17 71 1f 40 00 45 5f 7a 03 50 32 b0 00 00
00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 01 00 00 12 37 00 00 00 00 00 00 00 00 00
00 05 00 05 3d e2 54
-------------------------------------------------【03开头,无结尾】
在用Ethereal抓包过程中发现有些8000端口的UDP数据包,有0x02包头但没有0x03包尾,但它确实属于QQ数据,不知道是什么原因。
根据观察,QQ除了使用UDP通讯,还与TCPF服务器通讯,而且与TCPF服务器的通讯量远远大于UDP通讯量。文本聊天就是这一类型,下面就简要介绍TCPF协议。
TCPF(Text Chatting Protocol Family)文本聊天协议族,它主要支持与其它QQ端进行文字聊天,TCPF是建立在UDP协议上的协议族。
TCPF格式为:包头+数据+包尾。
包头:所有的TCPF包的前七个字节是包头,包头可是识别包的内容,包头格式为:
第0个字节:TCPF包标示:0x02。
第1-2个字节:发送者标识,如果是0x01 0x00,表明是由服务器发送,客户端的标识与所使用的QQ版本有关。
第3-4个字节:命令编号。
第5-6个字节:命令序列号。
包尾:所有的TCPF包都以0x03作为包尾。
在包头和包尾中间的数据分为以下五类:
登录请求包(LIP,LogIn Packet),它是由客户端向服务器发出登录请求的数据包。
登录应答包(LRP,Login Reply Packet),它是由服务器响应客户端登录请求的数据包。
注销请求包(LOP,LogOut Packet),它是由客户端向服务器发出注销登录请求的数据包,服务器对这个包不作应答。
客户端其它包(CSP,Client Sent Packet),它是由客户端向服务器发送的其它包。
服务器其它包(SSP,Server Sent Packet),它是由服务器向客户端发送的其它包。
具体TCFP包结构请参阅QQ协议分析之TCPF包结构.htm文档。
用Ethereal抓包发现存在大量TCPF协议格式的QQ数据走的是80端口的HTTP方式。下面是一个HTTP的TCP流的16进制数据:
00 3e 02 12 37 00 91 26 64 05 3d e2 54 32 b8 c2
bf a4 d2 65 4b e9 8e d5 4f 23 51 74 f6 64 55 d2
57 d3 d9 64 78 77 77 ef ed cc 78 67 db 00 de 12
a0 12 b1 82 96 1c 8b c0 c8 53 a9 4d 83 03
下面介绍QQ传送文件数据包。文件传输是建立TCP连接之上的,其格式是包头为0x04包尾为0x03,其包的格式如表1所述。下面是用Ethereal软件抓取的文件发送包的某个部分:
04 12 37 00 68 00 01 61 83 05 3d e2 54 00 00 00
00 00 00 00 00 00 38 3a 4c a0 8e 74 d7 b4 3a d1
c7 67 8f c4 16 69 9f 44 f8 ae e8 68 5a c2 ca 0c
bf 48 86 26 2c 85 b8 ab ae d2 b1 f9 a8 6b b8 92
a3 a9 bd 51 38 ca d7 ae ce c3 f0 64 c4 a8 db a5
9b df c1 9f cd 65 35 41 0d 12 8c 2a dc 25 0f a1
64 83 4e b9 92 91 5d 03
还有一种文件传输情况不符合上述规律,在传输文件的包中前几个字节是:
04 12 21 …
或者是 27 00 00 00 00 14 00 00 00 00 01 05 (需要记录这组会话的IP地址和端口号,之后这组会话之间的数据就是QQ文件传输数据)
三、 总结
综上说述,QQ数据具有以下特征,UDP数据具有固定端口8000,并且数据格式如上述表1中讲述。TCP数据有两类一种是是基于HTTP的TCFP包格式的文本聊天数据,其特征可根据TCPF包的包头和包尾特征识别,另一种是文件传输,可根据数据包的特征识别数据。
以上分析包含QQ文本聊天、登陆、登出、文件传输等大部分QQ数据,QQ还有一些未知的协议无法得知。
此外由于版本问题,不同QQ版本可能QQ数据有所不同。
http://wenku.baidu.com/view/f2f5eba9d1f34693daef3e1b.html