最近对QQ和MSN的通信协议比较感兴趣,所以经过一些资料搜寻对手头上的QQ进行了以下分析。目前使用的qq是2007Beta1 V07.0.101.173版本。
主要的参考资料是Red_AngleX对QQ2006登录协议包的一些分析,地址是http://blog.csdn.net/red_angelx/archive/2006/11/13/1381351.aspx 我只是按照步骤将我的分析过程记录了下来

  在这里我使用的抓包工具是Ethereal(的确很难用,拼数据包,把我拼得半死),下面是QQ登录时候数据包的一个截图

另外还用到一个工具就是QQDebug,用来TEA加密解密的,大家可以搜搜,如果没有也可以找我要。

好了,让我们开始吧:
,QQ的数据包分为发出的包和接收的包两种,总体来说这两种数据包都包含3部分,包头,加密包体,包尾,只是出和入的包头有些不同

11位包头

00     0x02  QQ数据包开始标志

01-02       QQ的版本号,2006B3为0x0f4b

03-04       请求的命令

05-06       随机序列号,标志包的唯一性

07-10       4个字节的QQ号码   例如 76147561 就是 04 89 eb 69

 

0000  00 90 1a a0 de 3f 00 0d  87 b0 dd 0b 88 64 11 00   .....?.. .....d..

0010  0f a6 00 52 00 21 45 00  00 50 57 e0 00 00 40 11   ...R.!E. .PW...@.

0020  5d 30 3a 3c 73 b8 db 85  3c 13 0f a0 1f 40 00 3c   ]0:<s... <....@.<

0030  4b b2 02 10 1f 00 ba 7e  19 04 89 eb 69 49 5c bd   K......~ ....iI\.

0040  3b 90 18 18 c2 74 3f 6e  a0 79 92 8b 42 c1 18 68   ;....t?n .y..B..h

0050  42 00 5a 9f 8b f2 02 f6  e6 e8 b4 1a 14 0d 44 c2   B.Z..... ......D.

0060  e2 e1 96 d6 fe 03                 ..1..v.. l.     

【包分析】

这是向腾讯服务器发出的LOGINTOKEN 数据请求包,特征是请求命令00 ba

02就是数据包的开始标志

10 1f QQ的版本号,我这里是2007版本的

00 ba 请求命令。ba是请求LoginToken。命令QQ_CMD_REQUEST_LOGINTOKEN = 0xba;

7e  19 随机序列号,标志包的唯一性

04 89 eb 69 我的qq号码,可以直接使用计算器将04 89 eb 69 以16进制输入,再直接转为10进制就是76147561.所以分析时候也可以将分析的qq号码输入计算器后直接转为16进制后再在包内数据中查找即可。接下去的数据就是包体了

49 5c bd 3b 90 18 18 c2 74 3f 6e a0 79 92 8b 42 是key值,即是进行TEA加密解密的密钥

03 是数据包结束的标志,也就是包尾

 

 

0000  00 0d 87 b0 dd 0b 00 90  1a a0 de 3f 88 64 11 00   ........ ...?.d..

0010  0f a6 00 56 00 21 45 00  00 54 00 00 40 00 3a 11   ...V.!E. .T..@.:.

