广告位,联系QQ:910488011
当前位置: 首页 > Q协分析 > 手机QQ协议分析 (一)登陆
Q协分析
手机QQ协议分析 (一)登陆
作者: admin  时间: 2012-07-26  点击: 27361

分析了一部分手机QQ的协议,基于TCP的。原来网上的是1.1版本的我主要分析了下1.4的,

因为1.1的账号异常需要发送短信激活,1.4的可以用验证码激活。

大体的是这样的,我基于下面的版本分析的(java代码里面的显示):

基于QQ kjava3版本

Manifest-Version: 1.0

MIDlet-Vendor: Tencent

MIDlet-Version: 3.0.1

手机QQ 3.0 build 021\n此版本专为测试开发

现在是用的易语言实现的部分地方进行测试的,完场后将用VC++重写下。

1,获取通讯地址和端口

http访问这个地址:

http://conf.3g.qq.com/newConf/kjava/aubin2.jsp

获取当前可用的IP和端口以及通讯使用的协议。

文件内容类似下面

其中SERVERCONFIG_TYPE对用后面的SERVERCONFIG_URL。type是类型KQQTCP表示

第一个SERVERCONFIG_URL为TCP通讯的地址个端口socket://58.60.12.177:14000。QQHTTP表示是http通讯的好像1.1的协议就是。

后面的SMSSERVICE_HELPTXT之类的就是QQ登陆进度条界面的广告,用过javaQQ的都知道。

2,获取QQ秀

 手机QQ的QQ秀地址是一个图片也是需要HTTP读取的,地址:

http://qqshow-user.tencent.com/378779555/11/00/1.gif?fr=mobileqq

其中378779555是我的QQ号。QQ号后面的11是大小,测试11时图片大小为70px × 113px,22时图片大小140px × 226px,后面的00和1.gif没有测试出来,不过更改成整数位数相同不影响使用。

3,登陆

发送:

VER=1.4&CON=1&CMD=Login&SEQ=245&UIN=378779555&PS=3CEAFFE01068A5F9C0C5DD0000CBB067&M5=1&LG=0&LC=812822641C978097&GD=QU7YM68W72T5EJZF&CKE=

VER为版本,CMD是命令类型(后面的发包全部都是命令)。SEQ为3位随机数(大于200小于999),

1.1协议的是2位大于00小于99的随机数,我的版本QQ是第一次发包时随机一个200+2位随机数,

每次发送命令后QQ返回的包里面的SEQ都和对应包相同,以后发包时每次在上一个包的SEQ上+1作为新的。

我用易语言按照这个实现通过。

提示 : QQTCP通讯的编码全部为UTF-8,用易语言写的TX注意发包和接受后转换下。

UIN是QQ号,PS是密码用MD5加密的密文。易语言 设定密码为X,密文=到大写 (取数据摘要_MD5 (到字节集 (X)))

LG,M5,LC,GD全部固定值测试通过。

接受:

登陆成功:

VER=1.1&CMD=Login&SEQ=245&UIN=1625034920&RES=0&RS=0&HI=60&LI=300&SG=6522abd500000000642162f3c8f13928337d76f39fc025b6a2e11295d8eb631b&SSG=2618781619

下一步可以发送更新状态的命令来更改上线隐身等。

注意 返回的VER是1.1 其他的可以参考1.1的协议看看。RES=0代表你发送的数据服务器接受成功并不代表命令等正确。

有验证码:

VER=1.1&CMD=VERIFYCODE&SEQ=259&UIN=1747478650&RES=0&SC=1&NT=&VC=89504e470d0a1a0a0000000d4948445200000064000000280403000000fa56427000000030504c5445ffffff9f9f9f4f4f4f5f5f5f6f6f6f7f7f7f8f8f8fbfbfbfefefef0f0f0f2f2f2f3f3f3fcfcfcfafafafdfdfdf1f1f1fac7ca8040000022a49444154388ded943f4c137114c71f207057db4a3062ba99381d13834b3717069caa1112b62e0c4d1c186130b9cd38d9daaa7cdb7a270983b7185c482ed1c4d54143080e5d0c2b1b6cde627ceffd50dafb1798587cc3dde5f77b9fdffbbe3fbf234ab3d97b2bb75d221b4013ff2cd5f5af2db143db356ee7089a394855bd0d625f8c713a6b0fce748d20394cd8273b1549cfa738f793428fe4403b89a485b142e0536010ba1852908d688b5443bc6431c4ba79779f5f0dec38b2a3889d8f348097fc0a7c1a53443773916bb2709f1dda64012764eba61d4786836c62fb009e46a15b78a7fe49644457955505af44df1d2aa3b3f2081a68b464a3f5e2bad280238ca3e71675bfadad194662158eb4755c33071fa6d5e1bd28a32124de0f8952c12ed104fc6ff8b816745da2a9e639926c61b5452548fe9ccd6b2e5dc3975507eb41d34e7aab1decd3aa1f72fedc962e6a748c2ffcfd02bf96bc0c82a433bf37fdf2776d6a8d07a7c66bd3e8555ad9c8c03f2ae007ea3266759a34bd5945b5938d447d9ac21e16b8ce98e1f3b764f13ad0cb244aec6ca185379c80143b5241e5ac6b2536c96af80647588c80752e61dbc885d62113e181acf0b1be780dcce9131a32ddc678b858f94346e67144f45c42a9b2992cc442df0abb785b7afca420c8b8565906b99e998c8300de323bd30db83c2ca6ca94238cbe9a3b46e696b022cfe8cdf9b1f2887d365fc5a7f29c3f95e70039dda7671bc9b522ce52ba84857941d2edd0bd34f2dfae
c4fe0081184f53b008ff0c0000000049454e44ae426082

可见返回的MCD是VERIFYCODE,并且有VC段,试验证明需要输验证码才会出VC段,确定VC就是验证码。

试验证明这段是一个PNG图片。

把16进制的代码还原成字节集,写入文件后缀为PNG格式,就是验证码图片。

本例图片就是:


然后发送验证码:

VER=1.4&CON=1&CMD=VERIFYCODE&SEQ=260&UIN=378779555&SID=&XP=C4CA4238A0B92382&SC=2&VC=puty

注意:SC是验证码接收包的SC+1,XP固定不变。

错误的验证码则继续接受验证码包,正确后返回2个包:

VER=1.1&CMD=VERIFYCODE&SEQ=261&UIN=1747478650&RES=0&SC=2&RS=0
          RS=0为确认标识 为0就为成功。
VER=1.1&CMD=Login&SEQ=261&UIN=1747478650&RES=0&RS=0&HI=60&LI=300&SG=a3125e629c6cb500000000ca8b01bc666218abec75d0118fdbf76003615a5089&SSG=415039481

登陆成功!和上面的直接成功差不多。

注意:本文未考虑返回的其他字段,有些用不到有些是固定的,用到的会在分析是提醒。