QQ 聊天记录解密全流程实操:从密钥提取到跨设备迁移的完整链路 QQ 聊天记录解密全流程实操从密钥提取到跨设备迁移的完整链路【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key本文围绕「QQ 聊天记录解密」这个核心场景带你完整走一遍qq-win-db-key项目提供的工具链它是一套覆盖 Windows、macOS、Linux、iOS、Android 五个平台的开源脚本集合专门解决「QQ NT 数据库被 SQLCipher 加密、无法直接读取」的难题。读完你会明白聊天记录为什么打不开、密钥藏在哪、怎么安全地把数据搬到新设备。1. 先搞懂你的聊天记录被锁在哪几道门后面很多人的第一反应是「数据库坏了」其实更常见的情况是数据库根本没坏只是被加密了。QQ NT 版本把聊天记录存成 SQLite 数据库但套了三层「锁」任何常规工具都打不开第一道锁SQLCipher 加密。整个数据库文件用 AES-256-CBC 加密没有密钥时文件内容是一堆不可读的乱码连表结构都看不到。第二道锁1024 字节特殊文件头。数据库文件最前面有 1024 字节的私有头信息SQLite 只认自己格式的文件头所以即使拿到密钥也要先把这段剥掉。第三道锁密钥不落盘。密钥只存在于 QQ 进程的内存里由nt_sqlite3_key_v2这个函数在启动时调用你翻遍硬盘也找不到一个写着密钥的配置文件。用生活化的比喻聊天记录锁在保险箱里SQLCipher保险箱外面还套了个不透明的快递箱文件头而开箱的门禁卡密钥始终装在管理员的口袋里进程内存——你想打开它就得想办法从管理员口袋里「借」一次卡或者在他刷卡的一瞬间记下密码。这也决定了所有解密方案的核心思路是一致的让 QQ 自己把密钥交出来而不是暴力破解。qq-win-db-key 的全部脚本本质上是五套不同平台的「借卡」手法。2. 一套工具箱五种「借卡」思路很多教程按平台一章一章讲容易让人以为每套脚本是孤立的。其实拆开看项目只用了五种技术路线每个平台只是同一路线的不同实现。理解这一点你就能举一反三技术路线原理一句话对应脚本适用平台动态调试断点用调试器在密钥函数上打断点命中时读取寄存器里的密钥windows/ntqq/windows_ntqq_get_key.ps1Windows NTQQFrida 注入 Hook向运行中的 QQ 进程注入 JS 脚本拦截密钥函数调用并打印参数android/android_get_key.py、ios/ios_get_key.js、windows/pcqq/pcqq_get_key.pyAndroid / iOS / 旧版 PCQQ静态分析 GDB先用 readelf/objdump 定位字符串引用再用 GDB 断点抓取linux/linux_qq_get_key.pyLinux NTQQlldb 自动化用 lldb 脚本自动计算断点地址免关闭 SIPmacos/arm-nosip/qq_key_extractor.pymacOSApple Silicon重加密改造直接调用进程内函数把密钥改成空实现无密钥打开windows/pcqq/pcqq_rekey_to_none.cpp等旧版 PCQQ 注意一个细节Windows NTQQ 的 PowerShell 脚本内置了一个完整的调试器实现几百行 P/Invoke 代码直接调用 Windows 调试 API不依赖任何外部调试工具所以才能做到「一条命令」完成从静态分析到断点提取的全过程。你该怎么选先看自己电脑装的是哪版 QQ新版 NT 架构走wrapper.node相关脚本老版 PCQQ 走KernelUtil.dll相关脚本。版本对不上时脚本会因特征码不匹配而报错这属于正常现象不是脚本坏了。3. 全流程实操Windows 上把加密库变成明文下面以 Windows NTQQ 为例走一遍完整链路。这也是全平台中最典型的流程其他平台只是第一步的「取钥匙」方式不同。3.1 第一步拿到密钥先确认 Windows 上安装了 QQ NT 版然后以管理员身份打开 PowerShell执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser powershell -ExecutionPolicy Bypass -File .\windows_ntqq_get_key.ps1脚本会自动完成四件事从注册表检测 QQ 安装目录定位到versions\版本号\resources\app\wrapper.node在wrapper.node里搜索nt_sqlite3_key_v2: db%p zDb%s字符串反向定位引用它的LEA指令再通过异常目录找到所属函数地址以调试模式启动 QQ等wrapper.node加载后在目标函数地址写入0xCC软件断点断点命中时从寄存器R8读出 16 字节密钥并打印。看到类似下面的输出就成功了找到密钥: XXXXXXXXXXXXXXXXX⚠️ 这一步会短暂启动 QQ 并要求登录属于注入进程的操作建议先在虚拟机或备用设备上验证不要直接在主力账号上反复试验。3.2 第二步剥掉 1024 字节文件头拿到密钥后找到数据库文件通常位于 QQ 安装目录或用户目录下的nt_db文件夹典型文件名为nt_msg.db。先备份再执行# Linux / macOS tail -c 1025 nt_msg.db nt_msg.clean.db # Windows 或任意平台用 Python 一行搞定 python -c open(nt_msg.clean.db,wb).write(open(nt_msg.db,rb).read()[1024:])剥掉文件头后的nt_msg.clean.db才是标准 SQLite 文件SQLCipher 才能正确识别。3.3 第三步配置 SQLCipher 参数打开这一步最容易出错因为 QQ 用的不是 SQLCipher 默认参数。用 sqlcipher 命令行工具打开PRAGMA key 你的32位密钥; PRAGMA cipher_page_size 4096; PRAGMA kdf_iter 4000; PRAGMA cipher_hmac_algorithm HMAC_SHA1; PRAGMA cipher_default_kdf_algorithm PBKDF2_HMAC_SHA512; PRAGMA cipher aes-256-cbc; .tables能看到表名列表就说明解密成功。SQLCipher 参数配置方法是全文最关键的细节——kdf_iter 4000、cipher_page_size 4096这两项和默认值不同漏掉任何一个即使密钥正确也会报「file is not a database」。3.4 第四步校验数据完整性解密不等于数据完好。打开后先跑两条 SQLPRAGMA integrity_check; SELECT COUNT(*) FROM buddy_list;integrity_check返回ok说明页结构完整buddy_list的消息条数可以和你印象中的聊天量做个粗略对照。如果这里异常多半是源数据库本身有损坏而不是解密步骤的问题。4. 跨平台迁移把一台设备的聊天记录搬到另一台解密的最大价值之一是让数据脱离 QQ 账号的锁定自由迁移。下面两个场景最常被问到。4.1 场景一Android 备份文件 → 电脑Android 端android_get_key.py通过 Frida 注入hook 掉libkernel.so里的nt_sqlite3_key_v2登录或重登时就能捕获密钥python android_get_key.py操作前注意需要 root 或可用的 Frida 环境且脚本明确要求关闭 Magisk Hide 与 Shamiko、禁用 SELinux——这几项是反调试机制不关会静默失败。拿到密钥后用 Android 系统备份功能导出数据库文件再到电脑上按第 3 节流程解密消息就「搬家」成功了。4.2 场景二macOS → WindowsmacOS 方案是目前体验最顺滑的macos/arm-nosip/qq_key_extractor.py是纯 lldb 自动化模块不需要关闭 SIP对新手极其友好。两个终端配合操作# 终端 A挂起等待 QQ lldb -n QQ -w --one-line command script import /path/to/qq_key_extractor.py # 终端 B启动 QQ open /Applications/QQ.app在 lldb 里依次输入process continue→Ctrl-C→qq-setbp→c然后在 QQ 里点登录脚本会命中断点并从x2/x3寄存器读出密钥还贴心地把数据库路径和解密命令一并打印出来。拿到密钥和nt_msg.db后把它拷到 Windows 电脑按第 3 节的「剥文件头 SQLCipher 参数」流程操作即可——SQLCipher 参数是跨平台通用的这正是这套工具链能打通迁移的关键。5. 平台差异速查表对比项Windows NTQQLinuxmacOS (Apple Silicon)AndroidiOS提取方式内置调试器断点GDB 动态调试lldb 自动化Frida HookFrida Hook是否需要 root/越狱否需管理员否否是是是否需要关 SIP——否——目标二进制wrapper.nodewrapper.nodewrapper.nodelibkernel.soQQ 主模块密钥读取位置R8寄存器$rsi/$rdxx2/x3寄存器函数参数args[2]函数参数args[2]典型数据库nt_msg.dbnt_msg.dbnt_msg.db手机 QQ 数据目录nt_db/nt_msg.db有一点值得强调iOS 和 Android 脚本的授权要求最高需要越狱或 root门槛明显高于桌面端。如果你只是想在 Windows 上救回记录完全不需要折腾移动端。6. 避坑清单最容易翻车的 5 个地方我在读脚本源码时把作者们反复提示的坑整理成一张清单操作前逐条核对版本不匹配就报错Android 脚本的 Frida 注入特征码是按版本号维护的脚本里可见8.9.58、8.9.63等版本字典iOS 脚本也写死了 offset。版本对不上时先查脚本注释里的版本说明别硬试。文件头没剥干净必须剥掉前 1024 字节少一个字节都会导致 SQLCipher 识别失败。用tail -c 1025是最稳妥的写法。SQLCipher 参数抄错kdf_iter 4000、cipher_page_size 4096、HMAC_SHA1三项缺一不可。这也是「为什么密钥对了还是打不开」的头号原因。没有先备份就动手README 开篇就给出严重警告——脚本可能破坏聊天记录或导致封号。务必先做两重保险一是用 QQ 自带的「导出消息记录mht 格式」留底二是整体备份数据库文件。在主账号上反复试验README 明确建议优先在不常用设备或虚拟机中操作。密钥提取是注入进程的敏感操作克制一点更安全。7. 最后的话什么时候该用什么时候不该用这套工具链适合两类人一是普通用户聊天记录打不开或要换设备迁移按本文流程走一遍就能拿回数据二是技术爱好者想研究 SQLCipher 与 QQ 数据格式脚本里的 PE 解析、断点注入、寄存器读取都是很好的逆向分析入门素材。但也请理性看待它的边界它不适合用作法律取证README 明确声明生成内容不可用于法律取证也不适合批量导出他人账号的数据。脚本需要根据 QQ 版本、系统环境调整不是开箱即用的商业软件——遇到报错先对照第 6 节清单排查再考虑版本适配问题。关于合规必须说清楚本项目仅供学习交流使用仅限个人数据恢复目的。使用前请遵守中国大陆法律法规、所在地区法律以及 QQ 软件许可及服务协议不要用于任何违反协议的行为操作前务必备份原始数据。请珍惜自己的账号也尊重他人的隐私。8. 下一步行动建议读完本文建议你按这个顺序动手先备份登录 QQ用「导出消息记录」功能导出一份 mht 留底再取密钥根据你的平台clone 仓库到本地仓库地址https://gitcode.com/gh_mirrors/qq/qq-win-db-key找到对应平台的脚本先读脚本头部的注释和版本说明后解密按第 3 节的三步流程操作用PRAGMA integrity_check校验最后迁移把解密后的明文数据库导入你常用的 SQLite 浏览工具筛选导出你需要的内容。如果你想深入了解某个平台的逆向细节源码里的注释是现成的最佳教材——比如 Windows 脚本里那段完整的调试器实现、macOS 脚本里对 fat binary 的 arm64 段解析都值得一读。工具在手但先用备份兜底、用虚拟机试错、只在个人数据上操作这三点做到位你就能安全地拿回属于自己的聊天记录。【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考