十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

把QQ聊天记录从加密数据库里救出来:全平台密钥提取与解密完整教程

把QQ聊天记录从加密数据库里救出来:全平台密钥提取与解密完整教程 把QQ聊天记录从加密数据库里救出来全平台密钥提取与解密完整教程【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key如果你曾点开一个nt_msg.db文件期待看到聊天记录结果却是一堆乱码和文件已损坏的提示那么你大概已经撞上了 QQ NT 版的加密机制。从新版 QQ 开始所有聊天数据都被 SQLCipher 加密存放在本地钥匙只存在于运行中的 QQ 进程里。本篇文章要介绍的 qq-win-db-key正是一个面向全平台的 QQ 聊天数据库解密工具集它做的事情只有一件帮你把锁在数据库里的聊天记录重新拿出来。接下来我们从为什么打不开讲起一步步走到完整恢复。先说结论这套工具能帮你做到什么程度先别急着看命令我们用一个表格说清楚 qq-win-db-key 的能力边界你就能判断它是不是你需要的平台目标对象主要手段产出WindowsNTQQwrapper.node中的nt_sqlite3_key_v2PowerShell 脚本 调试器断点16 位加密密钥Windows旧版 PCQQKernelUtil.dll的sqlite3_keyFrida 动态注入Msg3.0.db密钥LinuxNTQQ/opt/QQ/resources/app/wrapper.nodereadelf/objdump GDB16 位加密密钥macOSApple SiliconQQ 内的wrapper.nodelldb 自动化无需关闭 SIP密钥甚至可导出 HTML/JSONAndroidlibkernel.so内的密钥函数Frida Hook数据库密钥或备份密钥iOSsqlite3_key_v2调用点Frida 注入数据库密钥一句话总结拿到密钥之后配合 SQLCipher 就能打开任何 QQ NT 的加密数据库。密钥本身只有 16 个 ASCII 字符但它是整个解密流程的核心也是本项目所有脚本共同追逐的目标。动手之前三件必须先做的事这些脚本本质上是逆向工程工具会附加到 QQ 进程上。操作前请务必完成以下准备否则可能损失数据备份原始数据库。Windows 上用 PCQQ 自带的导出消息记录mht 格式macOS/Linux 直接复制nt_db目录Android 用系统备份功能。备份永远是第一优先级。在次要环境测试。优先在虚拟机或不常用的设备上跑通流程确认脚本与你的 QQ 版本兼容再在主力机器上操作。审查脚本代码。项目 README 明确提醒脚本需要根据 QQ 版本、系统环境做调整且存在损坏数据或触发风控的风险。使用前打开脚本通读一遍理解它做什么而不是无脑执行。这个项目不是纯小白一键工具而是假设你具备一定命令行和调试基础。但别担心本文会把每一步都拆开讲清楚。准备好之后先把仓库拉到本地git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-key第一步从 Windows 端拿到数据库密钥Windows 是 QQ NT 用户量最大的平台官方脚本 scripts/windows/ntqq/windows_ntqq_get_key.ps1 也做得最傻瓜化。它自动完成三件事定位已安装的 QQ、在wrapper.node里搜索nt_sqlite3_key_v2字符串、用调试器在密钥函数上打断点并把密钥读出来。运行前先放开 PowerShell 的执行策略Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser然后切到脚本目录执行.\windows_ntqq_get_key.ps1脚本会先自动检测 QQ 安装目录和版本号然后启动 QQ 并附加调试器。此时你只需要在 QQ 登录窗口里正常登录脚本会在nt_sqlite3_key_v2被调用的瞬间拦截从寄存器里读出密钥并打印在终端里。整个过程不需要手动分析二进制适合第一次接触逆向的新手。如果你只想做静态分析、不想让脚本碰 QQ 进程加一个参数即可.\windows_ntqq_get_key.ps1 -NoDebugForKey这个模式只分析wrapper.node并输出目标函数的 RVA 偏移适合排查问题或适配新版本 QQ。脚本同时兼容 PowerShell 5.0 和 Core 7.0遇到编码问题它会自动以 UTF-8 重新加载自身。第二步拿到密钥后三步打开任何 NT 数据库密钥到手只是开始。QQ NT 的数据库有双重保险一层是 SQLCipher 加密另一层是文件头偏移。数据库文件前 1024 字节是自定义格式的头部标准的 SQLite 工具无法识别必须先剥掉。第 1 步剥离文件头。把数据库文件的前 1024 字节切掉生成一个干净的副本tail -c 1025 nt_msg.db nt_msg.clean.db这条命令的意思是从第 1025 个字节开始取到文件末尾即丢弃前 1024 字节。之后所有操作都针对nt_msg.clean.db进行原始文件保持不动。第 2 步用 SQLCipher 以正确参数打开。QQ 使用的加密配置是固定的直接照抄下面这组参数即可PRAGMA key 你的16位密钥; 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;前两行是密钥和页大小后面几行是密钥派生算法。任何一个参数不对SQLCipher 都会报file is not a database所以请逐字核对。第 3 步验证并导出。参数设置成功后先做完整性检查再浏览表结构PRAGMA integrity_check; SELECT name FROM sqlite_master WHERE typetable;如果integrity_check返回ok说明密钥和参数都正确。接下来你就可以用 DB Browser for SQLite 这类图形工具打开nt_msg.clean.db或者用sqlcipher命令行把它导出成普通 SQLite 文件方便后续查询和迁移。第三步Linux、macOS、Android、iOS 一次说清Windows 之外其余平台的流程核心一致——分析wrapper.node断点截获密钥只是工具链不同。下面按平台给出最短路径。Linuxreadelf GDB 的组合拳Linux 端脚本 scripts/linux/linux_qq_get_key.py 依赖readelf、strings、objdump和gdb默认读取/opt/QQ/resources/app/wrapper.nodeDebian 系安装路径其他发行版需自行修改脚本顶部路径。运行方式是把 QQ 先启动到登录界面再用 GDB 加载脚本并放行脚本会自动在wrapper.node加载时下断点从$rsi、$rdx寄存器中读出 16 位密钥。整个流程由 Python 脚本驱动无需手动敲 GDB 命令。macOS无需关闭 SIP 的 lldb 方案macOS 端的亮点在 scripts/macos/arm-nosip/qq_key_extractor.py它绕过了传统逆向必须关闭 SIP 的限制只用 lldbXcode 命令行工具自带 Python 标准库就能完成提取。测试环境为 QQ NT 6.9.96 macOS 27 Tahoe Apple Silicon。操作分两个终端终端 A 运行lldb -n QQ -w并导入脚本终端 B 执行open /Applications/QQ.app启动 QQ。等登录界面出现后在 lldb 里依次执行process continue、Ctrl-C暂停、qq-setbp设断点、c继续然后在 QQ 里点击登录密钥会自动打印且QQ 会继续正常运行不会被拖死。AndroidFrida Hook 走一遍Android 端 scripts/android/android_get_key.py 通过 Frida 在libkernel.so里用特征码定位密钥函数并 Hook。前置条件比较苛刻需要 root、关闭 SELinux、关闭 Magisk Hide 与 Shamiko且不支持 x86/x64 模拟器只支持 ARM 真机或 Termux 环境。脚本支持按 QQ 版本传入参数例如python android_get_key.py 8.9.58运行后先让 QQ 进入主界面再退出登录并重新登录一次触发数据库重新加密的动作脚本就能捕获密钥。如果你需要的是系统备份文件的密钥改用同目录下的 scripts/android/android_get_backup_key.py。iOS一条 Frida 脚本搞定iOS 端只有一个文件 scripts/ios/ios_get_key.js针对 QQ v9.0.1.620SQLCipher 4.5.1写死了sqlite3_key_v2的函数偏移。用法同样依赖 Fridafrida -U QQ -l ios_get_key.js脚本会 Hooksqlite3_key_v2并过滤出nt_db/nt_msg.db相关的调用打印密钥、数据库名和 nKey 长度。要注意的是iOS 偏移量会随 QQ 版本变化升级 QQ 后需要重新定位偏移。进阶玩法旧版 PCQQ 与 Web 界面导出如果你还在用旧版 PCQQMsg3.0.db同样可以解密。scripts/windows/pcqq/pcqq_get_key.py 通过 Frida HookKernelUtil.dll的sqlite3_key只拦截Msg3.0.db的调用并打印密钥。同目录下还有pcqq_dump.py导出数据库和pcqq_rekey_to_none.cpp重加密为空密码适合想要完整迁移旧数据的场景。注意pcqq_DANGER_rekey.py从命名就能看出风险如非必要不要碰。macOS 用户还有一个惊喜scripts/macos/arm-nosip/qq_web.py 把整个提取-解密-导出流程封装成了本地 Web 界面。运行后浏览器自动打开按页面提示依次签名 QQ → 启动提取 → 等待密钥然后在导出页选择数据库路径和格式就能一键生成可直接浏览的 HTML 聊天记录或 JSON 原始数据界面甚至复刻了微信风格的聊天气泡。它需要两个依赖pip install flask brew install sqlcipher这个工具把密钥提取和导出合并成了一条龙是当前项目里对普通用户最友好的入口。常见报错排查清单以下是各平台高频踩坑点的速查表遇到问题先对照这里症状可能原因解决办法SQLCipher 报 file is not a database文件头未剥离或 PRAGMA 参数有误确认先执行tail -c 1025逐字核对页大小、kdf_iter 等参数密钥提取失败 / 找不到字符串QQ 版本与脚本不兼容用-NoDebugForKey先做静态分析确认能定位nt_sqlite3_key_v2更新 QQ 后重试GDB/lldb 无法附加进程系统权限或 hardened runtime 限制Linux 检查 ptrace 权限macOS 用qq_web.py的自动重签名功能Android 脚本无输出SELinux 未关闭、隐藏 root 工具未停用依次关闭 SELinux、Magisk Hide、Shamiko 后重试导出后消息方向颠倒气泡方向标记选错在导出页面把nt_2切换为nt_1再导出一次脚本报编码/路径错误QQ 安装路径特殊或环境变量缺失直接给脚本传-WrapperNodePath指定wrapper.node的完整路径如果问题不在清单里优先检查两点QQ 版本是否匹配、是否做了原始备份。版本不匹配是所有脚本失败的第一大原因而备份是你在反复调试中唯一的后悔药。收尾下一步该做什么回头看这条完整的链路先备份数据再用平台对应脚本从运行中的 QQ 进程里取出 16 位密钥接着剥掉 1024 字节文件头最后用一组固定的 SQLCipher 参数打开数据库并导出。到了这一步无论你是想抢救一条重要消息、把历史记录迁移到新设备还是用 Python 分析自己的聊天数据都站在了同一条起跑线上。下一步不妨这样开始先在 Windows 虚拟机里跑一遍 scripts/windows/ntqq/windows_ntqq_get_key.ps1用-NoDebugForKey确认你的 QQ 版本能被识别再决定是否执行完整提取。跑通一次之后你对数据库加密到底是什么的理解会上一个台阶。最后照例提醒一句本项目仅用于个人数据恢复与学习交流请在遵守所在地区法律法规和 QQ 软件许可协议的前提下使用。操作全程保留原始备份风险自担——毕竟数据安全永远比一次成功更重要。【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表