首页
社区
课程
招聘
[原创]QQ发送消息协议分析[MASSADA0014]
发表于: 2009-3-1 19:59 74523

[原创]QQ发送消息协议分析[MASSADA0014]

2009-3-1 19:59
74523

由于QQ使用的通信协议细分了发送消息到服务器和从服务器接收消息为两种不同格式,所以需要分开讨论。

所需基础知识:
01、对TCP/UDP协议有简单了解。
02、了解基本的Sniffer软件使用方法。
03、对QQ登录过程有了解。可以查看rgbsky帖子:http://bbs.pediy.com/showthread.php?t=62660&highlight=QQ+%E5%8D%8F%E8%AE%AE

软件工具:
Sniffer Pro:              抓取QQ登录及聊天数据包。
QQDebugger.exe:   解密QQ登录过程,会话密钥,聊天内容工具。
SmartConvert.exe:  数据文本转换工具,用于查看聊天内容。

这些工具包含在附件中,都是网上的朋友发给我的。在此对这些朋友表示感谢!
有了这些工具可以手动解密查看聊天内容了,要实现自动分析你必须写代码了。

QQ发送聊天信息一般使用的是UDP协议,源端口为4000,目的端口为8000。消息在发出前使用"会话密钥"和改进的TEA算法进行加密。试验发现如果一台PC上有两个QQ登录则一个使用4000端口号,另一个使用4001端口号。

面对如潮水般涌来的数据包,要解密QQ发送出去的消息必须解决两个问题:
01、哪种数据包是包含发出消息的数据包。必须有个判据。
02、必须知道加密该数据包的"会话密钥"是什么。

对于第一个问题我目前的解法是:
根据数据包的协议类型,目的端口号,以及QQ命令来判断。
如果协议类型是UDP协议,目的端口号为8000,QQ命令为:0016,我们认为该数据包包含有发出的聊天信息。通过分析CAP文件中的协议头很容易得到数据包的协议类型和目的端口号等信息。至于QQ命令,是QQ协议的一个部分没有加密。

一般包含发送聊天内容的数据包格式为:
0000:        02 ->表示QQ数据包的起点。
0001 - 0002: 为QQ客户端版本号对于QQ2008为:1221。
0003 - 0004: 就是我们所说的QQ命令。根据试验发现命令为0016表示该包包含发出聊天记录的信息。
0005 - 0006: 2B的序列号。
0007 - 000A: 4B的发送消息的QQ号码。
000B - 倒数第二字节: 用改进的TEA算法加密的包含聊天内容的数据包。(里面有很多丰富的信息如接收信息的QQ号码IP地址等)
最后一个字节:03 ->表示该数据包结束标志。

如图01,就是一个典型的发送聊天内容的数据包。(★里面包含丰富的信息,大家可不要来黑我!^_^。里面QQ号也是实验用的,平时不用。)

由于发送数据包有固定的格式,前面我们讨论过从Sniffer包头中有整个数据包的大小,所以很容易得到加密的数据块。现在就是怎样解密的问题了。

前面说过聊天内容是用"会话密钥"加密而成的。这里所说的"会话密钥"是在QQ客户端登录系统时在第6次认证时由服务器发回给客户端的。根据试验发现客户端和服务器进行第六次认证时使用的QQ命令是:0022,所以目前的问题就是我们必须解密从服务器发来的QQ命令为0022的数据包。但是很不幸,聪明的腾讯公司使用了用户密码(就是大家平时输入的密码)的两次MD5摘要得到的16B信息对该数据包进行加密。★因此在目前情况下,要想解密抓到的包含聊天内容的数据包必须有用户密码。如果有朋友有其他办法也请不吝赐教!