0020  7b 0c db 85 3c 13 3a 3c  73 b8 1f 40 0f a0 00 40   {...<.:< s..@...@

0030  2b bb 02 10 1f 00 ba 7e  19 dc f3 57 63 99 3e 08   +......~ ...Wc.>.

0040  f8 2e e8 22 18 93 ea 9e  bb 39 0e 48 8d 04 be af   ...".... .9.H....

0050  06 54 95 70 ae 82 79 df  d3 67 4d ab 6d bf d1 e9   .T.p..y. .gM.m...

0060  1c e4 59 69 31 fa 54 f9  3a 03                     ..Yi1.T. :.

【包分析】

这是腾讯服务器返回的LOGINTOKEN 数据包,特征是请求命令00 ba

00表示请求成功

02 10 1f 00 ba 7e  19 这段数据和上次向腾讯服务器发出的请求数据的意义是一样的。

dc f3 57 63 99 3e 08 f8 2e e8 22 18 93 ea 9e bb 39 0e 48 8d 04 be af 06 54 95 70 ae 82 79 df d3 67 4d ab 6d bf d1 e9 1c e4 59 69 31 fa 54 f9 3a 这串数据是服务器返回的数据,是经过TEA加密过的。所以要使用刚才请求数据包中的key值作为密钥来解密

以下是解密的结果

01 00 05 00 00 20 48 A4 AF 3E A8 0D 8D D5 E6 7A 21 4D 91 21 69 1B 2D 61 B8 F9 71 EE 02 10 FB 83 33 C1 5E 5C E8 C3

【结果分析】

20是LoginToken长度 也是16进制,换成十进制就是32 可以数数后面的数据也是32位

48 A4 AF 3E A8 0D 8D D5 E6 7A 21 4D 91 21 69 1B 2D 61 B8 F9 71 EE 02 10 FB 83 33 C1 5E 5C E8 C3 粉红色部分为请求的LoginToken

 

 

 

0000   00 90 1a a0 de 3f 00 0d 87 b0 dd 0b 88 64 11 00  .....?.......d..

0010   0f a6 02 0a 00 21 45 00 02 08 57 e3 00 00 40 11  .....!E...W...@.

0020   5b 75 3a 3c 73 b8 db 85 3c 13 0f a0 1f 40 01 f4  [u:<s...<....@..

0030   37 bb 02 10 1f 00 22 7e 1c 04 89 eb 69 d9 d3 67  7....."~....i..g

0040   95 fc e3 06 8a e8 fb 6a 98 50 51 01 44 6b 6a 4e  .......j.PQ.DkjN

0050   ba c7 76 b5 05 a8 53 d5 b6 61 87 e8 13 8e 5d 6c  ..v...S..a....]l

0060   5e c2 45 ef bc 60 28 63 68 8e 34 57 ef e5 f9 80  ^.E..`(ch.4W....

0070   c5 a5 37 00 99 85 76 67 61 70 31 ac d9 86 ed 1b  ..7...vgap1.....

0080   2a 53 9b ee 66 9f 93 36 44 db ac ec 2b 2a 13 ee  *S..f..6D...+*..

0090   b2 82 3a 5d bb 51 42 76 bc 2d c3 80 10 c0 b6 9c  ..:].QBv.-......

00a0   b1 f6 f8 e0 77 e6 21 6b 89 90 d9 ed d0 97 d5 5b  ....w.!k.......[

00b0   ea 3c bd 4b f9 2a 72 b2 81 2e 92 09 43 68 5e b1  .<.K.*r.....Ch^.

00c0   36 fd 9a 27 df 05 27 66 05 98 92 ae 1b e7 3d 1f  6..'..'f......=.

00d0   b9 46 3c 1f fc b8 b9 78 91 0e bb 14 64 96 e5 0f  .F<....x....d...

00e0   df 08 3f ca 7e 13 56 a3 f9 07 8d f7 d6 12 ba 42  ..?.~.V........B

00f0   87 59 15 ca b5 99 7f 63 1d b9 6d 4c a8 b0 24 ba  .Y.....c..mL..$.

0100   fb e4 cb 7e 50 17 1e 82 c0 05 79 eb 7a 58 29 d4  ...~P.....y.zX).

0110   9f 40 2c 19 bb a6 31 ac fc 33 13 9d 79 5a fb 36  .@,...1..3..yZ.6

0120   99 a2 5b ae b7 ee 80 25 7d 63 aa 7e b2 3d d2 01  ..[....%}c.~.=..

0130   91 1f ac b0 68 cf e8 e9 3c 42 9f df 2b 5b 0c c6  ....h...<B..+[..

0140   b8 21 ef 84 7e 45 d0 51 b5 bf bc 0f ad 4a e9 98  .!..~E.Q.....J..

0150   94 0e 79 39 69 b1 76 9f 2f c4 3a bb 8e c3 f6 b7  ..y9i.v./.:.....

0160   5c 00 ac 44 43 94 b0 e2 09 2f 49 dd 7f aa ce 41  \..DC..../I....A

0170   2b d2 43 e0 ec 83 9c 7e 97 39 87 25 cf e7 9f bc  +.C....~.9.%....

0180   19 4c 30 97 2d 06 f1 e8 09 b0 21 47 ea 56 36 54  .L0.-.....!G.V6T

0190   71 1c b4 26 1b ba ac 4d dc 19 81 d0 5c 38 99 94  q..&...M....\8..

01a0   e8 82 80 1a 0b 2f 87 db e5 04 ce 27 c1 6c ce ed  ...../.....'.l..

01b0   94 ad 4a cb a5 9f c9 b5 f5 a9 e4 61 2e 53 6c 13  ..J........a.Sl.

01c0   ad 80 3e 76 85 92 e5 4f 12 97 1e d3 f2 54 d2 03  ..>v...O.....T..

01d0   82 9f 88 48 38 ec 52 b2 99 bf a1 90 bf 37 a1 13  ...H8.R......7..

01e0   e3 f0 e5 39 ed 3d 26 80 f1 d4 8e 52 9c 2e 1e 89  ...9.=&....R....

01f0   4b 98 6b 71 97 48 24 93 46 2a 2e 4b 5b 87 21 6c  K.kq.H$.F*.K[.!l

0200   fc a2 06 e0 bd 76 50 af 64 81 63 78 05 2f 64 e9  .....vP.d.cx./d.

0210   48 01 3b 1a 7a f5 a3 87 f6 a4 b4 92 96 03        H.;.z.........

【包分析】

这是登录请求数据包,特征是00 22

10 1f 00 22 7e 1c 04 89 eb 69 这段数据和上次向腾讯服务器发出的请求数据的意义是一样的。

d9 d3 67 95 fc e3 06 8a e8 fb 6a 98 50 51 01 44  是加密key

接下去的部分是加密部分,需要用TEA解开,解密后结果如下:

E5 4D 37 99 C4 3C 66 10 D2 79 95 FE EB 1B 64 C4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 73 40 21 74 2F 9D E5 A1 07 7E 7F C3 6D 1E 4A 93 E6 28 00 00 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FC B7 21 55 72 D7 F3 42 80 6F 83 9F A0 78 B7 8C 20 48 A4 AF 3E A8 0D 8D D5 E6 7A 21 4D 91 21 69 1B 2D 61 B8 F9 71 EE 02 10 FB 83 33 C1 5E 5C E8 C3 01 40 01 AF 3C A6 36 00 10 47 EF BF 4F 8B 46 53 C1 0F 87 D7 8D 45 B0 FA 2F 00 00 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 44 79 10 AC 00 10 63 E5 13 95 F7 67 84 3C 12 84 D4 8C 4A FF F4 4C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

【结果分析】

000 - 015 : E5 4D 37 99 C4 3C 66 10 D2 79 95 FE EB 1B 64 C4

是以用户密码的2次MD5计算后的值为密钥加密空字节流的结果。用密码的两次MD5作为密钥加密任意一个东西,服务器只看能不能正常解密,其他的不管.有人分析说这个东西变了,其实只是有些解密工具解不出这个包(可能是官方加的空字串),但是确是还是用TEA加密的.

比如我的密码2次MD5加密后是6D 26 7D B4 D1 55 40 7E 44 F8 2D 9E E7 3A B0 30,将其作为密钥key,解密E5 4D 37 99 C4 3C 66 10 D2 79 95 FE EB 1B 64 C4得出来的结果就是一个空字符串,什么也没有

 

016 - 051 固定组合

052:登录方式 登录方式 正常 0x0a,隐身 0x28

053 - 093 固定组合

094 LoginToken的长度  这个版本是0x20 也就是32位长

095 - 127 LoginToken内容

48 A4 AF 3E A8 0D 8D D5 E6 7A 21 4D 91 21 69 1B 2D 61 B8 F9 71 EE 02 10 FB 83 33 C1 5E 5C E8 C3 01

余下的是固定组合

 

 

 

0000   00 0d 87 b0 dd 0b 00 90 1a a0 de 3f 88 64 11 00  ...........?.d..

0010   0f a6 00 ee 00 21 45 00 00 ec 00 00 40 00 3a 11  .....!E.....@.:.

0020   7a 74 db 85 3c 13 3a 3c 73 b8 1f 40 0f a0 00 d8  zt..<.:<s..@....

0030   c4 9d 02 10 1f 00 22 7e 1c 9f a1 7b d9 ec f6 54  ......"~...{...T

0040   20 76 19 5d bf 21 c6 b6 8a 17 74 ef c8 43 d9 f8   v.].!....t..C..

0050   4d 24 61 18 1b fb 35 2d ed 6b 1b 55 76 7c 59 a5  M$a...5-.k.Uv|Y.

0060   26 ea db 2a 0e d9 c6 ac 83 56 f1 cd 44 00 e1 0b  &..*.....V..D...

0070   bc e4 b3 d5 6f 81 84 85 95 ad c8 65 6d d2 78 ed  ....o......em.x.

0080   b7 1e 6c bf 1e 83 48 91 b3 11 3f 87 b2 86 04 6a  ..l...H...?....j

0090   35 05 5b f6 b7 d5 7d 92 0b c8 18 92 00 21 0a 45  5.[...}......!.E

00a0   c7 dc 0f 7b 51 dc a1 49 26 c8 0b 7f 91 0d 21 a6  ...{Q..I&.....!.

00b0   26 eb f9 da 81 33 c8 fb a5 74 92 2c 69 6f 39 f9  &....3...t.,io9.

00c0   b3 0d db 82 41 1d 52 00 68 18 eb a6 e3 f1 44 32  ....A.R.h.....D2

00d0   c0 62 41 a7 0c 6d f4 bf c7 13 5a 89 3b 7b 43 79  .bA..m....Z.;{Cy

00e0   19 20 c6 89 3e a5 27 af 76 4d 6f 94 3a 4c ec df  . ..>.'.vMo.:L..

00f0   ca 24 5b 6b fd 06 80 9b 98 dc 70 fa ee b9 f8 6a  .$[k......p....j

0100   d7 03                                            ..

【包分析】

这是登录返回数据包,特征是00 22

注意:服务器会返回的这个数据包,解密包体后有4种结果,登录成功,重定向服务器,登录失败,密码错误.这个版本有点特别,登录成功事件的解包密钥是两次MD5的密码HASH,其他的事件则是初始化的Key.这里我们是登录成功,所以用的密钥是两次MD5的密码HASH。而其他的事件则是初始化的Key就是刚开始的key值49 5c bd 3b 90 18 18 c2 74 3f 6e a0 79 92 8b 42

02 10 1f 00 22 7e 1c  这段数据和上次向腾讯服务器发出的请求数据的意义是一样的。

蓝色部分是经过以qq密码二次md5加密后的值为密钥的ETA加密后的一段密文,解密后结果如下

00 4B 70 54 57 46 42 6A 4D 79 33 7A 67 41 70 41 43 04 89 EB 69 3A 3C 73 B8 0F A0 7F 00 00 01 1F 40 46 28 AB 8F 03 0A E8 D9 34 D6 B4 06 6D 20 DB D7 56 57 7A 61 0F A8 21 F2 C1 5D 59 AA EF 3B 3D 8D C2 CF 1F 40 CA 68 C1 1A 1F 40 00 41 42 40 00 00 00 00 FB 5F 92 1B 09 C4 A2 4F EE E5 4F 23 4A 67 56 85 A8 4D 2C 81 46 13 A9 29 32 C4 A8 9C 30 BE C2 89 00 00 00 01 00 00 00 00 00 00 00 00 DF 1E 55 61 46 28 A5 11 46 28 90 17 46 28 88 83 00 0A 00 0A 01 00 00 0E 10 01 14 8F FE 4F BA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 02 04 08 08 08 08 08 04 02

【结果分析】

00:解出包体第一位代表登录状态 0x00 ->成功   0x01->重定向   0x05->登录失败  0x09->密码错误

4B 70 54 57 46 42 6A 4D 79 33 7A 67 41 70 41 43 :SessionKey以后的通信很多都是用这个为密钥,所以很重要

 好了,到这里,基本的东西就分析完毕了。

posted on 2007-04-20 22:15  十分之七  阅读(3906)  评论(15编辑  收藏  举报