2024年3月10日发(作者:)

QQ协议体系概述

1. QQ协议体系概述

2. 请求登录令牌

3. 登录

4. 改变状态

5. 得到好友列表

6. 得到在线好友

7. Keep Alive

8. 得到用户资料

9. 登出

10. 查找用户

QQ的协议非常庞大,这些做一些概述,要注意,不要认为下面的说法一定是对的,只能说

目前看起来好像是这样:

0

加密解密

QQ的加密解密用的是TEA算法(puzzlebird的说法),不详细解释了。QQ的包一般都是加密

的(包头包尾除外),但是有个别包是不加密的,以后 如果不做特别说明,则默认这个包是

需要加密的。此外,用什么密钥加密也有不同,不过基本上都是用会话密钥加密,以后如果

不做特殊说明,表示是用会话密钥加 密。这里要注意一下,有时候你收到的包可能不是用

会话密钥加密的,比如离线的消息。你人都不在了,哪里来的会话密钥?所以服务器在你下

次登录的时候,会把 你还没收到过的消息用密码密钥加密再传给你。这是一种特殊的情况,

要分清楚。

UDP和TCP

QQ支持UDP和TCP登录(如果使用HTTP代理,则相当于TCP登录),UDP登录没有什

么好说的,TCP登录时,不管什么包的开头两字节都是包长度,这个长度包括了这两个字

节。

包头包尾

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 未知 未知 还没怎么研究过这种包是干什么的

请求登录令牌

登录QQ,要发的第一个包就是Request Login Token Packet。这个包会向服务器请求一

个24字节大小的令牌(也不一定是24,只能说目前是24字节),然后在接下来的登录中,

没有这个令牌,你是登录不 了的。这个令牌是在服务器端生成的,具体的生成算法我们当

然还无从得知,但是它肯定是参考了你的IP,你的端口,还有你的其他什么信息生成这个

令牌的。因 为你把在A机器上得到的令牌用到B机器上,你就会登录不了,如果你把A

机器上的IP给改了,你照样也登录不了。

请求包格式

头部

未知的1字节,0x00

尾部

Note: 此包不加密

回复包格式

头部

回复码,1字节,0x00表示成功

登录令牌长度,1字节

登录令牌

尾部

Note: 此包不加密

成功时

操作成功时,核心层会触发QQ_GET_LOGIN_TOKEN_SUCCESS事件,这个事件携带的包

是RequestLoginTokenReplyPacket,可用的字段如下:

replyCode: byte,回复码

0

0

登录

QQ登录目前有多种模式,比如普通QQ号,电子邮件登录,绑定手机号登录,还有什么普