首页
社区
课程
招聘
[旧帖] [邀请码已发][原创]QQ2010本地聊天记录文件Msg2.0.db的进一步研究[申请邀请码] 0.00雪花
发表于: 2010-8-5 23:51 9178

[旧帖] [邀请码已发][原创]QQ2010本地聊天记录文件Msg2.0.db的进一步研究[申请邀请码] 0.00雪花

2010-8-5 23:51
9178
看了论坛里几篇有关QQ2010本地聊天记录文件Msg2.0.db的相关分析后,启发很大,于是在以前分析QQ协议的基础上继续深入分析了下,第一次发帖,希望大家拍砖。

首先看了testada的帖子,很赞同其本地消息采用公钥加密的分析,这样服务器其实就只做个解密的工作,如果解密成功就返回给客户端,并不需要保存任何额外信息,当然解密成功也要验证,后面会说到。
为了验证testada的分析,用OD对ReadFile和SetFilePointerEx函数下断,当然这两个函数调用很频繁,所以需要过滤句柄,以Msg2.0.db的句柄为条件,下条件断点,然后执行查看聊天窗口的聊天记录的动作,于是两个函数会相继被断下,再配合查看Msg2.0.db文件二进制内容,可以确定info.dat、index.dat和content.dat文件的内容及格式(分析二进制文件),当然还需要对QQ的解密函数下断,以确定密钥的值,这个过程不难,可以对ReadFile读到的内容下硬件断点,会发现解密函数。
通过上面的步骤,基本确定了两件事:密钥和聊天记录密的加密数据。由于密钥是固定的,与Msg2.0.db文件相关,这个结论应该不需要什么怀疑,所以我们就有了定位QQ登录过程中密钥的方法;其次,我们可以在Msg2.0文件中定位相应账号的info.dat等文件。

于是接下来做两件事:分析Msg2.0.db文件格式,寻找报文中的密钥。

分析Msg2.0.db文件的方法就是分析其二进制内容,这点听起来似乎有点难,其实不然,先删除QQ目录下的该文件,然后重新登录,会再生成一个该文件,这是最简单的文件了,也不大,用UE查看其二进制会发现一些东西,在其4200H偏移出是一个个大小为80h字节的数据结构,通过统计可以发现其规律,名字啊,大小啊什么的。通过增加聊天记录,对于前后的变化也能发现其他东西,这个分析过程就不多说了。
得出的结论是,加密数据确实存放在content.dat中,且那些内容加密哪些内容不加密也很容易看出来,而index.dat的格式更简单,就是些序列偏移什么的,事实上我在分析Msg2.0.db文件时花了很多时间,最后发现有更简单的方法。sethseth的解包程序给了我很大启发,发现Msg2.0.db只不过是个Structured Storage格式,可以去了解下相应的文档,网上有个工具Structured Storage View可以很清晰地查看Msg2.0.db文件,目前最新版本是3.3.1,这个就是最简单的方法,确实简单。

弄清了msg2.0.db的眉目,我们接下来就是定位密钥,这个密钥既然是服务器返回的,我们理所当然是到报文中搜索,当然你需要一个解密报文的工具,或者直接去钩挂解密接口,因为报文是被加密的,前者需要你输入密码来解包,后者也不难,钩挂解密接口再做个log就行;反正是弄到了明文,于是一搜索发现在紧接着30报文之后的一个交互中,如果你对QQ协议不了解的,可能没法理解。这样定位确实很容易,重点是我们知道了密钥是什么,定位到服务器返回的密钥,很自然也能定位到客服端发送的内容,事实上这个发送的内容就是Matrix.dat的一部分,是它的最后38H字节内容,所有字节跟0xc2做一个异或运算就得到了。
通过对QQ2009SP5之后所有版本的分析,可以发现在2010之前(如果我没记错的话),QQ利用a4报文交互这个密钥,而2010正式版和SP1版则没有a4报文,改成了30报文之后的012C报文来进行交互,嘿嘿,变化不是很大。

到此为止,我们已经验证了其聊天内容使用服务器返回的密钥进行加解密,而是否是公钥则无法确定,但个人感觉应该是八九不离十。这个密钥自然是保存在Matrix.dat里的。

有了上面的结论,我们还可以继续做一些其他实验,我试着用一个账号的msg2.0.db文件中的matrix.dat去替代另一个账号的msg2.0.db文件(直接用UE更改十六进制内容),然后将这个被替代的msg2.0.db放到第一个账号目录下, 再尝试登录,登录成功,并且可以查看聊天记录的最后时间,但查不到聊天内容,因为密钥不对,自然就无法解密。
如果单纯将一个Msg2.0.db文件放到另一个账号目录下,再登录,会显示登录失败,未知错误0x00080008,接着查看登录失败的报文发现服务器实际上是对接受到的matrix.dat最后38H字节解密后进行了验证,很可能是通过账号,因此我猜测这38H字节解密后除了密钥之外还有诸如账号之类的信息,不过没发验证。

最后是另一个疯狂的实验,写了个工具,先是替换了matrix.dat内容,然后将所有content.dat中的加密数据先解密出来,然后再用替换的Matrix中相应的密钥对其加密,再写回去,之后再将这个Msg2.0.db文件放到替换账号的目录下,然后登录,成功,打开消息管理器,可以查看里面的所有消息,哈哈,证明QQ也没有对Msg2.0.db文件做任何校验。

