三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

5步搞定QQ聊天数据库解密:qq-win-db-key全平台密钥提取完整指南

5步搞定QQ聊天数据库解密:qq-win-db-key全平台密钥提取完整指南

5步搞定QQ聊天数据库解密:qq-win-db-key全平台密钥提取完整指南

【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key

如果你正在寻找 QQ 聊天数据库解密的可行方案,那么这篇文章很可能就是你需要的完整指南。它围绕开源项目qq-win-db-key展开——这是一个面向 Android、iOS、Windows、macOS、Linux 五大平台、通过逆向工程提取 QQ 数据库密钥的工具集。我会从原理讲到实战、从踩坑讲到提速,把我实际"走通这条路"的经验和教训一次讲透。


当 10 年聊天记录被困在一个加密文件里

先讲一个我亲历过的场景。

我的 QQ 号用了十几年,群聊、私聊、文件传输记录加起来有好几万条。某天我想把这些记录完整地导出来做本地归档——结果发现 QQ 官方只提供有限的消息漫游,第三方导出工具要么要付费、要么只支持某个特定版本。更麻烦的是,QQ 的聊天记录存在一个叫nt_msg.db的文件里,而这个文件是加密的——用 SQLCipher 加密,没有密钥,拿到的只是一堆看似无意义的字节。

我盯着那个文件,脑子里只有一个问题:这把锁的钥匙到底在哪?

后来我才意识到,这个问题的答案其实就藏在你天天使用的 QQ 里。而 qq-win-db-key 这个项目,就是帮你把钥匙"拿"出来的那套工具。


一句话认识 qq-win-db-key

qq-win-db-key 是一个通过逆向工程技术,从正在运行的 QQ 进程中提取数据库解密密钥、并辅助导出和解密聊天数据库的开源工具集。

它的核心价值有三点:全平台覆盖(五大系统都有对应脚本)、不修改 QQ 安装包(大多方案选择注入或调试而非篡改文件)、方案多样(既有 Hook 注入,也有纯静态分析)。对于"想把聊天记录备份出来"的普通用户,和"想研究 SQLCipher 与移动应用加密"的逆向爱好者,它都值得一看。


原理白话版:在 QQ "开门"的一瞬间看一眼钥匙

很多人一听到"逆向工程"就发怵,其实它的核心逻辑非常朴素。我们做个类比:

把 QQ 的聊天数据库想象成一个保险箱,SQLCipher 是锁,密钥就是钥匙。保险箱平时锁着,但 QQ 自己要看聊天记录,所以它必须在运行时用钥匙开箱。这意味着:无论密钥藏得多深,在 QQ 登录、读取消息的那一刻,它必然以明文形式出现在进程内存里。

qq-win-db-key 做的事,用一句话概括就是——守株待兔:在 QQ 调用解锁函数nt_sqlite3_key_v2(SQLCipher 设置密钥的核心接口)的那一瞬间,用调试器或 Hook 技术把调用拦下来,读出传给它的密钥参数。

把整个过程拆成"输入 → 处理 → 输出"就更清楚了:

阶段内容
输入正在运行的 QQ 进程 + 加密的数据库文件(如nt_msg.db
处理定位nt_sqlite3_key_v2函数 → 下断点或 Hook → 截获密钥参数
输出一段密钥文本 + 一组解密参数(页大小、KDF 迭代次数、HMAC 算法等)

拿到这两样东西,你就能用 SQLCipher 官方工具把数据库"开锁"成明文,再导出成可读的聊天记录。

值得一提的是,不同平台"拦"的方式不一样,但思路完全一致:

  • Android:用 Frida 注入进程,在libkernel.so里按特征码定位函数后 Hook;
  • iOS:同样是 Frida,直接按模块偏移地址挂钩sqlite3_key_v2
  • Windows(NTQQ):用 PowerShell 调用 Windows 调试 API,启动 QQ 进程并附加调试器,在wrapper.node加载后下断点;
  • macOS(ARM):用 lldb 自动化脚本,在 Apple Silicon 上无需关闭 SIP即可提取(这正是arm-nosip目录名的含义);
  • Linux:用readelf/strings/objdump做静态分析定位函数,再用 GDB 动态调试。

零基础快速上手:4 步跑通第一个平台

别急着深入每个平台,先建立"我能跑通"的信心。下面是最短路径,以最典型的 Android 平台为例:

第 1 步:确认版本兼容性打开脚本看一眼它支持的版本列表——目前 Android 侧覆盖8.9.58 / 8.9.63 / 8.9.68 / 8.9.76等版本。这一步为什么非做不可?因为逆向定位依赖二进制特征码,版本变了特征码就可能失效,这是整个项目"最娇气"的一环。

第 2 步:准备运行环境电脑上装好 Python 3.8+ 和 Frida:pip install frida-tools。Android 设备需要 Root 或相应调试权限。Windows 只需要 PowerShell 5.0+;macOS 只需 Xcode Command Line Tools(自带 lldb);Linux 需要gdbreadelfobjdumpstrings。一句话:按你所在的平台把对应调试工具装齐

第 3 步:获取项目代码克隆仓库到本地:

git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-key

这个仓库不大,目录结构很清爽,scripts/下按平台分好了文件夹,你要用的脚本一眼就能找到。

第 4 步:跑一个脚本,验证流程打开 QQ 并登录到主界面,然后运行对应平台的提取脚本。看到终端打印出密钥和数据库路径,就说明整条链路通了。验证成功后再去研究"为什么",效率最高。


一次完整实战:Android 上提取密钥并解密数据库

理论讲完了,来一次完整的、可复现的演练。我们以Android + QQ 8.9.58为例子走完全流程,这是社区里验证最充分的组合之一。

① 前置准备

  • 一台已 Root 的 Android 设备(或 Termux 环境),连接电脑并开启 USB 调试;
  • 手机上安装 QQ8.9.58先登录进入主界面
  • 关键的一步:关闭 Magisk Hide 与 Shamiko,并禁用 SELinux。这一步不做,Frida 注入很容易被 QQ 检测或拦截,脚本会卡在等待阶段。

② 提取密钥

进入scripts/android/目录,运行:

python android_get_key.py 8.9.58

脚本会先找到 QQ 进程(找不到就自动拉起),注入 Frida 脚本,在libkernel.so中按预置的特征码序列定位nt_sqlite3_key_v2函数并挂上钩子。然后你在手机上退出登录再重新登录,触发数据库重新解密——此时密钥就会被捕获并打印出来,类似:

¦- targetDB: 0x... ¦- *zDb: nt_msg.db ¦- *pkey: abcd1234.,.,ABCD1234567812345678 ¦- nKey: 32

这一步的实质是:密钥只在登录时"过手"一次,所以脚本才要求你重新登录来主动制造触发机会。

③ 解密数据库

拿到密钥后,把手机上的nt_msg.db(一般在/data/data/com.tencent.mobileqq/...下)拷到电脑,用 SQLCipher 命令行工具解密:

PRAGMA key = 'abcd1234.,.,ABCD1234567812345678'; PRAGMA cipher_page_size = 4096; PRAGMA kdf_iter = 4000; PRAGMA cipher_hmac_algorithm = HMAC_SHA1; PRAGMA cipher_default_kdf_algorithm = PBKDF2_HMAC_SHA512; .schema

前五行是把"开锁参数"对齐到 QQ 创建数据库时的配置——参数错一个,密钥再对也打不开,这是解密失败的三大元凶之首。最后一行.schema能列出表结构,看到表名出现就说明解密成功了。

④ 验证与保存

解密成功后,把密钥连同 QQ 版本、解密参数一起存到安全的地方(建议离线保存),并顺手跑一句PRAGMA integrity_check;确认数据完整性。整套流程到这里就闭环了。

💡 顺带一提:macOS 平台上数据库文件通常在~/Library/Application Support/QQ/nt_qq_<hash>/nt_db/nt_msg.db,且文件开头有 1024 字节的 SQLCipher 头部,解密前要先tail -c +1025 nt_msg.db > nt_msg.clean.db去掉头部再交给 sqlcipher——这也是我踩过的坑,下面细说。


踩坑避雷清单:新手最容易翻车的 7 个地方

我把亲自踩过、以及社区里高频出现的问题整理成清单,句句都是教训:

  1. 不要用 x86/x64 安卓模拟器。脚本依赖 ARM 指令特征码,模拟器上libkernel.so的结构完全不同,要么找不到函数,要么 Hook 错位置。用真机或 ARM 模拟器。

  2. 不要对着原始数据库做 rekey 操作。仓库里有个文件名直接叫pcqq_DANGER_rekey.py,脚本开头就写着"必定损坏原始数据库!rekey 之后不能用原先的 key 解锁!"并直接exit()。不要自作主张去掉这行保护——要复制一份副本去折腾,原件永远别动

  3. 版本不匹配却怪脚本没用。逆向定位靠的是二进制特征,QQ 一更新,特征码就可能失效。先确认你的 QQ 版本在脚本支持列表里;不在就换版本或等社区更新,而不是反复重跑同一个脚本。

  4. 开着 Magisk Hide / Shamiko 就注入。这些工具本意是隐藏 Root,但也会干扰 Frida 注入。正确姿势是:注入前关闭它们、禁用 SELinux,跑完再恢复。

  5. 忽略"先备份"三个字。仓库 README 的第一条警告就是"工具可能破坏聊天记录或导致封号"。正确姿势:先用 QQ 自带的"导出消息记录(mht 格式)"做保险,再用系统备份或全盘备份兜底,最后才在不常用设备或虚拟机上操作。

  6. 密钥对但打不开库,先查参数。很多人在PRAGMA key之后卡住,其实问题不在密钥而在参数:页大小是 4096 还是 1024?KDF 迭代是 4000 还是 64000?HMAC 是 SHA1 还是 SHA512?不同 QQ 版本参数有差异,务必以你抓到密钥的那个版本为准。

  7. 把"能提取密钥"等同于"全自动解密"。现实是:你仍需要自己拷贝数据库、自己拼 SQLCipher 命令、自己处理头部偏移。这个项目解决的是"最难的那一环",不是一键傻瓜化。


进阶提速技巧:4 个能帮你省下半天调试时间的姿势

当你跑通一条链路之后,下面这些技巧可以明显提升效率,我按适用人群标注了:

1. 静态分析先行,减少动态调试的盲目性(适合逆向研究者)Windows 脚本支持-NoDebugForKey参数,只做静态分析、不启动 QQ 进程;macOS 下有独立的find_key_func.py,可以在不运行 QQ 的情况下从wrapper.node里定位出函数入口地址。先静态定位、再精准下断点,能省掉大量"猜地址"的时间。

2. 优先选"不注入进程"的方案(适合所有用户,尤其是怕封号的)Android 侧除了常规注入,还有android_get_backup_key.py这类基于备份的密钥提取方案。仓库也反复建议"尽可能选择不注入 QQ 进程、不修改安装包的方式"。风险排序永远是:不注入 < 注入 < 改文件,能选前面的就别选后面的。

3. 用好一键导出脚本,绕过手动 SQL(适合数据量大的用户)Android 的android_dump.js会在 Hook 到sqlite3_exec后,自动执行sqlcipher_export把整个库导出为明文;Windows 旧版 PCQQ 的pcqq_dump.py则通过"rekey 到空密码 → 复制新库"的方式直接产出可读文件。注意:这类脚本要在副本上操作,别对原件动手。

4. 缓存复用分析结果(适合 Linux 用户反复调试)Linux 脚本会把wrapper.node的哈希和已算出的引用偏移缓存到本地ref_off_cache文件,文件没变就不会重新跑一遍objdump全量反汇编。多调试几次你就会发现,这个设计能帮你省下大量等待时间。


价值与边界:它擅长什么,不承诺什么

先看这个项目最直观的优势盘点:

维度表现
平台覆盖Android、iOS、Windows(NTQQ + 旧版 PCQQ)、macOS(含 ARM 免关 SIP)、Linux,五大平台都有对应脚本
方案多样性同一平台往往有注入 / 备份 / 纯静态分析等多种路线,可按风险偏好选择
侵入性低主流方案不修改 QQ 安装包,部分方案完全不注入进程
工程化细节静态分析工具链、偏移缓存、自动化断点脚本,看得出是实战沉淀

再看它的边界,这些同样重要:

  • 它不是给纯小白的一键工具。README 说得很直白:项目"并非面向纯小白的完整教程",假设使用者具备一定的逆向、动态调试和脚本修改能力。脚本常需根据 QQ 版本、系统环境和本地安装情况调整。
  • 版本敏感是固有属性。QQ 每次升级都可能让特征码失效,你需要跟着社区节奏更新,或自己动手适配。
  • 存在真实风险。仓库明确警告:工具可能破坏聊天记录或导致封号。这句话不是免责声明式的客套,而是基于真实反馈的提醒。
  • 用途有边界。项目仅供学习交流,严禁用于违反法律法规或《QQ 软件许可及服务协议》的行为;输出内容不可用于法律取证。

一句话总结:它是"解密链条里最难一环"的优质参考实现,但不是"数据安全的万能保险"。用好它,前提是理解它、尊重它的边界。


下一步行动

如果你已经心动,动手路径很简单:

  1. 克隆代码:git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-key
  2. 先读仓库根目录的README.md——特别是"警告⚠"那一节,把备份、虚拟机、不注入这三条原则刻进脑子;
  3. 从你最熟悉的平台开始,用上文的"4 步快速上手"跑通一次最小流程;
  4. 跑通后再深入读对应平台的脚本源码,理解每一处 Hook 和断点在做什么。

最后送你一句话,也是这个项目给我最大的启发:

技术上的"不可能",往往只是还没找到正确的观察角度。当你能在 QQ 开门的一瞬间看到那把钥匙,剩下的问题,就只是耐心和细心的问题了。

【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表