
拿到QQ加密数据库怎么读SQLCipher密钥提取五平台实战【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key你从 QQ 安装目录拷出一个nt_msg.db用 sqlite3 一打开却提示 file is not a database。原因是 QQ 的聊天库用SQLCipherSQLite 的加密扩展逐页加密了暴力破解不现实唯一路径是把密钥从 QQ 进程内存里掏出来——这就是 QQ 数据库解密里的SQLCipher 密钥提取。下面按 Windows → Linux → macOS → Android → iOS 的顺序把五套流程各走一遍。准备工作五个平台各自要备什么平台密钥所在模块关键工具前置条件Windows 旧版 PCQQKernelUtil.dllFrida动态注入框架可往运行中的进程里注入脚本 IDA Pro反汇编器用于找函数QQ 已登录并打开过会话Windows 新版 NTQQwrapper.nodePowerShell 调试 API项目自带脚本同上Linux/opt/QQ/resources/app/wrapper.nodeGDBGNU 调试器 Python 脚本QQ 正在运行macOSM 系列芯片QQ 主程序框架LLDBXcode 自带调试器无需关闭 SIPAndroidlibkernel.soFrida ADB手机 Root或装 TermuxiOSQQ 主二进制Frida 16.7.19越狱或 TrollStore 环境五个平台的思路完全一样都是三步定位设密钥的函数 → 下断点或 Hook → 读函数参数里的密钥。目标函数是nt_sqlite3_key_v2iOS 上是sqlite3_key_v2QQ 每打开一个数据库文件就会调用它一次参数里带着密钥指针和长度。为什么只能提取密钥不能直接破解先花 30 秒把加密机制说清楚加密算法AES-256-CBC密钥派生PBKDF2-HMAC-SHA512迭代 4000 次SQLCipher 默认是 256000页面大小4096 字节AES-256 意味着暴力猜密钥在数学上不可行但密钥本身只是 32 字节随机字符QQ 打开数据库时它一直躺在进程内存里。所以全部工具做的事都很朴素不动加密算法只把密钥从内存抄出来。拿到密钥后任何带 SQLCipher 的工具都能离线解密和 QQ 进程再无关系。桌面平台实操定位、挂钩、读参数Windows 下用 Frida Hook 按特征码抓密钥三步走定位用 IDA Pro 打开 KernelUtil.dll字符串窗口搜nt_sqlite3_key_v2找到引用它的函数记下函数开头的字节序列即特征码函数指纹用来在内存里扫描定位挂钩脚本用特征码扫描 DLL 拿到函数地址再用 Frida 的Interceptor.attach挂上去读参数函数被调用时若库名是Msg3.0.db把密钥参数打出来。项目里的pcqq_get_key.py已完成第 2、3 步核心就这几行见scripts/windows/pcqq/const key_function single_function(55 8b ec 56 6b 75 10 11 83 7d 10 10 74 0d ...); Interceptor.attach(key_function, { onEnter: function (args) { // args[1]密钥指针, args[2]密钥长度 console.log(buf2hex(args[1].readByteArray(args[2].toInt32()))); } }); // ... 进程查找、消息回调等其余逻辑见项目源码新版 NTQQ 走的是 wrapper.node项目scripts/windows/ntqq/里的 PowerShell 脚本会自动完成静态分析并拉起调试器抓密钥直接跑即可。Linux 下 GDB 断点抓密钥Linux 版 QQ 的加密代码在/opt/QQ/resources/app/wrapper.node里这是个 ELF 格式的原生插件。项目的linux_qq_get_key.py做了三件事先用 readelf/strings/objdump 从静态文件里找出nt_sqlite3_key_v2: db%p zDb%s字符串的引用点和函数地址再用 GDB 的 Python API 附加到 QQ 进程、在该函数下断点最后等密钥长度参数命中特定值时读出库名和密钥。想手动理解流程等价操作就是gdb -p $(pidof QQ) # 确认 wrapper.node 加载后在静态分析得到的函数地址下断点 break *0x函数地址 continue # 命中断点后 x/s $rsi # 第二个参数数据库名 x/32bx $rdx # 第三、四个参数密钥内容跑起来你会发现全自动版基本就是把上面这几条命令用循环包了一遍。macOS 不关 SIP 定位密钥函数Apple Silicon 机型上项目scripts/macos/arm-nosip/提供了不用关闭系统完整性保护的方案。流程和前两个平台一致只是工具换了静态分析定位函数地址后用 LLDB 附加(lldb) process attach -n QQ (lldb) br set -a 0x函数地址 (lldb) c # 命中后AAPCS64 约定参数在 x 寄存器 (lldb) x/32bx $x2ARM64 和 x86 的区别主要在寄存器参数从rdi/rsi/rdx变成了x0~x7Hook 脚本读寄存器的地方要对应改。移动端实操同一套 Hook 换个壳 Android 下 Frida Hook libkernel.soAndroid QQ 的密钥函数在libkernel.so里。android_get_key.py让 frida-server 附加到com.tencent.mobileqq进程用字节特征码在库里扫出函数逻辑和 Windows 脚本几乎一致只是特征码换成了 ARM 指令const key_func single_function(FD 7B BD A9 F6 57 01 A9 F4 4F 02 A9 ...); Interceptor.attach(key_func, { onEnter(args) { // ARM 约定args[2]密钥指针, args[3]长度 console.log(buf2hex(args[2].readByteArray(args[3].toInt32()))); } }); // ... 模块枚举、frida-server 连接等其余逻辑见项目源码不想注入进程的话项目还备了一条路用系统备份功能adb backup把数据库带出来再从备份里解析密钥对应android_get_backup_key.py。iOS 下 Frida 按偏移 Hook 密钥函数iOS 主二进制没有导出符号最省事的做法是直接把偏移写死先用 IDA Pro 在你手上这个 QQ 版本里量出sqlite3_key_v2的偏移例如 9.0.1.620 版是0xDA1BFB4然后const addr Module.findBaseAddress(QQ).add(0xDA1BFB4); Interceptor.attach(addr, { onEnter(args) { console.log(buf2hex(args[2].readByteArray(args[3].toInt32()))); } }); // ... 辅助函数见项目 scripts/ios/跑之前确认设备上的 frida-server 是 16.7.19 这个兼容版本。拿到密钥之后解密与验证 密钥到手离明文还差两步。第一步去掉文件头。QQ 的数据库文件头部有 1024 字节的私有头不解掉它后面全是加密页tail -c 1025 nt_msg.db nt_msg.clean.db第二步带上正确的 PRAGMA 参数打开。注意kdf_iter必须是 4000参数不对时密钥再对也会报格式错误PRAGMA key 你提取到的密钥; PRAGMA cipher_page_size 4096; PRAGMA kdf_iter 4000; PRAGMA cipher_default_kdf_algorithm PBKDF2_HMAC_SHA512; SELECT COUNT(*) FROM Msg; -- 能返回数字说明密钥和参数都对验证通过后用一份 Python 代码就能把整库导出成明文需要装了 SQLCipher 扩展的 Python SQLite 绑定如 sqlcipher3-wheelsimport sqlite3 src sqlite3.connect(file:nt_msg.clean.db?modero, uriTrue) src.execute(PRAGMA key 你提取到的密钥) dst sqlite3.connect(decrypted.db) src.backup(dst) # backup 直接落出一份明文副本踩坑记录现象原因一句话修复提示 file is not a database1024 字节文件头没去掉先tail -c 1025再解密密钥对却解密失败kdf_iter没设成 4000加上PRAGMA kdf_iter 4000Hook 报 pattern NOT FOUNDQQ 升级后特征码变了重新用 IDA 分析新 DLL换特征码Python 标准 sqlite3 读不了库系统 sqlite3 不带 SQLCipher 扩展换用 sqlcipher3-wheels 或 sqlcipher 命令行iOS 按偏移 Hook 不到函数偏移是版本绑定的用自己 QQ 版本的偏移或改特征码扫描延伸方向单个库跑通之后自然的下一步是把提取密钥 → 去头 → 解密 → 导出串成一条命令批量处理 QQ 目录下的全部数据库需要脚本的话git clone https://gitcode.com/gh_mirrors/qq/qq-win-db-key即可。【免费下载链接】qq-win-db-key全平台 QQ 聊天数据库解密项目地址: https://gitcode.com/gh_mirrors/qq/qq-win-db-key创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考