news 2026/8/16 19:27:54

想备份自己的QQ聊天记录?3个关键问题带你入门全平台数据库解密

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
想备份自己的QQ聊天记录?3个关键问题带你入门全平台数据库解密

想备份自己的QQ聊天记录?3个关键问题带你入门全平台数据库解密

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

换手机、重装系统、清理旧电脑……每当想起那些年散落在 QQ 里的聊天记录,你是不是也担心过它们某天就此消失?开源项目 qq-win-db-key 就是为解决这个痛点而生的:它通过逆向分析技术,提取 Windows、Android、iOS、macOS、Linux 全平台 QQ 聊天数据库的解密密钥,让你能把自己账号下的聊天数据真正"搬回家"。

读完这篇文章,你会弄明白三件事:聊天记录为什么被"锁"起来、钥匙(密钥)是怎么被"捡"到的、拿到钥匙后如何"开箱"(解密)。中间穿插真实踩坑记录,帮你把弯路省掉。

问题一:聊天记录为什么被锁在保险箱里?

先看一个现象:QQ 的聊天记录并不是躺在某个文件夹里的明文文件,而是一个经过加密的数据库。它的本质是 SQLite 数据库,但套了一层名为SQLCipher的加密壳。

你可以把它想象成一个上了密码锁的保险箱:保险箱本身(.db文件)就摆在你的电脑或手机里,但你没有密码,只能看着一柜子资料干瞪眼。

SQLCipher 的"锁"有两道工序:

  • 加密:用密钥对数据库内容做 AES 加密,让任何直接打开文件的人都只能看到乱码;
  • 防撬:通过 KDF 迭代故意拖慢暴力破解的速度——可以理解为保险箱的密码盘每转一次都要故意多"咯噔"几圈。QQ 常见配置是页面大小 4096 字节、KDF 迭代 4000 次(部分版本为 64000)、哈希算法 SHA512。

这里有个关键点:加密参数必须与建库时完全一致。就像保险箱的密码盘刻度必须对齐,否则即便你有钥匙也打不开。

那么问题来了:钥匙在哪?QQ 不会把密钥写进配置文件——它是在程序运行时临时算出来的。这就引出了第二个问题。

问题二:密钥藏在哪里,三条"捡钥匙"的路线

既然密钥只在运行时出现,思路就只有一个:在 QQ 调用"开锁函数"的那一刻,把它手里的钥匙抄下来

这个"开锁函数"在 NT 版 QQ 里叫nt_sqlite3_key_v2,你可以把它当成保险箱的官方开锁员——所有数据库解密都要经过它,而它每次开门时,密钥就明晃晃地握在手里。不同平台,"蹲守"这个开锁员的方式各不相同,项目为每个平台都准备了参考实现。

路线一:Windows(NTQQ)——调试器守株待兔

脚本scripts/windows/ntqq/windows_ntqq_get_key.ps1会做两件事:

  1. 静态分析wrapper.node(QQ 的 Node 原生模块,加密逻辑就藏在这里),找到引用nt_sqlite3_key_v2字符串的那条 LEA 指令,再顺着异常表定位出它所属的函数地址;
  2. 用调试器启动 QQ,在该函数入口写入一个断点,等你在 QQ 窗口登录账号、函数被调用的瞬间,从寄存器里读出那串 16 字节的密钥。

整个过程像极了在开锁员必经之路上装了一个"绊线",他一路过就触发警报,我们顺手拿走他口袋里的钥匙。

路线二:Linux——readelf、objdump 与 GDB 三件套

scripts/linux/linux_qq_get_key.py的思路一脉相承,但工具换成了 Linux 原生的调试链:

  • readelf -lW定位.rodata段,用strings找到nt_sqlite3_key_v2: db=%p zDb=%s字符串的偏移;
  • objdump反汇编,找出引用该字符串的指令地址;
  • 最后让 GDB 接管 QQ 进程,在关键函数处停下,直接读取寄存器里的数据库名和密钥。

有意思的是,脚本会把分析结果缓存到本地ref_off_cache文件,下次运行直接复用,不用每次重新反汇编几十 MB 的二进制。

路线三:Android / iOS——Frida 动态注入