写了这么多,也算对QQ的Msg2.0.db文件的原理有了进一步的理解,并且弄清了密钥传递的情况;当然,能够做到这步,testada和sethseth的分析给我了很大帮助。

将分析的过程与大家分享,希望大家有新的想法可以去尝试实验并验证,相信大家也会有很多奇思妙想,说不定就能发现QQ该机制的漏洞。当然,由于个人水平有限,难买也会存在分析有误或者错别字的地方,希望不要见笑。

另外,本文提到的最后一个疯狂的实验,需要了解QQ加密算法,不过这个好像已经是公开的秘密了,呵呵,有兴趣的朋友可以去试一下这个实验。我觉得利用QQ自带的消息管理器查看消息比手动从msg2.0.db中提取消息要强大很多。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (61)
雪    币: 258
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2010-8-6 08:36
0
雪    币: 25
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2010-8-6 09:01
0
雪    币: 271
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
希望能更深入,关注
2010-8-6 10:06
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看到有人纯粹表情回复,这个也可以啊
2010-8-6 10:10
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
灌水有个水准的撒。
2010-8-6 16:47
0
雪    币: 12
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主很强大 继续
2010-8-6 17:49
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
高手终于出现了,等死了  希望第一个能在本论坛上看到工具

提供一个思路,能否用通常所用的聊天语言比如你好,在等词汇算出加密的密匙然后通过算出的
密匙在破解其它的聊天记录????!!!!!!!
2010-8-6 22:16
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主强大。支持楼主。
2010-8-7 07:30
0
雪    币: 166
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习一下,支持楼主。
2010-8-9 08:00
0
雪    币: 58
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
呵呵,这个方法只能用于密文固定的加密算法(简单来说,就是加密单元之间相互独立,不会出现利用前文的加密输出作为后文的加密输入的情况),而且怎么个算法还是个疑问;如果不使用穷举法爆破,就得利用加密算法自身的漏洞来算。
而QQ使用的加密算法是一种前后相关的块加密算法,也就是说,即使是同样的明文,同样的密钥,每次加密后得到的密文几乎是不同的,所以理论上的破解方法只有穷举爆破,密钥空间是2的128次方。
如果既利用不了加密算法的漏洞也不想使用理论上的爆破,就只能从加密体系入手了。这个思路的入手点有两个:获取服务器私钥(且不说是否是公钥加密,就算是,难度也可想而知,但一劳永逸),分析密钥产生算法(加密密钥是本地生成的,如果密钥全部随机生成,也比较棘手,若非,或许能有效缩小暴力空间)
2010-8-9 09:14
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,谢谢
2010-8-10 18:52
0
雪    币: 111
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
如果从这个下手呢

QQ自带的消息管理器
2010-8-16 13:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
技术贴,学习一下。谢谢LZ。
本人菜鸟 潜心学习 谢谢看雪提供场所!
2010-8-16 14:19
0
雪    币: 7
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
LZ分析很深入,自己的分析还能提供一点帮助感到很欣慰。希望后面能研究更深入,今后常交流,大家共同提高。有兴趣者可以加我QQ 37370762,一起讨论
2010-8-17 19:19
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
分析得很牛,,,不是说已经分析成功了吗?软件发出来大家试用试用怎么样高手hehe
2010-8-22 13:00
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主分析的确实很强大~~ 支持~突破口很新颖
2010-8-22 21:08
0
雪    币: 74
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
LZ太强悍了,我现在还在慢慢的摸索中啊,期望见到曙光!
2010-8-23 03:29
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
先是替换了matrix.dat内容-->你是替换了最后38H?

然后将所有content.dat中的加密数据先解密出来-->这里解密算法是blowfish?那密钥呢?matrix的最后38H慢慢试验出来的?可以再具体说说吗?

然后再用替换的Matrix中相应的密钥对其加密-->这里我的困惑同上,算法和密钥?

可否赐教?能看到你最后试验工具代码吗?谢谢
2010-9-28 23:38
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
2010-9-29 01:59
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
看看。。。学习。。。
2010-9-29 09:15
0
雪    币: 58
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
1.替换的的确只是matrix.dat中38H;
2.解密算法就是QQ惯用的算法,以TEA16次循环为基础的类似CBC模式加密算法,可以逆向出来的;
3.解密密钥是从报文中截取的,前提是要能解开报文,因为报文被加密了;在知道登录密码的情况下是可以解开报文的,所以我是使用了两个自己的QQ账号,因为只是实验嘛

忘了说了,关键就是在本地消息的加密密钥,这个东西没法(基本上没法)从本地得到,但可以从QQ登录报文得到。
我的意思够明白了吧,所以说我的替换工具其实就是个解包再封装的工具,没有两个msg2.0.db文件的消息加密密钥,啥也做不了。最后再说一句,我的替换工具借鉴了sethseth的解包工具,只不过没把文件解压出来,而是修改之后再放回去
2010-9-29 09:26
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
谢谢LZ指点,可以发个联系QQ吗?菜鸟问题有点多,劳烦了~~~
另外,我个人认为,在收到对38H的验证包后,对本地的判断进行修改,是不是能跳过msg2.0的验证,进而登陆,直接使用消息管理器提取记录?只是想法,还不知道该怎么做
2010-9-29 09:45
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这个对我新手来说还是有技术含量的啊。。。
看的比较吃力
2010-9-29 11:27
0
雪    币: 181
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
膜拜楼主,服务器的公钥是不是只生成一次?
2010-9-29 12:02
0
游客
登录 | 注册 方可回帖
返回
//