我们的试验比较简单,因为大家总是知道自己的QQ密码的。这时就要请出我们的第二个工具QQDebugger.exe了。这个小程序是用C#写成的需要.NET 2.0环境才能运行。你可以输入自己的QQ密码让他帮你计算出两轮MD5摘要后的结果。然后用这个结果来解密包含会话密钥的数据
包。包含会话密钥的数据包如图02。不过要特别注意,解密的时候应该去掉数据包中首尾无用的QQ命令,序列号等信息。如果解密成功在QQDebugger的输出窗口可以看到解密内容,如果解密失败QQ的TEA算法可以识别,因而不会看到任何内容。

解密后的信息第一个字节应该是:00。后面的16字节是"会话密钥"。

有了会话密钥就可以拷贝到上端的密钥窗口中。再把发送消息数据包(注意去掉首尾的标志信息)拷贝到输入窗口,点击解密。

如果成功可以看到输出窗口有一堆解密的数据。如图03就是使用会话密钥解密的一段包含聊天记录的数据包。在密钥窗口隐藏了4B的会话密钥内容。输入窗口是去掉首尾后的加密数据内容。输出窗口是解密后的数据包。该数据包的最前4B是发送消息的QQ号码,后面隐藏的4B是接收消息的QQ号码。下面高亮显示的是聊天信息。

拷贝这些聊天信息打开:SmartConvert.exe这个小程序可以自动转换成易读的文本。
★发出信息的起点偏移量在解密数据包中是固定的,结束部分都是20 00。

补充说明:腾讯作为一家老牌的技术企业研发能力还是非常强。所使用的协议也很丰富,并且还在随着版本的升级不断更新。我分析的时间和内容还很有限,希望各位高手能够指出不足之处,非常感谢!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (76)
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
2
纯属基础内容。呵呵。
2009-3-1 20:20
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
文章对显ip的制作很有参考价值!
2009-3-1 20:28
0
雪    币: 773
活跃值: (315)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
显IP?文中封包结构中没有提到IP的内容。
不过按本文所述,貌似知道了局域网内一个QQ的密码就可以,就可以即时监听TA的聊天内容了。
能监视视频不???
2009-3-1 21:49
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
5
可以得到对方的IP地址。实际做下试验就知道了。我认为目前至少有两条思路可以实现。你再想象吧,开阔一下思维。呵呵。

视频还没有玩,在忙着搞其他IM。后面会玩。

可以预告的是:如果是使用QQ传送文件,不用密码也可以得到。后面再介绍给大家。
2009-3-1 22:17
0
雪    币: 773
活跃值: (315)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
6
哦,是我看漏了,SOOOOOOOOOORRY
2009-3-1 22:45
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
某些山寨QQ几乎是开源的了,研究这个协议还有什么意义
2009-3-1 22:51
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
8
早上突然想起一个问题:
QQDebugger.exe程序有个小Bug,似乎没有剪除输入字符串两端的空格。所以有的时候操作正确但无法正常解密。可以尝试删除待解密字符串两端的空格。

试验肯定是可以成功的,如有问题就到论坛上交流吧。
2009-3-2 08:49
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好东西,可以参照本文,写个QQ机器人。
2009-3-2 09:44
0
雪    币: 362
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
支持山寨版,顶一个。
2009-3-2 11:35
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
分析的不错。基本抓住要点了。

不过就是晚了点,我两年前就分析过QQ和其他聊天工具了。没什么难度,也不要把腾讯或者微软什么的想那么厉害!加百力搞WINCE算是比较领先了,不过网络分析看来还要提高才行!
2009-3-2 13:16
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我是很早就在搞网络分析了,但是发现这个论坛搞的人不多,就没发帖。
既然加百力都在发网络分析贴还能加精,我应该也可以出来冒两个泡泡了。^_^     ^_^

后面的分析看我的好了!^_^
2009-3-2 13:18
0
雪    币: 411
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢!期待更精彩的。
2009-3-2 14:18
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我来补充一点吧:

在使用Sniffer Pro时如果要查找特定字符串或者16进制数据可以使用Alt + F3,输入比如:
00 22 或者 00 16 QQ命令就可以很容易定位到要找到数据包。可以按F3继续查找下一个满足条件的数据包。