移动端没有调试器那么方便,项目改用Frida往 QQ 进程里注入一段 JavaScript:先在内存中扫描libkernel.so的特征字节码,定位key_v2函数,然后拦截它,把参数里的密钥直接打印出来。scripts/android/android_get_key.pyscripts/ios/ios_get_key.js走的就是这条路。至于旧版 PCQQ(Windows 老版本),pcqq_get_key.py则 Hook 的是KernelUtil.dll里的sqlite3_key,专门盯Msg3.0.db的调用。

一句话总结:没有银弹,每个平台都有自己的"入口",而项目已经为每个入口都搭好了脚手架。macOS 侧甚至提供了无需关闭 SIP 的提取工具(scripts/macos/arm-nosip/),尽量不动系统安全设置。

问题三:拿到密钥后,如何一步步解密数据库

假设你已经拿到一串 16 字节的可见字符密钥,比如abcd1234.,.,ABCD1234。接下来就是"开箱"环节——用 SQLCipher 命令行工具打开数据库:

sqlcipher encrypted.db PRAGMA key = '你的密钥'; PRAGMA cipher_page_size = 4096; PRAGMA kdf_iter = 4000; PRAGMA cipher_hmac_algorithm = HMAC_SHA512; PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;

如果密钥和参数都正确,你就能正常执行 SQL 查询了。更推荐的做法是导出一份明文副本,方便后续用 DB Browser for SQLCipher 等图形工具浏览:

ATTACH DATABASE 'decrypted.db' AS plaintext KEY ''; SELECT sqlcipher_export('plaintext'); DETACH DATABASE plaintext;

3分钟速通:全平台密钥提取上手指南

动手前先明确一件事:这不是一个"双击即用"的小白工具,脚本往往需要根据 QQ 版本和系统环境微调。上手指南如下:

git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-key cd qq-win-db-key # Windows:自动检测已安装的 QQ,先做静态分析,再附加调试器提取密钥 powershell -ExecutionPolicy Bypass -File scripts/windows/ntqq/windows_ntqq_get_key.ps1 # Linux:依赖 readelf / strings / objdump / gdb,且 QQ 需安装在 /opt/QQ python3 scripts/linux/linux_qq_get_key.py # Android:手机需 root 并运行 frida-server,传入 QQ 版本号 python3 scripts/android/android_get_key.py 8.9.58

拿到密钥后,回到上面的 SQLCipher 命令完成解密。整个流程的核心就三步:提取密钥 → 匹配参数 → 导出明文

避坑实录:解密失败的5个常见排查方向

以下踩坑点大多来自脚本作者在注释里反复强调的"注意",提前知道能省下半天排查时间。

1. 版本对不上,特征码扫不到

Android 脚本内置了 8.9.58、8.9.63、8.9.68、8.9.76 四个版本的特征字节码,版本一更新就报Pattern NOT FOUND。解决思路:确认你的 QQ 版本,必要时用 IDA 等工具自己定位新版key_v2函数的特征。

2. 安全机制半路拦截

Android 上开着 Magisk Hide 或 Shamiko,Frida 注入会被 QQ 的反调试检测拦下;SELinux 处于 enforcing 状态也会导致注入失败;更要注意的是x86/x64 模拟器不支持,必须用 ARM 真机。脚本启动时会把这些注意事项打印出来,逐条对照即可。

3. 解密失败先别怀疑密钥

用对的密钥却打不开库,十有八九是参数不匹配:KDF 迭代是 4000 还是 64000?SQLCipher 是 3 还是 4?就像保险箱密码盘刻度没对齐,钥匙再对也白搭。建议把几种参数组合都试一遍。

4. Windows 出现多个版本目录

QQ 升级后,安装目录的versions/下可能残留多个版本文件夹,脚本无法自动判断时会抛错。此时手动指定wrapper.node的完整路径即可:

.\windows_ntqq_get_key.ps1 -WrapperNodePath "C:\QQ\versions\9.x.x\resources\app\wrapper.node"

5. 缓存文件"骗"了你

Linux 脚本的ref_off_cache缓存会校验文件哈希,QQ 升级后自动重算;但如果你换了 QQ 安装路径或手动改过文件,记得删掉缓存再跑,否则可能拿到过期的函数地址。

