本文中的协议分析是把 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个字节,详细情况就不说明了,一分析便知。