QQ数据库解密指南:5分钟上手提取聊天记录密钥
【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key
本文带你用开源项目 qq-win-db-key 完成QQ数据库解密的第一公里:提取 QQ 聊天数据库的加密密钥。QQ 把本地聊天记录存在加密过的数据库文件里(主要是 Msg3.0.db),用 SQLCipher 加密,而密钥不落盘——每次登录时程序向服务器请求,只短暂存在于进程内存中。这个项目的思路很直接:在密钥函数被调用的一瞬间把它"钩住"(Hook,即给目标函数挂个钩子,函数一被调用就被拦截),顺手读出密钥。项目覆盖 Windows、Linux、macOS、iOS、Android 五个平台。适合想备份、导出自己聊天记录的开发者与数据爱好者。注意:动手前务必先备份数据,且只应处理你有权访问的数据。
原理速览:QQ 数据库为什么打不开
理解四件事,你就懂了整个项目的逻辑:
- 文件是加密的。聊天记录数据库采用 SQLCipher 4 方案(基于 SQLite 的加密扩展),按 4096 字节一页做 AES 加密,并带 HMAC 校验。没有密钥,文件就是一堆乱码。
- 密钥不在磁盘上。每次启动 QQ 并登录,客户端都会从服务器侧重新获取一份密钥,只在内存里使用。这意味着"去配置文件里找密钥"这条路走不通。
- 函数名是突破口。QQ 内部封装了一个数据库加解锁函数
nt_sqlite3_key_v2,每次打开数据库时都会调用它并传入密钥参数。逆向分析确认了这个函数的存在,它就成了唯一需要盯住的位置。 - 脚本替你盯着。各平台脚本的工作都一样:先在 QQ 的可执行模块(如 Windows 的 KernelUtil.dll、wrapper.node,Android 的 libkernel.so)里用字节特征码(一段能唯一定位函数的机器码)找到函数地址,然后挂上 Hook,函数一执行就把"数据库名 + 密钥内容"打印到控制台。你只需在合适的时机(登录、打开聊天窗口)触发它。
整个链条可以概括为一句话:特征码定位函数 → 挂 Hook 拦截 → 登录后触发 → 密钥打印到屏幕。
上手流程:三步拿到你的 QQ 数据库密钥
下面以 Windows 为例走完整流程。其他平台的脚本放在对应目录,思路完全相同:scripts/android/、scripts/ios/、scripts/linux/、scripts/macos/arm-nosip/。
第一步:环境准备与操作前备份
先把仓库代码拿到本地,这条命令完成克隆:
git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-keyWindows 下还需要 Python(建议 3.9 以上)和两个依赖库,这条命令一次装好:
pip install frida psutil其中 frida 是动态注入框架(把一段脚本"塞"进正在运行的进程里),psutil 用来定位 QQ 进程。
⚠️操作前请做好三件事:
- 优先使用 PCQQ 自带的"导出消息记录"(MHT 格式),这是零风险的第一备份;
- 对
~/.config/QQ(Linux)或 QQ 数据目录做一次完整拷贝; - 尽量在不常用设备或虚拟机里操作。脚本注入 QQ 进程,存在数据损坏甚至账号风险,官方 README 已明确提示这一点。
最后确认 QQ 处于已登录、正在运行的状态——Hook 只截获运行中的函数调用,QQ 没登录什么都等不到。
第二步:运行密钥提取脚本
Windows 上分两个版本,按你装的 QQ 选择。
旧版 PCQQ:在项目目录下运行这条命令,脚本会自动找到 QQ.exe 并注入 Hook:
python scripts/windows/pcqq/pcqq_get_key.py运行后保持登录状态,随便点开一个有历史记录的聊天窗口,控制台就会打印类似这样的结果:
[+] Msg3.0.db key found: ¦- nKey: 16 ¦- *pkey: 0x61, 0x62, ...(即密钥的十六进制)nKey是密钥长度,pkey就是密钥本体,十六进制转成 ASCII 字符串即可使用。
新版 NTQQ:以管理员身份打开 PowerShell,进入项目目录后运行:
.\scripts\windows\ntqq\windows_ntqq_get_key.ps1这个脚本不需要 frida。它先从注册表自动检测 QQ 安装目录和版本,定位wrapper.node里的目标函数,然后带调试器启动 QQ 并下断点。你在弹出的 QQ 窗口里正常登录,脚本就会在控制台输出"找到密钥: xxxxxxxxxxxxxxxx"(16 位 ASCII 字符串),任务完成。也可以加-NoDebugForKey参数只做静态分析、不真正抓密钥。
其他平台简述:
- Android:
scripts/android/android_get_key.py配合 frida 在手机上 Hooklibkernel.so; - Linux:
scripts/linux/linux_qq_get_key.py先解析wrapper.node的 ELF 段,再用断点方式抓密钥; - macOS:
scripts/macos/arm-nosip/qq_key_extractor.py是一个 lldb 插件,Apple Silicon 上无需关闭 SIP,按脚本头部注释的两个终端流程操作即可。
第三步:验证密钥并解密数据库文件
拿到密钥后,先用它打开数据库验证。最简单的方式是 sqlcipher 命令行工具,连接时逐条执行这些 PRAGMA 参数(页面大小 4096、KDF 迭代 4000 次是 QQ 的定制配置,与 SQLCipher 默认值不同,必须显式指定):
PRAGMA key = "你抓到的密钥"; PRAGMA cipher_page_size = 4096; PRAGMA kdf_iter = 4000; SELECT count(*) FROM sqlite_master;最后一条查询能正常返回数字,说明密钥正确、数据库结构完好;若报 "file is not a database",通常是密钥不对或 KDF 参数没配对。
Windows 旧版 PCQQ 还有一个捷径:scripts/windows/pcqq/pcqq_dump.py在抓键的同时,直接调用 QQ 自己的加解密函数把数据库解密写入你指定的文件,省掉手工解密环节。
常见坑点与排查方法
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 脚本报 "QQ not launched. exit." | QQ 未运行或没登录 | 先登录 QQ 并保持运行,再重新运行脚本 |
| "pattern NOT FOUND" | QQ 更新后字节特征码失效 | 升级到最新版脚本;仍无效需用 IDA 重新定位函数、更新特征码 |
| 抓到密钥但解密报 "file is not a database" | KDF/HMAC 参数不匹配,或密钥抓错库 | 核对kdf_iter等 PRAGMA;确认 Hook 打印的是 Msg3.0.db 对应的密钥 |
| Windows 下读内存失败、无输出 | 权限不足 | 以管理员身份运行 PowerShell / 终端 |
| 断点命中但输出"非目标调用" | QQ 内部对函数有其他用途的调用 | 属正常现象,脚本会单步跳过,等待登录时的那次真实调用 |
| 运行后 QQ 崩溃或行为异常 | 注入进程带来的风险 | 立即停手,恢复备份;今后优先用非主力设备或虚拟机 |
进阶:从抓键到解析聊天记录
密钥只是第一公里。接下来可以关注三件事:
- 数据库解析:Msg3.0.db 的表结构、消息格式有专门的解析文档,结合 sqlite 工具即可把消息还原成可读文本或导出格式;
- 目录结构:各平台脚本都按
scripts/平台/组织,如scripts/windows/ntqq/、scripts/android/,新平台适配时可参照现有实现; - 高风险工具慎入:
scripts/windows/pcqq/pcqq_DANGER_rekey.py和pcqq_rekey_to_none.cpp会改写数据库的加密密钥(危险操作),文件名里的 DANGER 不是摆设,不读完源码请勿运行。
项目遵循开源协议,欢迎通过 Issue 和 PR 参与:适配新版 QQ、移植新平台、改进解析算法都是实际有效的贡献方向。
【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考