QQ2013协议分析(二)TCPF

我们尝试把QQ的协议进行分类

文字聊天协议族(TCPF, Text Chatting Protocol Family):它主要支持与其它QQ客户端进行文字聊天。TCPF是建立在UDP协议之上。UDP数据包中的第一个字符02为这个协议族的标识。TCPF的服务器使用8000号端口,腾讯的QQ客户端软件一般从4000号端口开始尝试使用,但实际上,对客户端使用的端口号并没有限制。目前的研究集中在TCPF上。

其它未知可能存在的协议族:

我们观察到QQ除了与TCPF服务器通信以外,还有与其它的服务器使用UDP进行通信。目前我们观察到的服务器为 218.17.217.111 : 8000。客户端使用与TCPF不同的端口。目前观察到的从客户端发出的包以06开头,而服务器返回的包则以01开头。目前其具体作用未知。我们注意到一个有趣的现象是,如果选择离线后重新上线,那么在发出登录包之前,这个通讯已经开始。我们暂时把它命名为数据传输协议族(DTPFData Transfer Protocol Family)。最新的研究发现,它传递的是QQShow的图片数据。

语音、视频聊天、文件传输:目前还没有开始分析,尚未知道是使用UDP还是TCP协议。

下面说说我们关心的TCPF协议

TCPF是建立在UDP协议上的协议族,主要支持文字聊天功能。TCPF是以请求-响应模式工作的。也就是说,客户端发出一个请求,服务器端会给出一个相应的响应;服务器向客户端发送信息,客户端也会给服务器相应的响应。请求和响应通过相同的序列号来进行配对(请求代码也应该相同)。而且每种请求的发起方都是相同的。

TCPF包结构

对于TCPF包我们又把它分为5类:
1)、登录请求包(LIP,LogIn Packet),它是由 客户端 向服务器发出登录请求的数据包。
2)、登录应答包(LRP,Login Reply Packet),它是由服务器响应客户端登录请求的数据包。
3)、注销请求包(LOP,LogOut Packet),它是由 客户端 向服务器发出注销登录请求的数据包,服务器对这个包不作应答。
4)、 客户端 其它包(CSP,Client Sent Packet),它是由客户端向服务器发送的其它包。
5)、服务器其它包(SSP,Server Sent Packet),它是由服务器向 客户端 发送的其它包。

TCPF包头:

0)、所有TCPF包的前7个字节是包头,包头可以识别TCPF包的内容。包头的格式为:
1)、第0字节:TCPF包标识:0x02。
2)、第1-2字节:发送者标识。如果是0x01 0x00,表明是由服务器发送。客户端的标识与所使用的使用的QQ版本有关,如:版本QQ2003(0808)的标识为0x0A 0x1D。具体的协议的格式与这个字段所标识的客户端版本有关。目前我们以这个最新的0A1D版本来讨论。
3)、第3-4字节:命令编号。具体的命令编号含义在《QQ协议概述》(Protocol Overview.rtf)中有描述。如果这个字段是0x00 0x01,那么这是一个注销请求包。如果这个字段是0x00 0x22,而发送者标识是0x01 0x00,那么这是一个登录应答包。如果这个字段是0x00 0x22,而发送者标识是其它(例如0x0A 0x1D),那么这是一个登录请求包。其它的命令代码表明是其它包,我们通过发送者标识来区分它是CSP还是SSP。
4)、第5-6字节:命令序列号。客户端和服务器都有各自的当前发送序列号。每初始发出一个指令的时候,使用当前的 序列号 ,然后把当前序列号加一,如果超过0xFFFF,就绕回。如果是响应对方发出的命令,则使用这个命令的 序列号 。例如,客户端当前的 序列号 为0x1110,它向服务发送一个0x0016命令,它使用0x1110这个序列号,服务器收到以后,返回一个序列号为0x1110的0x0016命令响应。下一次,客户端又发送一个0x0026命令,这一次它使用加一了的序列号0x1111,服务器也响应0x1111序列号的一个0x0026命令响应。如果这是服务器要向 客户端 发送0x0017命令,它使用它自己的当前序列号,比如说0x2220,客户端收到以后,也响应一个序列号为0x2220的0x0017命令应答。我们可以通过序列号来判断发出的指令是否已经得到了应答,如果没有,可以重发。服务器对收到的命令的序列号顺序没有要求。服务器也不会一定按照发出的顺序给予应答。

TCPF包尾:所有的TCPF包都以0x03作为包尾。

 

你可能感兴趣的:(逆向分析,QQ协议分析)