首页 / 资讯中心 / 文章详情

wechat-cli如何解密微信加密数据库?SQLCipher 4页级AES-256-CBC解密与WAL合并原理全解析

wechat-cli如何解密微信加密数据库?SQLCipher 4页级AES-256-CBC解密与WAL合并原理全解析 ★ FEATURED ARTICLE
wechat-cli如何解密微信加密数据库SQLCipher 4页级AES-256-CBC解密与WAL合并原理全解析【免费下载链接】wechat-cliA CLI tool to query your local WeChat data — chat history, contacts, sessions, favorites, and more. Designed for LLM integration.项目地址: https://gitcode.com/gh_mirrors/wech/wechat-cliwechat-cli 是一款命令行微信数据库解密与查询工具它从微信进程内存中提取 SQLCipher 4 加密密钥按 4096 字节页级执行 AES-256-CBC 解密再合并 WAL 日志把聊天记录、联系人、会话、收藏等数据变成可本地查询的 SQLite 明文专为 LLM 集成设计。下面带你完整拆解这套解密机制 一、先搞懂敌人SQLCipher 4 是怎么加密微信数据库的微信把聊天数据存放在本地db_storage目录下的 SQLite 数据库中但整个数据库被SQLCipher 4加密——直接打开只会看到乱码。它的加密方式按“页”进行每页固定4096 字节页位置内容说明第 1 页前 16 字节盐值Salt明文存储是找到密钥的“指纹”加密数据区密文页面主体内容页尾 80 字节IV(16) HMAC-SHA512(64)初始化向量 完整性校验值三个关键设计决定了破解思路密钥不存盘—— 32 字节256 位的 AES 密钥只存在于微信进程内存中每页独立 IV—— 每页尾部都带着自己的 16 字节 IV页与页互不影响因此可以逐页解密而无需一次性载入整个库HMAC 校验—— 每页都带 HMAC-SHA512 签名密钥对错一试便知这成了内存扫描的“验证器”。第 1 页的 HMAC 密钥由PBKDF2-HMAC-SHA512(密钥, 盐值逐字节 XOR 0x3A, 2 次迭代)派生而来具体校验逻辑见 verify_enc_key()。 记住这个页面布局图后面的解密和 WAL 合并都围绕它展开。本地有多个微信账号时可按修改时间排序找到当前登录账号的 db_storage 目录二、密钥从哪来init 命令的内存扫描 HMAC 验证既然密钥只在进程内存里wechat-cli init的思路就是把微信进程的内存读出来逐个候选密钥用 HMAC 验证直到命中 ✅执行流程见 init 命令实现自动定位数据目录—— 跨平台扫描db_storage多账号时交互选择config.py收集数据库与盐值—— 遍历所有.db文件读取每库第 1 页的 16 字节盐值建立salt → 数据库映射collect_db_files()扫描进程内存—— 按平台分发到对应扫描器keys/init.pyLinux需要 root 或CAP_SYS_PTRACE解析/proc/pid/maps找可读区域再读/proc/pid/mem扫描scanner_linux.pymacOS内置 C 二进制通过进程内存接口扫描Windows直接读取Weixin.exe进程内存。模式匹配 验证—— 在内存中匹配十六进制串x...96 位长通常就是「32 字节密钥 16 字节盐值」拿到后立即用 HMAC 对第 1 页验签scan_memory_for_keys()交叉验证兜底—— 部分数据库共用密钥用已命中的密钥对其他盐值的库再验一轮最大化命中率cross_verify_keys()。所有命中结果写入~/.wechat-cli/all_keys.json以后解密直接复用无需再次扫描内存。sudo wechat-cli init运行时检测到多个微信数据目录并等待用户选择# macOS / Linux可能需要 sudo 权限 sudo wechat-cli init三、页级 AES-256-CBC 解密每一页都在做什么拿到密钥后解密由 decrypt_page() 逐页完成逻辑非常干净取 IV—— 从当前页末尾 80 字节区的前 16 字节读出该页专属 IV分情况取密文第 1 页跳过前 16 字节盐值密文区为[16, 4016)其他页密文区为[0, 4016)AES-256-CBC 解密—— 用 32 字节密钥 页级 IV 解密补页头—— 第 1 页解密后手动补回明文标志SQLite format 3\0再在尾部补 80 字节恢复成标准 SQLite 页。full_decrypt() 则负责“翻页”从第 1 页循环读到文件末尾每解一页写出一页最终得到一份可直接用sqlite3打开的明文数据库。 页级解密的妙处不必把整个加密库载入内存内存占用恒定在 4KB 级别几百 MB 的大库也能轻松处理。四、WAL 合并为什么解密完还不够微信使用 SQLite 的WALWrite-Ahead Logging模式最新的写入先追加到旁边的-wal文件尚未合并回主库。如果只解密主库你看到的可能是“几分钟前”的旧数据。decrypt_wal() 完成了这一步“合并”读 WAL 头32 字节—— 提取 salt1 / salt2 两个帧校验盐逐帧扫描—— 每个帧 24 字节帧头含页号 pgno 帧盐值 4096 字节加密页盐值比对—— 帧盐值必须与 WAL 头一致才采信过滤掉已失效的旧帧解密并回写—— 帧页同样按页级 AES-256-CBC 解密然后写回明文库的(pgno-1) × 4096偏移处覆盖主库旧页。加密主库 ──full_decrypt──▶ 明文库 ──decrypt_wal(逐帧覆盖)──▶ 最新明文库 └── 对应 -wal 加密日志一帧一覆盖最终明文库与微信当前可见的数据完全一致history、search等命令查到的都是最新聊天记录 五、解密缓存让重复查询零解密成本逐页解密虽有成本DBCache 让代价只付一次每个库解密后缓存在系统临时目录缓存名取路径的 MD5 前 12 位用 mtime 判断变化主库或-wal的修改时间只要没变直接复用缓存持久化 mtime 记录跨会话复用——上次已解密的库下次启动秒开。六、快速上手三步完成微信数据库解密并查询第 1 步安装无需 Python 环境npm 一键搞定npm install -g canghe_ai/wechat-cli第 2 步初始化—— 确保微信正在运行执行sudo wechat-cli init完成内存扫描与密钥提取。第 3 步开始查询—— 解密、WAL 合并、缓存全部透明完成你只需写查询命令wechat-cli sessions # 最近会话 wechat-cli history 张三 --limit 20 # 聊天记录 wechat-cli search 截止日期 --chat 项目组七、小结安全边界的三点承诺只读不写解密产物只落在本地临时缓存不修改微信原始文件数据不出本机全程无网络传输密钥与明文均只存在你的电脑里密钥复用all_keys.json一次提取、长期复用只有微信更新数据库结构时才需要--force重新提取。至此一条init命令背后「内存扫描 → HMAC 验证 → 页级 AES-256-CBC 解密 → WAL 合并 → mtime 缓存」的完整链路就全部拆解完毕。配合 README_CN.md 中的命令速查表你现在已经具备完整的微信本地数据查询能力了 【免费下载链接】wechat-cliA CLI tool to query your local WeChat data — chat history, contacts, sessions, favorites, and more. Designed for LLM integration.项目地址: https://gitcode.com/gh_mirrors/wech/wechat-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站