解析 NTQQ 数据库
0. 引言
为了让每个人都可以把自己练入 LLM, 制作自己的数字分身. 解析 QQ 数据库无疑是快速获得语料库的最佳途径. 然而, 众所周知, QQ 的数据库是加密的 SQLite 数据库, 且不幸的是, 在最新的 NTQQ 中数据库的加密方式已经发生了变化. 本文将介绍如何解析 Mac 的 NTQQ 数据库.
参考资料 (win): QQBackup/qq-win-db-key
该方案于 2023 年 9 月 19 日在 NTQQ 6.9.17 上测试通过. 严禁用于非法用途.
1. 准备工作
在开始解析之前, 我们需要准备一些工具:
- NTQQ
- DB Browser for SQLite
- LLDB (MacOS 自带, 注意需要关闭 SIP)
- Hopper Disassembler
因为我们的流程非常简单, 免费版的 Hopper 即可满足需求.
2. 分析
你需要先准备一个自己喜欢的工作目录, 并且将 NTQQ 的 Library 复制到当前目录下:
1 | cp /Applications/QQ.app/Contents/Resources/app/wrapper.node . |
随后, 你需要使用 Hopper 打开 wrapper.node
在 Mac M1/M2 上需要选择 aarch64
, 并且搜索 nt_sqlite3_key_v2
.
如上图所示, 我们可以跳转到引用该函数的地方, 随后记下该函数地址:
3. 断点 & 调试
随后我们运行 NTQQ, 找到它的进程 ID, 并且使用 LLDB 进行调试:
1 | ❯ ps aux | grep QQ |
1 | lldb -p 78488 |
我们需要寻找 wrapper.node
的加载地址:
1 | (lldb) image list -o -f | grep /Applications/QQ.app/Contents/Resources/app/wrapper.node |
接下来进行一个简单的数学运算, 计算出 nt_sqlite3_key_v2
的地址:
1 | (lldb) expr 0x0000000110088000 + 0x000000000192bef8 |
设置断点并且继续运行:
1 | (lldb) br s -a 4590354168 |
点击登录后, 如无意外, 你会看到断点被命中, 并且进入了 nt_sqlite3_key_v2
函数, 如下图所示:
参考函数签名:
1 | int sqlite3_key_v2( |
接下来解析 16 个字符即可:
1 | (lldb) register read x2 |
至此, 我们已经成功解析出了 NTQQ 的数据库密钥.
4. 解密
数据库位于 (注意 MD5 可能会随着 QQ 的版本更新而改变):
1 | /Users/user/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/nt_qq_{MD5}/nt_db |
复制你需要的文件, 如 profile_info.db
, 跳过前 1024 个字节:
1 | cp "/Users/user/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/nt_qq_cc067b8bcbf8980fabd93574e09d9efa/nt_db/profile_info.db" test.db |
随后, 打开 DB Browser for SQLite, 选择 test.clean.db
, 输入密钥和 KDF = 4000
, 即可成功解密:
出于隐私考虑, 不展示解密后的数据库内容.
5. 总结
本文介绍了如何解析 NTQQ 的数据库, 以及如何使用 DB Browser for SQLite 浏览数据库.
需要注意的是, 数据库结构仍需分析, 本文仅仅是提供了解密的方法.
再次声明, 本文仅用于学习交流, 严禁用于非法用途.