能力值:
( LV2,RANK:10 )
|
-
-
26 楼
同求~
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
加密的东西,没法看到。
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
楼上的skykky您好,我大致看懂你写的转来的文字, 作业自己写的那个小工具可以共享给我吗? jimx92@qq.com
谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
高手你有密匙吧 呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
有解决思路么?
|
能力值:
( LV4,RANK:55 )
|
-
-
32 楼
太简单了。。
sqlite
串号异或
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
真的是异或这么容易?
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
可是现在升级到msg3.0了。。。。
|
能力值:
( LV9,RANK:170 )
|
-
-
35 楼
路过,mark一下
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
Msg3.0是加密的Sqlite数据库
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
通用包处理工具,应该行吧
|
|
|