2011年1月12日星期三

QQ2010协议分析(登录篇)

七月份的时候突然对QQ协议产生了些兴趣,于是这几个月有空就研究研究QQ协议,目前对QQ2010的协议已经分析得差不多了。现在跟大家分享一下我的成果。
QQ登录分为UDP和TCP登录,还支持代理登录。默认是UDP登录。UDP登录端口服务器为8000,本地端口一般是从4000开始选择,如果该端口已经被占用,则加1再测试,一直测试到一个没有被占用的端口。

TCP登录服务器一般是80或者443端口,本地端口选择方式和UDP一样。
这些登录方式登录设置里面可以自由选择。但是无论哪种方式登录,其登录流程和数据包格式都是一样。QQ登录时需要进行6次与服务器的交互,每次交互均伴随着登录相关信息的搅浑。QQ登录主要分6步。

1.0x0091 Touch包
该 数据包是QQ客户端登录时发送的第一个包,它的作用在于测试远程服务器是否能够正常响应,根据我们的抓包分析,对于不同的QQ号码段,提供服务的QQ服务 器是不相同的,对于QQ会员有专门的QQ会员服务器。在对QQ客户端的回应包中,如果连接的服务器不对该QQ号码提供服务,它会返回另外一个服务器地址, 让客户端重新连接该地址。
     0x0091发送包:
  02 1E 07 00 91 5B B8 04 EE D4 E9 02 00 00 00 01
  01 01 00 00 64 2F 6A 84 FA 78 CC 16 51 86 A7 B8
  1C 55 E8 29 6B C8 50 95 FB 5A CE E8 6C 89 0A C9
  83 D0 68 51 DB 6E D1 93 C1 32 11 9B 84 13 EF 7D
  4B 55 8C 08 6C F3 F0 5F 11 16 26 E4 00 68 0D 98
  02 BC 06 B9 4E E2 03
  [
  02 //包头
  1E 07 //版本号
  00 91 //命令
  5B B8 //包序号
  04 EE D4 E9 //QQ号码:82760937
  02 00 00 00 01 01 01 00 00 64 2F //固定,QQ版本号不同则不同
  6A 84 FA 78 CC 16 51 86 A7 B8 1C 55 E8 29 6B C8 //0x91密钥
  00 01 //固定两字节
  00 00 08 04 01 E0 //0091Data01(在后面的命令里面要用到的)
  00 00 03 20 00 00 00 01 00 00 0B BF //0091Data02(在后面的命令里面要用到的)
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //首次发送为15字节0
  03 //包尾
  ] 
    0x0091接收包:
     02 1E 07 00 91 5B B8 04 EE D4 E9 00 00 00 C0 EB
  D0 BF C5 F9 E1 F2 C9 51 9D 3B 26 07 B5 AD 46 49
  49 C4 49 D7 69 36 9E 11 8E 24 2E A1 B3 AB 90 CE
  CA 38 C9 99 94 8E 0A 41 03 EB AC E7 C6 BA 34 FD
  64 9E E7 4B 3D 24 6F 44 0A 77 80 69 96 91 0C 00
  87 6B 51 25 E5 15 9F E3 54 6E B8 C6 1D 5F DE 40
  54 BB D8 0C 36 8D 03
  [
  02 //包头
  1E 07 //版本号
  00 91 //命令
  5B B8 //包序号
  04 EE D4 E9 //QQ号码:82760937
  00 00 00 //固定全为0
  00 //接触成功
  4D 16 07 CC //登录时间:2010-12-25 23:03:40
  7D 47 C8 04 //登录IP地址:125.71.200.4
  00 00 00 00 00 00 00 00 //固定8字节0
  00 38 //0091_Token长度:56字节
  6E F0 FB 35 5F 8E 65 0F 77 E7 A7 D0 AE 69 8C 4D
  EF 43 41 89 BB 79 9C B9 B5 0C 4C 86 5E 8D A0 CB
  84 D7 66 69 CF 63 E9 0D 80 48 F4 E6 C1 30 A7 88
  7E B0 68 0A E6 8C FC D4
  00 //接触成功
  03 //包尾
  ]

2 0x00BA获取验证码
因为部分QQ号码可能存在异地登录,或者QQ号码被盗发送大量垃圾信息,或者用了挂机软件或者挂机网站挂机,腾讯服务器检验到这些非正常的QQ情况时即会要求输入验证码。以下分析我都直接截取QQAnalyzer的分析图片。贴分析代码比较麻烦,关于QQAnalyzer的介绍和下载请看这篇博客:http://www.cnblogs.com/83008911/archive/2010/10/09/QQAnalyzer.html
0x00BA发送包
 
0x00BA接收包

3 0x00DD密码验证
该数据包的作用是将本地QQ的密码发送给服务器端进行验证。
0x00DD发送包



0x00DD接收包


4 0x00E5数据校验
该数据包主要用于校验前几个数据包的Token数据,如果通过验证,服务器端会返回本次登录的时间和IP地址等信息。

0x00E5发送包


0x00E5接收包




5 0x00E3数据校验
0x00E3发送包



0x00E3接收包

6 0x0030获取会话密钥
该数据包是QQ登录流程的最后一个数据包,主要用于向QQ客户端返回会话密钥(Session  Key),该会话密钥由服务器端生成,目前不知道其生成算法。但是估计和QQ号码,登录IP,登录时间以及QQ密码有关。
0x0030发送包





























0x0030接收包 


























以上就是一个完整的QQ登录流程,我们可以看到,腾讯对于登录的设计是相当巧妙而安全的,既能安全的将客户端密码账户传递到服务器端验证,又能保证
数据即使被截获也无法获取太多有用的信息,不过个人觉得部分登录过程有些冗余,一些数据包可以整合为一个直接发送至服务器端。
下一篇博客即将为大家 带来QQ 2010的消息发送和接收分析,还有QQ的右下角广告弹出窗口的分析,目前发现这个弹出窗口存在一些漏洞我们可以利用从而轻易
获取QQ的账号和密码。
腾讯。。。啦啦啦。。。
对QQ协议有兴趣的可以加这个群:62596902
来自博客园

没有评论:

发表评论