title | description | date | categories | slug | |
---|---|---|---|---|---|
QQ协议分析 |
QQ协议分析 |
2014-04-16 |
|
qq-protocol |
它主要支持与其它QQ客户端进行文字聊天. TCPF是建立在UDP协议之上. UDP数据包中的第一个字符02为这个协议族的标识. TCPF的服务器使用8000号端口, 腾讯的QQ客户端软件一般从4000号端口开始尝试使用, 但实际上, 对客户端使用的端口号并没有限制. 目前的研究集中在TCPF上.
在PC(Windows)上使用wireshark对qq客户端进行抓包, 使用oicq
进行过滤, 即为TCPF协议.
对于TCPF包我们又把它分为5类:
- 登录请求包(LIP, LogIn Packet), 它是由客户端向服务器发出登录请求的数据包.
- 登录应答包(LRP, LogIn Reply Packet), 它是由服务器响应客户端登录请求的数据包.
- 注销请求包(LOP, LogOut Packet), 它是由客户端向服务器发出注销登录请求的数据包, 服务器对这个包不作应答.
- 客户端其它包(CSP, Client Sent Packet), 它是由客户端向服务器发送的其它包.
- 服务器其它包(SSP, Server Sent Packet), 它是由服务器向客户端发送的其它包.
所有TCPF包的前7个字节是包头, 包头可以识别TCPF包的内容. 包头的格式为:
- 第0字节: TCPF包标识: 0x02, wireshark中解析为: FLag: oicq packet(0x02)
- 第1-2字节: 发送者标识. 如果是0x01 0x00, 表明是由服务器发送. 客户端的标识与所使用的使用的QQ版本有关. 我的QQ版本: QQ5.3(10702), 使用wireshark抓包得到: Version: 0x350b, 0x3511
- 第3-4字节: 命令编号. 具体的命令编号含义在<QQ协议概述>(Protocol Overview.rtf)中有描述. 以QQ2013为例, 如果这个字段是0x00 0x59, 那么这是一个注销请求包. 如果这个字段是0x08 0x25, 而第12位为 0x00, 那么这是一个登录应答包. 如果这个字段是0x08 0x25, 而第12位为 0x03, 那么这是一个登录请求包. 其它的命令代码表明是其它包, 我们通过发送者标识来区分它是CSP还是SSP.(与我抓包数据不符, 暂时保留不修改)
- 第5-6字节: 命令序列号. 客户端和服务器都有各自的当前发送序列号. 每初始发出一个指令的时候, 使用当前的序列号, 然后把当前序列号加一, 如果超过0xFFFF, 就绕回. 如果是响应对方发出的命令, 则使用这个命令的序列号. 例如, 客户端当前的序列号为0x1110, 它向服务发送一个0x0016命令, 它使用0x1110这个序列号, 服务器收到以后, 返回一个序列号为0x1110的0x0016命令响应. 下一次, 客户端又发送一个0x0026命令, 这一次它使用了加一的序列号0x1111, 服务器也响应0x1111序列号的一个0x0026命令响应. 如果这时服务器要向客户端发送0x0017命令, 它使用它自己的当前序列号, 比如说0x2220, 客户端收到以后, 也响应一个序列号为0x2220的0x0017命令应答. 我们可以通过序列号来判断发出的指令是否已经得到了应答, 如果没有, 可以重发. 服务器对收到的命令的序列号顺序没有要求. 服务器也不会一定按照发出的顺序给予应答.
所有的TCPF包都以0x03作为包尾.
qq使用UDP端口8000作为主要通信端口, 端口HTTP(80)和HTTPS(443)也是可接受的. 客户端会尝试连接8000端口, 如果失败他会自动尝试80和443端口.
wireshark/epan/dissectors/packet-oicq.c
对qq协议的判定不过准确, 只能识别出是udp,和8000端口的ndpi/src/lib/protocols/qq.c
解析的跟强