首页
社区
课程
招聘
[旧帖] qq2013的Msg2.0.db怎么解包,求思路? 0.00雪花
发表于: 2013-2-16 11:48 70605

[旧帖] qq2013的Msg2.0.db怎么解包,求思路? 0.00雪花

2013-2-16 11:48
70605
收藏
免费 0
支持
分享
最新回复 (36)
雪    币: 244
活跃值: (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
同求~
2013-5-10 18:11
0
雪    币: 200
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
加密的东西,没法看到。
2013-5-16 01:02
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
原文:http://www.oicqzone.com/blog/201111076322.html[/SIZE]如果哪位可以编译个工具给发一个40113117@qq.com,谢谢!!!
看了论坛里几篇有关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中提取消息要强大很多。
原文:http://www.oicqzone.com/blog/201111076322.html
2013-5-17 17:43
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
楼上的skykky您好,我大致看懂你写的转来的文字, 作业自己写的那个小工具可以共享给我吗? jimx92@qq.com
谢谢
2013-7-20 01:19
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
高手你有密匙吧  呵呵
2013-8-16 00:24
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
有解决思路么?
2013-8-16 14:26
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
32
太简单了。。
sqlite
串号异或
2013-8-16 14:42
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
真的是异或这么容易?
2013-8-18 21:25
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
可是现在升级到msg3.0了。。。。
2013-9-24 13:18
0
雪    币: 441
活跃值: (149)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
35
路过,mark一下
2013-9-25 18:15
0
雪    币: 36
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
Msg3.0是加密的Sqlite数据库
2014-5-22 16:20
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
通用包处理工具,应该行吧
2014-5-28 16:30
0
游客
登录 | 注册 方可回帖
返回
//