首页 > 网络新闻 > 站长博客 > 正文

对QQ2010本地聊天记录文件Msg2.0.db的研究

时间:2011-11-07 08:25 作者:QQ地带 我要评论

看了论坛里几篇有关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中提取消息要强大很多。

顶一下
(1)
50%
踩一下
(1)
50%

Google提供的广告