|
登录QQ,如果本次输入的QQ密码和上一次登录的密码不一样,QQ客户端会发出0x0018命令去服务器验证,现把0x0018命令详细生成方法公布如下:
0x0018命令:
命令格式:
字节 内容
0-1 数据包长度: 0x01 0xe6 = 486
2 报文开始标志: 0x02
3-4 QQ版本 0x0f 0x4b //2006 beta 3 版本
5-6 命令 0x00 0x18
7-8 序列号 随机
9-12 QQ号
13-28 16位随机数(成为:A)
29-484 456位加密数据
485 0x03报文技术标志
现在讨论29-484的数据是怎么生成的,称为DATA:
首先:数据生成用到了tea和md5算法,
其中tea加密又分两种(核心加密不变,只是随机数的选择和填充有变化),称为:
a:encrypt
b:encrypt_18
以上两种加密算法,可参考另外文档或直接读程序.
开始生成数据:
1.用版本号第1位(此版本是0x0f)加上,QQ号码(4字节二进制数据),共5个字节做md5,生成16字节数据,成为B
2.用版本号第2位(此版本是0x4b)加上,QQ号码(4字节二进制数据),共5个字节做md5,生成16字节数据,成为C
3.用B+C共32个字节做md5,生成16字节数据D
4.把D和C这两个16字节数据进行异或操作C^D生成16字节数据E
5.把E和A这两个16字节数据进行异或操作E^A生成16字节数据F
6.把F和C这两个16字节数据进行异或操作F^C生成16字节数据G_KEY
7.encrypt(NULL,0, passkey, H, 'H'的长度=16);
用encrypt算法,对NULL进行加密,以passkey(passkey是QQ密码的两次md5)为加密用的key,生成H,长度16.
8.生成加密前的原始数据BUFFER:
0-15:H
16:0x00
17:0x00
18:0x18
19-42:0x0062命令返回后的24字节数据(关于0x0062:token命令参考其他文档)
43:0x01
44:0x90
45-444:0x00
9.加密BUFFER:
encrypt_18(BUFFER, 445, G_KEY, DATA, 长度=456);
用encrypt_18算法,对BUFFER进行加密,G_KEY为加密用的key,生成DATA,长度456.
通过以上复杂算法,终于生成了0x0018命令的所有数据. |
|