网络数据包监视程序开发(九)

来源:互联网 发布:京东火牛软件 编辑:程序博客网 时间:2024/05/18 12:00

       

        还算有点进展,终于把QQ登录时的数据包给彻底的分析清楚了。

        QQ的登录过程在前面的一篇日志里已经说明了,现在就直接说明数据包的格式吧。

        QQ数据报文总的格式

        QQ数据是通过UDP方式传输的,服务器的默认端口号是8000,所有的QQ发送的报文格式如下:

                    

字节 内容及含义 0 报文的开头,大部分都是0x02,也有0x0,0x03,0x04,0x06,与登录有关的报文的包头是0x02 1--2 两个字节的以网络字节顺序表示的QQ版本号 3--4 两个字节的以网络字节顺序表示的命令号 5--6 指令序列号。QQ的指令总是成对出现的,也就是说,一方发出一个命令,将会收到另一方的同样序列号的应答。另外,发送方每条指令的序列号都是上一条指令的加一。有两个方面要注意的是,每一方都维持自己的序列号,也就是说,客户端的当前序列号和服务器的当前序列号是不一致的,当客户端为指令发出方的时候,它使用自己的当前序列号,而服务器作为应答方,在应答的时候使用的接受到的命令的序列号;反之,如果是服务器是指令的发出方,那么它就使用自己的当前序列号,而不用理会客户端上一条指令的序列号。另外一个事情是,由于服务器会同时和多个客户端通信,所以,对每个客户端收到的服务器指令的序列号不是连续的,序列号的连续性不应该作为丢包的判断依据。另外,通信开始客户端的第一个序列号是随机选取的,但似乎没有发现大过0x00ff的。最后的退出登录数据包总是使用0xffff作为序列号,而且是不会有应答的。 7--N

具体的数据,可能加密也可能不加密。

 N+1 包尾,绝大部分是0x03,但有时也是没有的情况,要根据包头判断。

        获得登录令牌

        获得登录令牌的报文格式如下:

字节 内容及含义 0 包头:0x02 1--2 网络字节顺序表示的QQ版本号 3--4 请求登录令牌的命令号:0x0062 5--6 指令序列号,可以随机的 7--10 网络字节顺序的QQ号 11 未知字节:0x00 12 包尾:0x03

        下面这个就是我获取到的QQ请求登录令牌的数据:02  0e  2d  00  62  63  e2  27  04  0d  f6  00  03  ,其中0x0e2d就是登录QQ的版本号,0x27040df6为登录的QQ号:654577142。

        如果成功,服务器会返回数据,这时要检查收到的数据的命令号是否也为0x0062,并且序列号是否为发送是租用的序列号。如果不是,表示有错误,可以继续接收下一个包,直到超时。

       回应包的格式如下:

字节 内容及含义 0 包头:0x02 1--2 服务器标识:0x0000(一般都是) 3--4 0x0062 5--6 序列号,和刚才发往服务器的是一样的 7 0  表示成功 8 令牌数据的长度 9--N 令牌数据 N+1 包尾:0x03

        下面的是我抓到的一个包:

                                                    02  00  00  00  62  63  e2  00  
                                                    18  73  a3  b6  97  09  23  e3 
                                                    79  84  4c  d6   f0   c7  31  92 
                                                    b4  00  eb  89  d7  4e  df   0b 
                                                    9f   03

        0x18表示令牌的数据长度:24,蓝色部分数据就是服务器返回的登录令牌。