
qq MsgExdb分析 及QQ的安全问题.doc
3页MsgEx.db 分析 最近花了几天时间跟踪了一下“ 聊天记录查看器 5.3 华军版” ,总算把 聊天记 录的存储方法弄清了大家不要笑我,只是好奇而已,呵呵 1.聊天记 录存储方式 聊天记录保存在 MsgEx.db 文件中以前很早的版本是保存在 Msg.db 中,文 件结构也与现在不同,我们就不分析了 MsgEx.db 采用 Storage 结构化存储关 于 Storage 复合文档的知识请查阅 Microsoft 相关文档,我们不做赘述 大家可以 用 VC 自带的 DocFile View 工具查看该文件的内容, 可以看到文件结 构大致如 下: |----MsgEx.db | |----Index.msj | |----Matrix.db | |----Index.msj | |----C2CMsg | |---- IMInfo | |----SysMsg | |----DiscMsg | |---- 号码 | |----info.dat | |----10000 | |---- GroupMsg | |----Data.msj | |----Matrix | |----Data.msj | |----MobileMsg|---------TempSessionMsg 消息内容都存储在每个号码下面的 Data.msj 中,通过 Index.msj 索引。
消息内容是经过加密处理的,必须经过解密才能看到 2.解密方 法消息内容采用 BlowFish 分组加密每 8 个字节为一个分组密钥 Key 通过 号码生成,具体算法稍后讨论 解密方法: a.取前 8 个字节,通过 BlowFish 解密,得到 decryptKey; b.decryptKey 与后面 8 个字节 XOR,对结果再进行一次 BlowFish 解密; c.将 decryptKey 与前 8 个字节 XOR,得到第一组结果; d.decryptKey 与后面 8 个字节 XOR,重复 b,c 两步; e.最终全部数据解密完毕 最后会剩下一组 8 字节无法解密,这个实际上是 冗余数据,似乎是用来作为校验 3.具体步骤以上解密时,BlowFish 的密钥是一个全局公用密钥 KeyKey 要通 过 号码生成,具体步骤是: a.将 号码进行 MD5 变换,得到 Md5Key b.取 Matrix.db 的数据,对其进行解码简单说一下 Matrix.db 文件的结构:Matrix.db 采用分块存储,每个 Record 包含类型、名字长度、名字、内容长度、 内 容几个字段组成。
用数据结构表示就是:struct Record{ char rType; short nLen; char Name[nLen]; intrLen; char Content[rLen]; }; 初始内容也是通过加密存储的 解 密 方法很简单:将长度的低位字节和高位字节 XOR,得到 key;将内容逐个与 key 进 行 XOR, 就得到结果 对名字和内容分别进行解密即可 解密后会看到 STL, TIP, CRK, CPH, CAH 等字段,不清楚具体的啥含义,感兴趣的同学可以自己去研究 研 究我们要用到的是 CRK 字段,长度为 32 字节(如果本地聊天记录加密,可 能 会有变化,没试过) 将得到的 CRK 字段作为 pData c.用 Md5Key 对 pData 进行 BlowFish 解密, 得到全局密钥 Key 4.结论以上讨论 的都是本地聊天 记录没有加密的情况如果选择了加密,没有密码是肯定解不出 来滴,大伙就不用 费心了 的安全问题,就是 OICQ,TENCENT 公司研发的即时信息软件,是中国市场上国产 IM 软 件绝对的老大中国网民几乎人手至少一个 号码大家都比我清楚,不多 介绍。
本文谈谈 的安全问题 具有如此惊人的人气,却有着与之不相称的安全 问题基本上可以说, 使用 ,基本没有任何隐私可言!另外它也为你的电脑带 来了诸多附送的安全 隐患有识之士如我都早已不用 啦 一,本地密码保存 方式 的客户端会不经用户同意,把用户的密码经过数万次的 MD5 运算后存在本地每次登陆在发送网络数据包之前进行本地验 证,相信熟悉 的朋友对这一点都不陌生这样事实上给了攻击者暴力破解 密码的机会,只要攻击者得到本地保存的这个数据即可这个文件曾经叫 ewh.db 或者 user.db, 不知道现在是否又变了 说明一点, 由于 MD5 作了数万次, 这 样的破解效率不高,但再低的效率也有弱智密码中招,当年尝试登陆都可 以, 还有什么不可能呢?如果选择了自动登陆,那么密码的一次 MD5 保存在 oicq2000.cfg 中,破解速度大大提高二,本地聊天记录查看漏洞典型的攻击场景是:已经拿到全部本地记录,就 是一个 以 号为名的文件夹,不知道密码(或者俗称忘记了密码,求助者多数 号称是 mm)如何查看其聊天记录? 登陆的流程是这样的:1.输入用户名密码-2.本地验证通过-3.得到用户界面(企鹅开始闪动)-4.发送登陆包- 5.收 到登陆包成功响应-6.登陆成功。
其中在步骤 3 的时候,我们就可以查 看聊天记 录了如果 2 失败,则要求重新输入密码;如果 5 失败,则退出步骤 3 中得到的 用户界面对于没有正确密码的攻击者来说,要保持 3 的状态以查看本 地聊天记 录,需要首先骗过 2,并防止 4 发生由于 没有软件加密(加壳) , 所以 2 十分容易,修改一个跳转就 OK4 就更容易了,拔了网线或设置防火墙就 可以 了现在网上有很多这样的修改教程和修改好的客户端所以不再赘述 三, 本地聊天记录的加密方法事实上以上第二条所说是一个利用已有客户端 简单规避 本地检查的办法如果你愿意,可以自己写一个查看聊天记录的工具, 因为它的加 密方式是如此的脆弱首先普及一点常识:TEA 算法(Tiny Encryption Algorithm,即 微型加密算法)是一个正规的密码学意义上的加密算法,你可以在 http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html 找到原作者对 其的 介绍 的加密,包括本地文件加密和远程数据包加密,主要使用的就是这个算 法值得注意的是原作者使用的是 32 轮运算(即使是 32 轮,这个算法也被证明 是可以已知明文攻击的) ,然而 TENCENT 将其降为了 16 轮。
时间上省了一半, 但安全性却严重下降算法常识以后再讲,我们只要知道该算法是公开的就可以 了废话,不公开哪来的那么多开源 ,比如 luma) 本地历史数据,包括 聊天记录和一些日志,用一个 key 加密后存在本地 Msg.db 或者 MsgEx.db 中,但 是这个 key 呢,用 号码的 MD5 加密存在本地同 一个文件中, 换句话说, 知道 号码就可以解密这些文件, 号码是什么呢? 就是所在目录名! 当 然,如果你启用了本地消息加密,情况会稍微好那么一点点,要看你的本 地加密密 码强度了但是有多少人会去设置呢?四,木马泛滥,Windows 的。












