-
-
[旧帖]
关于QQ聊天记录加密算法的理解[求助]
0.00雪花
-
发表于:
2007-4-2 16:05
19781
-
[旧帖] 关于QQ聊天记录加密算法的理解[求助]
0.00雪花
2006-12-30 14:51:00
QQ聊天记录文件存储方式解密(zz)
QQ聊天记录文件存储方式解密
QUQU
2006/12/29
最近花了几天时间跟踪了一下“QQ聊天记录查看器 5.3 华军版”,总算把聊天记录的存储方法弄清了。大家不要笑我,只是好奇而已,呵呵。
1.聊天记录存储方式
QQ聊天记录保存在MsgEx.db文件中。以前很早的版本是保存在Msg.db中,文件结构也与现在不同,我们就不分析了。
MsgEx.db采用Storage结构化存储。关于Storage复合文档的知识请查阅Microsoft相关文档,我们不做赘述。
大家可以用VC自带的DocFile View工具查看该文件的内容,可以看到文件结构大致如下:
|----MsgEx.db
| |----C2CMsg
| |----QQ号码
| |----Data.msj
| |----Index.msj
| |----IMInfo
| |----info.dat
| |----Matrix
| |----Matrix.db
| |----SysMsg
| |----10000
| |----Data.msj
| |----Index.msj
| |----DiscMsg
| |----GroupMsg
| |----MobileMsg
|---------TempSessionMsg
消息内容都存储在每个号码下面的Data.msj中,通过Index.msj索引。消息内容是经过加密处理的,必须经过解密才能看到。
2.解密方法
消息内容采用BlowFish分组加密。每8个字节为一个分组。密钥Key通过QQ号码生成,具体算法稍后讨论。
解密方法:
a.取前8个字节,通过BlowFish解密, 得到decryptKey;
b.decryptKey与后面8个字节XOR,对结果再进行一次BlowFish解密;
c.将decryptKey与前8个字节XOR,得到第一组结果。
d.decryptKey与后面8个字节XOR,重复b,c两步。
e.最终全部数据解密完毕。
最后会剩下一组8字节无法解密,这个实际上是冗余数据,似乎是用来作为校验。
3.以上解密时,BlowFish的密钥是一个全局公用密钥Key。Key要通过QQ号码生成,具体步骤是:
a.将QQ号码进行MD5变换,得到Md5Key
b.取Matrix.db的数据,对其进行解码。简单说一下Matrix.db文件的结构:
Matrix.db采用分块存储,每个Record包含类型、名字长度、名字、内容长度、内容几个字段组成。用数据结构表示就是:
struct Record{
char rType;
short nLen;
char Name[nLen];
int rLen;
char Content[rLen];
};
初始内容也是通过加密存储的。解密方法很简单:将长度的低位字节和高位字节XOR,得到key;将内容逐个与key进行XOR,就得到结果。对名字和内容分别进行解密即可。解密后会看到STL, TIP, CRK, CPH, CAH等字段,不清楚具体的啥含义,感兴趣的同学可以自己去研究研究。我们要用到的是CRK字段,长度为32字节(如果本地聊天记录加密,可能会有变化,没试过)。
将得到的CRK字段作为pData。
c.用Md5Key对pData进行BlowFish解密,得到全局密钥Key
4.以上讨论的都是本地聊天记录没有加密的情况。如果选择了加密,没有密码是肯定解不出来滴,大伙就不用费心了。
后记:
在分析过程中参考了牛人nbw和blowfish的帖子,小弟获益匪浅,在此一并致谢。
http://bbs.pediy.com/showthread.php?threadid=29098
http://bbs.pediy.com//showthread.php?threadid=862&goto=nextoldest
最初我是在网上搜索,转到一个人的博客上发现这篇文章的。当然估计他也是转贴。根据这篇文章上面给出的线索,我又转至看雪论坛看了一些相关的文章。不过还是有点不懂。
addr[0010h] 0x61 12 75 20 7A 8B 74 C6 05 9D 77 65 98 E3 73 B1
addr[0020h] ...
以上面的16字节例。我所理解的是主要就是解密的时候,以8个字节为分组,前2个DWORD是明文,后2DOWRD是密钥。那么下一个要解密的8个字节组呢?是[05 9D 77 65 98 E3 73 B1 ]吗?它的角色是完全的密钥,还是也是需要解密的明文--只不过它的密钥又是从紧随其后的2个DWORD取?也就是从addr[0020h]开始的8个字节?然后以此为循环。。。文章描述不是很清楚,也许我理解有问题。。。总之希望有人能点一下,谢谢!!!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!