均指udp数据包应用层或者tcp数据包应用层去掉首部两个字节后的数据
所有qq包的前7个字节是包头包头可以识别qq包的内容。包头的格式为单位字节0
1
2
3
4
5
f6
78b
表一标准头格式
第0字节qq包标识0x02。令牌请求报为0x16下面所有数据报指0x02标识的报
第12字节发送者标识。如果是0x010x00表明是由服务器发送。客户端的标识与所使用的使用的qq版本有关例如qq20xx0808的标识为0x0a0x1d。具体的协议的格式与这个字段所标识的客户端版本有关。
第34字节命令编号。具体的命令编号含义在下面会给出。如果这个字段是0x000x01那么这是一个注销请求包。如果这个字段是0x000x22而发送者标识是0x010x00那么这是一个登录应答包。如果这个字段是0x000x22而发送者标识是其它例如0x0a0x1d那么这是一个登录请求包。
第56字节命令序列号。客户端和服务器都有各自的当前发送序列号。每初始发出一个指令的时候使用当前的序列号然后把当前序列号加一如果超过0xFFFF就绕回。如果是响应对方发出的命令则使用这个命令的序列号。例如客户端当前的序列号为0x1110它向服务发送一个
0x0016命令它使用0x1110这个序列号服务器收到以后返回一个序列号为0x1110的0x0016命令响应。下一次客
f户端又发送一个0x0026命令这一次它使用加一了的序列号0x1111服务器也响应0x1111序列号的一个0x0026命令响应。如果这是服务器要向客户端发送0x0017命令它使用它自己的当前序列号比如说0x2220客户端收到以后也响应一个序列号为0x2220的0x0017命令应答。我们可以通过序列号来判断发出的指令是否已经得到了应答如果没有可以重发。服务器对收到的命令的序列号顺序没有要求。服务器也不会一定按照发出的顺序给予应答。
因此qq的数据包头可以如下定义下列数据结构不能数据对齐
pragmapack1qq数据包固定头部
typedefstructqq_head
u
sig
edcharhflagsu
sig
edshortversio
u
sig
edshortcmdu
sig
edshortseque
ce
固定数据0x02十六进制使用的协议版本号网络字节序命令表示本数据包的性质网络字节序序列号参照的tcp方式具体含义间上文网络字节序
qq_head_t
udp数据包头部
typedefqq_head_tudp_qq_head_t
ftcp数据包头部typedefstructtcp_qq_head
u
sig
edshortpackle
qq_head_thead
tcp_qq_head_tpragmapack包尾
所有的包都以0x03作为包尾。在包头和包尾中间的包数据则不同类型的包有所不同。
qq的命令本地字节序
qq命令字即qq报头数据结构中的cmd项位于数据报头的34两字节是一系列的表示但前数据包内容作用的标识。在本文中用枚举的方式把网络上已经分析出来的部分命令列举如下
typedefe
um
qq_cr