我觉得这个命令非常重要!推荐大家了解使用。
2009-3-2 16:23
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
mark

协议分析我觉得太需要猜,也就是推测的能力了。

现在啥都加密,第一步都得把加密这一层去了才能分析协议,修改协议

所以wpe就无用武之地了。。

其实应该将来出一个wpe++,可以用户自定义加密解密插件。。
这样,一个新一代的面向非开发用户的工具就出现了。
2009-3-2 18:05
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼上说得有一定道理,推测能力还是很重要!

不过我搞了2年多网络协议方面的分析工作,我感觉基础也很重要!
比如TCP/IP协议的基础知识,Sniffer工具的使用,特别是加密算法的基础等等。还有就是对程序的逆向了。当找不到思路的时候分析调试程序成了必须做的工作。特别是一些使用强劲加密算法的网络协议比较难对付!
2009-3-2 18:22
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
还有一点就是并不是什么都加密!

比如MSN的聊天内容就没有加密!所以才需要MSNSHELL工具。微软也不是那么可靠的!

还有加百力说对了,QQ使用TCP协议进行文件传送的时候大多没有加密。没有密码照样可以抓包得到文件。
2009-3-2 18:25
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
所以说,搞网络协议分析和其他工作一样必须有扎实的基础,加上勤学苦练没有1-2年的磨练根本别想当高手!
2009-3-2 18:27
0
雪    币: 203
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
封包助手(PackAssist)就是楼上说的那样的,早有了。
其实都没什么用,还是自己动手丰衣足食的好的多
2009-3-4 09:03
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
网络分析我还没涉及过
这回好好学习一下
2009-3-4 11:35
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
   

我也该~好好学习~啦~ 没看懂~~~~~~~
2009-3-4 12:11
0
雪    币: 270
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
假如我和一个人在同一个局域网内,能嗅探到他刚登陆qq是的会话密钥的数据包(当然是用他qq密码加密的)。而我也有他的qq,并和他聊天,这样就知道聊天的内容,并能接收到他发来的消息包(这个包是用会话密钥加密的)。这里的消息包是用改进的TEA算法进行加密的。(QQ采用了最初的TEA算法做其核心的加密算法,QQ在采用TEA算法时采用了16轮的加密,其加密复杂度比32轮减了许多。)如果TEA算法是对称加密算法的话,我们应该能计算出这个会话密钥。从而我们能得到这个人qq密码2次md5后的摘要。而在现实中,我们qq密码无非都是一些便于我们记忆的数字或字母组合而已,如果有好的字典的话,暴力破解就不会很难了。
    地球太可怕了,回火星了。
2009-3-6 14:02
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
QQ加密聊天使用的确实是改进的TEA算法。但是并不是仅仅把循环的次数减少就完了。首先是在待加密数据前增加了4字节的随机数,并根据需要对数据结尾进行了填充。在加密过程中每加密8字节数据就用结果继续加密后续的数据,形成一种迭代结构。这样以来即使是完全相同的密钥和明文加密后的密文也不相同了。

会话密钥是服务器生成的随机数。你得到的会话密钥使用你的用户密码(也就是QQ密码)加密的。
2009-3-6 20:21
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我认为腾讯改进的TEA算法还是很精妙的。后面找机会给大家分析一下吧。

而且因为他设计巧妙,在解密数据以后可以判断出解密是否正确。我们可以用来推断出解密密钥是否正确。因此如果你有一个不错的黑客字典可以将其中的密码取两次MD5摘要,然后用结果尝试解密含有会话密钥的服务器反馈数据包。如果能够解密成功,并且首字节为0。那你就破解了QQ的密码。
2009-3-6 20:26
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
也许这就是腾讯现在不允许使用6位以内的纯数字密码的缘故。

因为6位纯数字密码仅仅100万种情况。用穷举的方法都可以比较容易得到密码了。

我曾经专门研究过:利用QQ的TEA算法做暴力破解的算法。
2009-3-6 20:30
0
游客
登录 | 注册 方可回帖
返回
//