• QQ 2006 正式版协议变动情况分析


    QQ 2006 协议较QQ 2005 有较大变化,最大的变化在登录部分,加入了验证码验证机制,当同一 ip 地址存在过频繁的QQ登录时,服务器会向客户端发送验证码要求登录。本文将详细描述QQ 2006 正式版的登录过程以及聊天协议的变化情况。

    本文中的协议分析是把 QQ 当作黑箱分析,遵循中华人民共和国《计算机软件保护条例》。分析过程中参考了 Red_angelX(http://blog.csdn.net/Red_angelX)的两篇文章:(1)QQ2006协议分析之一 登录篇(http://blog.csdn.net/Red_angelX/archive/2006/11/13/1381351.aspx)和(2)QQ2006协议分析之二 登录验证码篇(没在Red_angelX 的blog上找到这篇文章,最后还是在 baidu 快照里扒出来的)。Red_angelX 做的分析针对的是 2006 Beta 3版本,我采用 Red_angelX 的方法针对 QQ 2006 正式版的登录过程进行了验证,做了一些补充。分析工具也是仿照 Red_angelX 的 QQ_Debugger 写的 QQDebugger。本文也参考了 lumaqq(http://lumaqq.linuxsir.org/main/)的QQ2005协议文档,点此下载(https://files.cnblogs.com/xiaotie/lumaqq_manual.zip)

    本文针对的主要是UDP格式的QQ协议。

    一、QQ协议基本结构

    QQ协议基本结构为:[头部][QQ版本号][指令][包序号][数据][尾部]。客户端和服务器端往返的数据均符合这一结构。

    [头部]为固定的一个字节,0x02,[尾部]为固定的一个字节,0x03,[QQ版本号]为2个字节,QQ2006正式版的版本号为0x0f5f,[指令]为2个字节,如 QQ2006中的获取登录令牌指令为 0x00ba,[包序号]为2个字节。

    一个简单的例子:

                                         02 0f 5f 00 ba 2d  ...@...@.g.._..-
    0030   90 41 0a 64 d6 7b 13 77 d5 75 11 4c fa 98 d4 5d  .A.d.{.w.u.L...]
    0040   de cc 4c 82 82 32 17 91 54 41 73 34 94 e6 96 1d  ..L..2..TAs4....
    0050   15 fb ef f7 b1 ee f5 36 f1 19 f9 aa 8a 6b 74 22  .......6.....kt"
    0060   d0 03


    表示是一个客户端QQ版本号为 0x0f5f,指令为0x00ba,包序号为0x2d90,具体负载内容为 41 0a 64 d6 7b 13 77 d5 75 11 4c fa 98 d4 5d de cc 4c 82 82 32 17 91 54 41 73 34 94 e6 96 1d 15 fb ef f7 b1 ee f5 36 f1 19 f9 aa 8a 6b 74 22 d0 的QQ数据包。

    QQ 协议加密使用的算法是TEA加密算法,其密钥为16字节。C#版的QQ TEA加解密算法及源代码可见 Red_angelX 的文章<QQ的TEA填充算法>( http://blog.csdn.net/Red_angelX/archive/2006/09/19/1246701.aspx)

    二、QQ2006正式版的登录流程

    QQ2006正式版的登录流程为:

    (1)客户端向服务器端发送 0x00ba 数据包,请求登录令牌。
    (2)服务器端判断客户端所在IP地址是否有频繁登录等异常情况,如果存在,则发送验证码给客户端,如果不存在,则直接将登录令牌发给客户端。需要验证验证码时:客户端发送验证码给服务器端(不用区分大小写),如果验证码正确,服务器端向客户端返回登录令牌,如果登录不正确,则返回一个新验证码图片
    (3)客户端获得登录令牌后,向服务器发送登录请求包。
    (4)服务器响应,分4种情况:
    (a)登录成功,则服务器返回会话令牌;
    (b)登录失败,服务器返回登录失败提示;
    (c)如果该服务器不能处理这个登录请求包,返回一个重定向数据包,告诉客户端一个新的服务器,这种情况下,客户端需要向新的服务器发送登录请求包;
    (d)当该QQ号码需要激活时,服务器发来提示信息。

    具体协议分析:

    (1)客户端请求登录令牌:

    样本:
                                         02 0f 5f 00 ba 2d  1....@.<...._..-
    0030   90 1e 97 73 5e 3a 04 b6 66 33 a0 86 3f 07 48 6b  ...s^:..f3..?.Hk
    0040   3c 4e fd ec 15 f9 ca 25 d8 af 7b 90 3c 88 66 79  <N.....%..{.<.fy
    0050   c1 83 1e 3f 52 fc 88 7d 65 d8 26 a7 55 03        ...?R..}e.&.U.

    格式分析,只分析数据部分:

    1e 97 73 5e 是QQ号。3a 04 b6 66 33 a0 86 3f 07 48 6b 3c 4e fd ec 15 是客户端生成的随机密钥,f9 ca 25 d8 af 7b 90 3c 88 66 79 c1 83 1e 3f 52 fc 88 7d 65 d8 26 a7 55 是随机密钥加密后的密文,解密密文,得到明文: 01 00 05 00 00 00 00。每个QQ2006请求登录猜测,这个 01 00 05 00 00 是一个子命令,表示请求登录令牌。00 00 是随子指令发送的数据。

    (2)服务器响应

    如果验证通过,直接返回登录令牌,样本为:

                                         02 0f 5f 00 ba 2d  ...@...@.g.._..-
    0030   90 41 0a 64 d6 7b 13 77 d5 75 11 4c fa 98 d4 5d  .A.d.{.w.u.L...]
    0040   de cc 4c 82 82 32 17 91 54 41 73 34 94 e6 96 1d  ..L..2..TAs4....
    0050   15 fb ef f7 b1 ee f5 36 f1 19 f9 aa 8a 6b 74 22  .......6.....kt"
    0060   d0 03

    数据部分为:
              41 0a 64 d6 7b 13 77 d5 75 11 4c fa 98 d4 5d  .A.d.{.w.u.L...]
    0040   de cc 4c 82 82 32 17 91 54 41 73 34 94 e6 96 1d  ..L..2..TAs4....
    0050   15 fb ef f7 b1 ee f5 36 f1 19 f9 aa 8a 6b 74 22  .......6.....kt"
    0060   d0

    用第一步客户端生成的随机密钥解密后得到:01 00 05 00 00 20 41 5F 87 C8 F9 B7 6A 3F 0F 7B F9 3C 5A 6F 42 6C A1 D7 78 5C 5D 9F 28 E4 F2 C6 B2 7E 91 1B DD AD。其中 01 00 05 00 00 是子指令,20是登录验证码长度(0x20 = 32),后面32字节是登录令牌,具体登录过程需要使用这一令牌。

    如果服务器觉得这个IP地址登录频繁,会发送验证码,发送验证码的样本为:

                                         02 0f 5f 00 ba 39  ...@........_..9
    0030   75 20 b3 b1 55 49 3d 9d e1 1e 1e de 4d e4 02 d1  u ..UI=.....M...
    0040   47 28 78 83 e6 ed f9 5b c3 44 df 4a 6e 20 cc a5  G(x....[.D.Jn ..
    0050   cd 60 78 18 a3 37 f9 91 17 c7 da 63 1b ae d1 e0  .`x..7.....c....
    0060   79 5c cd 47 d2 d2 a9 4e be 98 6d 52 56 99 c0 2a  y\.G...N..mRV..*
    0070   26 22 01 d4 60 91 e7 47 b4 70 e9 bd ff 0d 5c 02  &"..`..G.p....\.
    0080   b3 ce 40 88 b9 c4 29 d9 99 e9 d8 f2 9e 46 f4 06  ..@...)......F..
    0090   74 6f 56 b7 cb bc f8 42 b3 36 fe 44 ff 74 de e6  toV....B.6.D.t..
    00a0   bd c3 01 f2 09 1e 71 42 6d 7b 91 10 12 9b 29 40  ......qBm{....)@
    00b0   09 f7 07 50 bd 85 8a e2 cb b8 d6 5d 7e 9c a3 bc  ...P.......]~...
    00c0   da 6c fa e5 31 07 cd 5f 4e 63 35 e0 77 fe c7 9e  .l..1.._Nc5.w...
    00d0   37 7f 28 d1 c0 4e 6d 9c e3 27 70 a0 cd e6 cb 08  7.(..Nm..'p.....
    00e0   af 53 6f f2 f5 e9 2a d4 a4 71 21 28 78 5a 14 70  .So...*..q!(xZ.p
    00f0   a5 c5 54 d0 bc 8d 8c 84 da d5 d8 2e e6 be c9 18  ..T.............
    0100   ed ae 9d 4a b0 8c b2 0a 74 55 53 a7 2a 4d 0b 4d  ...J....tUS.*M.M
    0110   17 89 c6 61 6e 28 ca cb b5 0b c1 31 5f 38 8f d5  ...an(.....1_8..
    0120   c5 55 1b 5f 41 93 5e ce 47 0e 1a 2b 78 f5 5f 0f  .U._A.^.G..+x._.
    0130   97 60 cd c3 1a bd fb fe d5 b8 10 05 bc 0e 34 32  .`............42
    0140   eb 9e f2 4f f3 00 d3 b2 05 62 d5 54 e3 62 1a 69  ...O.....b.T.b.i
    0150   0b 87 de 40 0a 10 01 aa eb 89 2d 6e 7f f1 a9 9d  ...@......-n....
    0160   cb fc b3 9a 35 59 da 3a f2 a8 59 e8 2c 5a d2 88  ....5Y.:..Y.,Z..
    0170   f0 32 cc a9 7b 1c 8b 69 28 3a b8 d2 f6 2a e8 a0  .2..{..i(:...*..
    0180   50 f6 f1 6c 46 e3 7c 8b 4c e2 54 56 69 8d 5f 1c  P..lF.|.L.TVi._.
    0190   c9 1e 03 71 1e 6f ea e1 a5 e8 95 3f 6a f9 ba 40  ...q.o.....?j..@
    01a0   03 48 7b 12 ce 10 ba f4 9a 83 e7 97 97 11 c6 d1  .H{.............
    01b0   52 ea d5 14 69 a3 ba 82 96 aa ac cd b6 0f e6 71  R...i..........q
    01c0   02 ff 67 b7 ea f3 a5 8f ec db 67 a2 d4 d1 3f 0b  ..g.......g...?.
    01d0   6b 03


    数据部分用用第一步客户端生成的随机密钥解密后得到:01 00 05 01 00 28 9C 3E 65 15 04 4D 6B CA B6 E8 CC CD FF 8A 1C 2B FF 5A 31 8A 02 F5 EC 8B 9D 38 3E D7 03 70 D5 30 93 23 28 DA FD 5A C4 7E 01 61 89 50 4E 47 0D 0A ......

    01 00 05 01 00 代表子命令需要验证码登录,28 是验证码验证令牌的长度(0x28 = 40),后面40个字节是验证码验证令牌,客户端回复验证码时需要附带上这个令牌。随后的两个字节 01 61 是验证码图片的长度,后面的字节是验证码图片的字节流,验证码为png格式。

    客户端回复验证码样本:

                                         02 0f 5f 00 ba 39  .i...@.lr..._..9
    0030   7f 1e 97 73 5e da 6a 7a fb e2 c8 c0 c5 66 fc 09  ...s^.jz.....f..
    0040   86 40 22 79 3f 55 5b f5 90 87 75 a2 0e 41 e6 e1  .@"y?U[...u..A..
    0050   01 ff dc 09 d8 af 54 e7 ed d5 d6 b4 38 d2 a4 de  ......T.....8...
    0060   f8 f5 83 1a 05 d3 a0 f1 62 00 b1 94 3d 5f 64 aa  ........b...=_d.
    0070   79 1a 2a 66 50 c3 b4 ca 78 ad f2 ba a0 be 6b 0d  y.*fP...x.....k.
    0080   87 0d 30 65 b1 1e 67 0a cd f7 45 5d 05 03        ..0e..g...E]..

    只分析数据部分,1e 97 73 5e 为QQ号,da 6a 7a fb e2 c8 c0 c5 66 fc 09 86 40 22 79 3f 是又一个随机密钥,后面数据用这个密钥解密后为:02 00 05 00 00 00 00 00 04 46 45 59 52 00 28 9C 3E 65 15 04 4D 6B CA B6 E8 CC CD FF 8A 1C 2B FF 5A 31 8A 02 F5 EC 8B 9D 38 3E D7 03 70 D5 30 93 23 28 DA FD 5A C4 7E。其中,02 00 05 00 00 为子命令,表示是发送验证码,后面00 00 00不清楚什么意义。04 为验证码长度,随后的4个字节 46 45 59 52是验证码,随后的00 28是验证码令牌长度,随后的40个字节,是上面获得的验证码令牌。

    服务器验证通过,发回:

                                         02 0f 5f 00 ba 39  ...@...@...._..9
    0030   7f 5a ed 66 34 80 df 63 ef a8 77 95 c5 6b 06 73  .Z.f4..c..w..k.s
    0040   cf ee a2 2d 59 6b a2 a7 d4 44 86 01 ac d0 de e9  ...-Yk...D......
    0050   8a 27 c9 b3 2a 03 5e cb 9a a3 4c 68 e5 3b d2 4b  .'..*.^...Lh.;.K
    0060   48 03

    数据部分用上一步生成的密钥解密后得到:

    02 00 05 00 00 20 D2 CE A7 3C 8A E1 54 E7 CC 0B 2A 07 99 9A 37 00 DE A3 AE CE 0E 9C B4 38 F0 91 2F 7E 97 FD 5B 4D

    02 00 05 00 00 为具体指令,20 为登录令牌长度,后面的32字节为登录令牌。

    (3)客户端登录

    样本:

                                         02 0f 5f 00 22 2d  1....@..|..._."-
    0030   94 1e 97 73 5e c2 68 f3 4e fd 9b ef db 0f 7c 4e  ...s^.h.N.....|N
    0040   f8 46 6c fd b0 ee 24 4c ee f3 9c 15 36 13 df ff  .Fl...$L....6...
    0050   bf 53 d8 f7 f1 a2 b8 50 8f 7d f9 4a c9 74 2f f4  .S.....P.}.J.t/.
    0060   64 fd b3 2d ae 0c e9 d2 e0 9a cd 8c 73 e9 e8 d4  d..-........s...
    0070   95 b1 e6 bd 4e cb d3 73 3d 48 cb ec 54 b1 7f d3  ....N..s=H..T...
    0080   1c cd 66 d2 2f 8e 02 ed 80 c5 70 5b 55 c0 a9 cf  ..f./.....p[U...
    0090   0f 23 8a 2b a4 b5 0a 7f 87 46 4f 11 2e 8c 43 dc  .#.+.....FO...C.
    00a0   14 17 8f 0d f4 17 78 73 67 cc c1 e7 a3 37 e8 51  ......xsg....7.Q
    00b0   2f e3 32 30 79 ca dc 5c e5 3a a9 72 04 54 b9 68  /.20y..\.:.r.T.h
    00c0   55 81 ac b9 f7 c8 ed 5f 70 05 d1 90 1f 5e 91 32  U......_p....^.2
    00d0   c5 b1 86 0d eb cf af 42 a1 8a 8e 85 6d a4 6c fd  .......B....m.l.
    00e0   7a ea fb 0f e2 7b bb 2f 63 f0 fe 58 e8 b3 88 78  z....{./c..X...x
    00f0   d0 77 25 3a 3d bc ba 3a 1a 52 6e de 88 e2 1f f5  .w%:=..:.Rn.....
    0100   31 86 ea d6 05 a1 5e ef ce 70 14 5d ed 7e 6c 32  1.....^..p.].~l2
    0110   8e 0d 46 53 87 27 2b 38 73 3b cc e7 f9 a4 38 54  ..FS.'+8s;....8T
    0120   89 36 26 07 6c c0 2c 9b 11 e4 85 ba 43 87 bc 06  .6&.l.,.....C...
    0130   9f e6 80 35 55 72 79 2c 8a c3 de 0b fc fb 4b be  ...5Ury,......K.
    0140   e3 ea a1 48 cf d5 1a 49 e5 4c 5c 85 2e df 90 f0  ...H...I.L\.....
    0150   7e 0a 8c 18 66 3a be b3 24 19 1f a7 77 bf b5 81  ~...f:..$...w...
    0160   0e 66 55 5d 54 dc 3f fd bd e5 71 fc 4b b7 11 3f  .fU]T.?...q.K..?
    0170   d4 f3 7b 8f 09 4d 9e b2 6e 39 5f 52 61 2b 2d c1  ..{..M..n9_Ra+-.
    0180   30 e0 c1 54 7f 33 d0 e6 5c fb ab 14 99 33 63 83  0..T.3..\....3c.
    0190   81 f7 cc 9c 7d eb 2a ac 1f e2 2d 26 7e 46 6e c7  ....}.*...-&~Fn.
    01a0   5d 4a b5 80 70 c4 0e ae 73 03 dc 06 3c 5d 4e 36  ]J..p...s...<]N6
    01b0   d6 06 da f8 9d f4 4c 71 fc aa 9c f4 81 8f 76 fe  ......Lq......v.
    01c0   44 6d 95 98 fb bd a2 30 4f d5 e0 f0 17 dc f3 28  Dm.....0O......(
    01d0   7c c8 28 8e 23 b3 29 37 45 44 23 66 97 ad eb 05  |.(.#.)7ED#f....
    01e0   06 02 e4 e0 07 99 01 07 4e 0c 2c 03 9d a7 bd 05  ........N.,.....
    01f0   cc 82 90 70 bc 44 2d f6 b7 2d fb 9c a0 93 99 b6  ...p.D-..-......
    0200   bc 60 48 8e a4 22 8f 16 5f 5a bf 20 24 a8 d5 d5  .`H..".._Z. $...
    0210   5c fe 98 95 15 03

    分析数据部分,1e 97 73 5e 是QQ号,随后的16字节为又一次随机生成的密钥,余下的部分用密钥解密得到:

    E5 18 65 E0 8D E3 C4 CD 69 D4 1A F2 1F 4C CA 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 D1 18 AC 14 78 58 F1 D0 81 4D 7D 7D 7B D9 1F F5 0A 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BB 1B 76 33 D7 48 5F 48 B2 21 C9 C2 55 85 9A 3D 20 41 5F 87 C8 F9 B7 6A 3F 0F 7B F9 3C 5A 6F 42 6C A1 D7 78 5C 5D 9F 28 E4 F2 C6 B2 7E 91 1B DD AD 01 40 01 62 72 1B 3E 00 10 8C 3A F1 49 F5 B4 8F 82 AC 54 AF F3 E2 2D 68 70 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 EA 34 33 C0 00 10 2A 27 9F 9A DD A1 8C 6C 89 22 04 50 03 DE 61 D4 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

    分析解密后数据,其中,前16字节 E5 18 65 E0 8D E3 C4 CD 69 D4 1A F2 1F 4C CA 67 是以用户密码的2次MD5计算后的值为密钥加密空字节流的结果。后面数据绝大部分是固定的,除了登录令牌是上面获得的登录令牌 41 5F 87 C8 F9 B7 6A 3F 0F 7B F9 3C 5A 6F 42 6C A1 D7 78 5C 5D 9F 28 E4 F2 C6 B2 7E 91 1B DD AD 。登录令牌前面的那个字节是登录令牌的长度。

    (4)服务器响应

    如果登录成功,服务器返回的包需要用用户密码的两次MD5值解密,如果登录失败,返回的包需要用登录时使用的随机密钥解密。具体格式和QQ2005协议一样,解密后的数据,第一个字节代表登录结果,00代表登录成功,05或者09代表登录失败,详情见lumaqq的文档。只是,重定向数据包和QQ2005不一样,样本偶丢了,其格式为:0a .........其中,最后4个字节(记的不是很清楚,也可能是倒数第5-倒数第2这4个字节)是新服务器的IP地址,向新服务器发送登录包就可以登录了。如果又不是00,又不是05,09,0a,则可能是登录QQ号需要激活,其具体包内容我分析过。

    三、其它变化

    QQ2006保持心跳的数据包同QQ2005有所不同,其中发送心跳数据同QQ2005,服务器返回的内容与QQ2005不同,未加分析过。

    QQ2006中接收来自好友的聊天信息数据包同QQ2005也有不同。lumaqq 中对这种消息的说明如下:

         1. 头部
         2. 发送者QQ号,4字节
         3. 接收者QQ号,4字节
         4. 包序号(并非我们发送时候的序号,因为这个是4字节,可能是服务器端得总序号)
         5. 发送者IP,如果是服务器转发的,那么ip就是服务器ip, 4字节
         6. 发送者端口,如果是服务器转发的,那么就是服务器的端口,2字节
         7. 消息类型,是好友发的,还是陌生人发的,还是系统消息等等, 2字节
         8. 发送者QQ版本,2字节
         9. 发送者的QQ号,4字节
         10. 接受者的QQ号,4字节
         11. md5处理的发送方的uid和session key,16字节
         12. 普通消息类型,比如是文本消息还是其他什么消息,2字节
         13. 会话ID,2字节,如果是一个操作需要发送多个包才能完成,则这个id必须一致
         14. 发送时间,4字节
         15. 发送者头像,2字节
         16. 是否有字体属性,4字节,有一般是0x00000001
         17. 消息的分片数,1字节
         18. 分片序号,1字节,从0开始
         19. 消息id,2字节,同一条消息的不同分片id相同
         20. 消息类型,这里的类型表示是正常回复还是自动回复之类的信息, 1字节
         21. 消息正文,长度 = 剩余字节数 - 包尾字体属性长度
         22. 字体属性,和SendIMPacket中的相同
         23. 尾部

    QQ2005中,消息类型为 0x0009,在QQ2006中,消息类型为 0x0084,这是一个不同,第二个不同是 16  是否有字体属性,4字节 和 17 消息的分片数,1字节之间多了8个字节的固定内容。

    QQ2006中,获取群信息的数据包也和QQ2005有所不同,在中间多了4个字节,详细情况就不说明了,一分析便知。


    版权所有,欢迎转载
  • 相关阅读:
    jmeter beanshell 从文件中获取随机参数
    shell 备份mysql
    Centos7 搭建wordpress
    jmeter分布式测试
    centos 环境搭建jenkins服务
    VMVare 虚拟机使用桥接模式
    Gradle 打可执行jar包
    appium 报错
    corda
    android构建过程
  • 原文地址:https://www.cnblogs.com/xiaotie/p/623555.html
Copyright © 2020-2023  润新知