微信 4.x 聊天记录导出——全方案失败记录
TL;DR: 微信 4.x 全面重写了架构,传统方案全部失效。花了整整一个下午,试了 20+ 种方法,一个都没成。此贴记录踩坑过程,给想搞同样事情的人省点时间。第一次话这么大量的时间去做一个没做出来的事情,ε=(´ο`*)))唉虽然有点挫败吧,但是这肯定是999种无法使得灯泡点亮的材料,下一种就是可以点亮了的啦~
背景
微信 4.x(v4.1.9.56)跟 3.x 完全是两个东西。Qt 5.15.14 + Chromium 内核,数据目录、数据库结构、进程模型全部重写了。
我想导出一份聊天记录,本来以为跟 3.x 一样读个数据库就行,结果……太天真了。
方案一:数据库解密
思路: 微信 3.x 时代,聊天记录存在 MSG.db 里,用 SQLCipher 加密,密钥可以从进程内存提取。拿到密钥就能直接读。
现实:
- 进程名从
WeChat.exe→Weixin.exe - 核心 DLL 从
WeChatWin.dll→Weixin.dll(181MB) - 数据目录从
Documents\WeChat Files\→AppData\Roaming\Tencent\xwechat\ - 数据库从
MSG.db→applet.db
用 pymem 从 Weixin.dll 内存里扫到了 21 个疑似密钥,拿去解密所有数据库文件——全部失败。要么密钥不对,要么加密参数变了,要么 applet.db 根本就不是聊天记录数据库。
结论:❌ 数据库这条路走不通。
方案二:截图 OCR + 自动翻页
思路: 读不了数据库,那就截图识别文字,模拟 PageUp 翻页遍历全部聊天记录。
成果:
- 截图 ✅
- Tesseract OCR 识别文字 ✅
- 按气泡颜色区分我和对方 ✅
- 图片去重 ✅
然后卡在了最关键的一步——翻页。
翻页全部失败记录
物理键盘按 PageUp 能翻页,但所有程序化方式全部被微信拦截。我试了 19 种:
| 方法 | 结果 |
|---|---|
Python keyboard.send("page up") |
❌ |
Windows API keybd_event |
❌ |
SendInput KEYBDINPUT |
❌ |
SendInput + 硬件扫描码 |
❌ |
SendInput 鼠标滚轮 |
❌ |
PostMessage WM_KEYDOWN |
❌ |
SendMessage WM_KEYDOWN |
❌ |
PostMessage WM_MOUSEWHEEL |
❌ |
SendMessage WM_VSCROLL |
❌ |
发给子窗口 MMUIRenderSubWindowHW |
❌ |
| 线程 Attach + 前台 + SendInput | ❌ |
| 先点击聊天区再发 PageUp | ❌ |
| VBScript SendKeys | ❌ |
| PowerShell SendKeys | ❌ |
| C# 原生 EXE 编译的 SendInput | ❌ |
pyautogui.scroll 大增量滚轮 |
❌ |
| 拖拽滚动条 | ❌ |
| 拖拽聊天内容 | ❌ |
前台窗口确认是微信,按键确实发到了微信窗口,但微信没有任何反应。
推测原因: 微信 4.x 的 Chromium WebView 拦截了所有软件生成的输入(synthetic input),只有物理键盘的硬件中断路径才能通过。
结论:❌ 这条路也走不通。
方案三:社区工具
试了 ZedeX/weixin-decrypte-script:
scan_keys.py— 密钥提取 ✅(成功提取到 21 个)decrypt_db.py— 解密数据库 ❌(13 个数据库全部失败)read_messages.py— 读取消息 ❌(依赖解密结果)
又试了 Frida hook:
sqlite3_key_v2— ❌ Weixin.dll 无此导出sqlite3_key— ❌ 无此导出SetDBKey— ❌ 无此导出- 枚举所有含 key/cipher/sqlite 的导出函数 → 0 个
SQLCipher 被静态链接进 Weixin.dll 且符号被 strip,无法直接定位。
结论:❌ 还是走不通。
方案四:chatlog 工具链
第二次迭代中尝试了 sjzar/chatlog(Go 语言编写,支持微信 V4)。
成果:
chatlog server启动成功 ✅- 密钥
6c1e4aaa4b3e8eaec1307daa4777d580418de60f11160633763875cc8ef187c3被 chatlog 的 V4 解密器验证通过 ✅ - 解密输出了若干数据库文件
但最终仍然失败: chatlog 期望的数据目录结构(db_storage/message/message_0.db 等)在微信 4.1.9.56 中并不存在。解密后的文件要么为 0 字节,要么只是浏览器实验数据。真正的聊天记录数据库不知道藏在哪里。
结论:❌ 密钥对了,但找不到数据库。
最终结论
微信 4.x 的防护相比 3.x 全面升级:
- Chromium 拦截所有程序化输入 — UI 自动化方案废了
- 数据库存储结构完全改变 — 即使密钥有效,也找不到聊天记录数据库
- 社区工具有进展但未适配最新版
目前没有可行的方案。 如果有人能搞定,建议关注这几个方向:
- 逆向 Weixin.dll 定位
setCipherKey函数地址 - 或者等 chatlog / ZedeX 等项目更新适配 4.1.9.56 的数据结构
- 微信官方的备份功能是目前唯一的导出方式
花了一下午,代码写了一堆,结论是:打不过就加入,老老实实用微信自带的备份功能吧。
详情请移步 GitHub 仓库:Ray0612/WeChat-v4-export-research