写在动手前:安全、合规与风险提示

这部分必须说清楚,语气不吓唬人,但请你认真对待。

  • 数据安全:脚本可能破坏聊天记录,建议先使用 PCQQ 自带的"导出消息记录(mht 格式)"功能做一次官方备份,再在虚拟机或不常用的设备上测试;
  • 账号风险:注入进程、附加调试器等操作可能触发 QQ 风控,存在账号异常甚至封号的可能,请自行评估风险;
  • 合规边界:本项目仅供学习交流,请遵守所在地法律法规和 QQ 软件许可及服务协议,不要用于法律取证、商业用途或任何越权行为;
  • 使用前审查代码:仓库 README 明确提醒"使用前请先审查代码并备份数据"——这是底线,也是对自己负责。

另外要说明的是:本文介绍的是提取自己账号数据的密钥。对他人数据动手、或绕过账号本身的权限验证,属于另一码事,不在讨论范围内,也不该做。

最后:你能带走什么,下一步看什么

回顾这趟旅程:你从"为什么聊天记录被锁"出发,搞懂了保险箱(SQLCipher)与钥匙(密钥)的关系,看见了三条"捡钥匙"的路线——Windows 的调试器蹲守、Linux 的 GDB 接管、移动端的 Frida 注入——也知道了拿到钥匙后如何开箱导出。

接下来你可以做的探索还有很多:

  • 读一读scripts/macos/arm-nosip/目录,看看"不关闭 SIP"的提取思路与 Windows 版有何异同;
  • 研究scripts/windows/pcqq/下的pcqq_dump.py,理解老版本的数据导出与重加密流程(pcqq_DANGER_rekey.py连文件名都写着危险,先别急着跑);
  • 如果你是开发者,不妨想一想:同样的"在开锁函数处截获密钥"的思路,能不能复用到其他用 SQLCipher 保护数据的应用上?

技术是工具,边界在人心。希望这篇文章能帮你安全地把自己的数据拿回来,也让你对"加密与破解"这对永恒博弈多一分敬畏与理解。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 19:12:25

减少 60% 打包体积:react-avatar 按需引入与 tree shaking 实战

减少 60% 打包体积:react-avatar 按需引入与 tree shaking 实战 【免费下载链接】react-avatar Universal avatar makes it possible to fetch/generate an avatar based on the information you have about that user. 项目地址: https://gitcode.com/gh_mirrors…

作者头像 李华
网站建设 2026/8/16 19:09:31

解决Visual Studio LNK2038运行时库不匹配错误:原理、排查与解决方案

1. 问题现象与本质剖析 如果你在用 Visual Studio 编译 C 项目,特别是当项目里混合了不同来源的第三方库(比如从网上下载的预编译库)时,大概率见过这个让人头疼的链接错误: error LNK2038: 检测到“RuntimeLibrary”的…

作者头像 李华
网站建设 2026/8/16 19:09:01

企业微信推送消息到微信免费方案:Wecom酱搭建与使用全攻略

企业微信推送消息到微信免费方案:Wecom酱搭建与使用全攻略 【免费下载链接】wecomchan 微信推送服务Server酱的开源替代。通过企业微信向微信推送消息的配置文档、直推函数和可自行搭建的在线服务代码。 项目地址: https://gitcode.com/gh_mirrors/we/wecomchan …

作者头像 李华
网站建设 2026/8/16 19:05:51

Axure RP满屏英文劝退新手?axure-cn中文语言包3分钟搞定全版本汉化

Axure RP满屏英文劝退新手?axure-cn中文语言包3分钟搞定全版本汉化 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 装…

作者头像 李华
网站建设 2026/8/16 19:01:21

ZooKeeper核心操作指南:从ZNode增删改查到分布式协调实战

1. 从“动物园管理员”到分布式系统的“定海神针”:ZooKeeper初印象如果你刚接触分布式系统,听到“ZooKeeper”这个名字可能会觉得有点奇怪,甚至联想到动物园。其实,这个名字非常形象。想象一下,在一个庞大的动物园&am…

作者头像 李华