解密并读取电脑QQ的聊天记录数据库(Msg3.0.db)

电脑QQ的Msg3.0.db虽然本质上是SQLite,但是是加密了的。早就看到了关于解密Msg3.0.db的文章,但一直懒得自己尝试,今天抽出时间来尝试了一下。
原理:
https://www.52pojie.cn/thread-1386731-1-1.html
https://www.52pojie.cn/thread-1370802-1-1.html
https://saucer-man.com/information_security/1038.html

当然,目前我对于逆向和调试还不了解,所以即使照着文章操作,也有点难为我。
好在github上有大佬写好了代码,于是我是跟着这个来操作的:
https://github.com/QQBackup/qq-win-db-key/blob/master/%E6%95%99%E7%A8%8B%20-%20PCQQ%20(Windows).md

简单说一下步骤:
1. 做好备份。
2. 打开QQ,但先不要登录。
3. 运行pcqq_get_key.py,它会对QQ的进程进行hook。
4. 登录QQ,获取到key。此时应该能看到如下的输出:

其中,“pkey: ”后面是16个十六进制的数字。
5. 打开pcqq_rekey_to_none.cpp,将上面那串十六进制数粘贴到第313行处,即BYTE pwdKey[16]那里:

6. 用32位的g++编译:g++ pcqq_rekey_to_none.cpp
这里我用的是https://github.com/niXman/mingw-builds-binaries/releases/download/15.2.0-rt_v13-rev0/i686-15.2.0-release-win32-dwarf-ucrt-rt_v13-rev0.7z的。如果编译顺利,会得到一个a.exe文件(默认文件名)
7. 将a.exe和Msg3.0.db一并放到QQ程序所在的Bin路径(如C:\Program Files (x86)\Tencent\QQ\Bin\)。运行a.exe。如果不行,尝试用管理员权限运行(我就是用了管理员权限)。a.exe会开始根据上面填的key,对Msg3.0.db进行解密。
8. 如果解密正常,打开解密后的Msg3.0.db,会看到如下的内容:

但是,现在还不能直接用数据库软件打开它。接下来需要把上图中高亮的那一部分内容(从SQLite header 3开始,到SQLite format 3之前)删掉,这一部分正好是1024位,这里我直接写了个脚本:

import shutil

with open('C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\Msg3.0.db', 'rb') as f_in:
    f_in.seek(1024)  # 跳过前1024字节 (0x400)
    with open('C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\Msg3.0_decrypt.db', 'wb') as f_out:
        shutil.copyfileobj(f_in, f_out)

9. 现在,就可以正常用数据库软件打开它了:

然而,进入数据表查看内容,会发现消息内容似乎不是明文,还需要进一步地解码。这一部分我还没研究到,当前仅仅是解密数据库,做到能够正常读取数据表而已。下回有空继续深入处理。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注