背景
最近出于兴趣研究一下 macOS 上新版 NT QQ 的聊天记录存储机制。发现其使用了加密的 SQLite 数据库来存储消息数据。
环境信息
- 系统: macOS
- 软件: NT QQ (新版腾讯 QQ)
- 数据库类型: SQLCipher (加密 SQLite)
- 加密算法: AES-256 + HMAC-SHA1
数据定位
NT QQ 的用户数据主要存储位置:
1 | ~/Library/Application\ Support/QQ/ |
在这个目录下可以找到两个关键的数据库文件:
nt_msg.clean.db- 主消息数据库(约 2.8GB)profile_info.db- 用户配置信息(约 9.8MB)
密钥获取
NT QQ 将解密密钥存储在一个文本文件中,通常命名为类似 @qqkey 的文件。通过查看该文件可以找到数据库的解密密码。
注意: 不同版本的 QQ 可能使用不同的密钥存储方式和位置。
解密过程
1. 导出 SQL Dump
使用 sqlite3 命令行工具配合正确的加密参数导出数据:
1 | sqlcipher nt_msg.clean.db <<EOF |
2. 修复 SQL Dump
由于数据库可能处于事务状态,导出的 SQL 文件会以 ROLLBACK 结尾,需要替换为 COMMIT:
1 | cat raw_dump.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg_fixed.db |
3. 读取解密后的数据
1 | sqlite3 nt_msg_fixed.db ".tables" |
可以看到多个数据表,主要包括:
1 | c2c_msg_table # 私聊消息表 |
注意事项
- PRAGMA kdf_iter: NT QQ 使用的是
4096次迭代,而非 SQLCipher 的默认值4000。这点很重要,如果参数不对会导致解密失败。 - 事务处理: 导出的 SQL dump 可能包含未提交事务,需要手动修复。
- 数据完整性: 建议先将解密后的数据库备份再进行查询操作。
结语
通过以上步骤,就可以成功解密 NT QQ 的聊天记录并导出数据。整个过程中最重要的是获取正确的加密密钥和配置参数。这个研究过程让我对 Qt 应用的数据存储机制有了更深的理解。
免责声明: 本文仅用于技术学习和个人数据备份,请勿用于非法用途或侵犯他人隐私。