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.exeWeixin.exe
  • 核心 DLL 从 WeChatWin.dllWeixin.dll(181MB)
  • 数据目录从 Documents\WeChat Files\AppData\Roaming\Tencent\xwechat\
  • 数据库从 MSG.dbapplet.db

pymemWeixin.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 全面升级:

  1. Chromium 拦截所有程序化输入 — UI 自动化方案废了
  2. 数据库存储结构完全改变 — 即使密钥有效,也找不到聊天记录数据库
  3. 社区工具有进展但未适配最新版

目前没有可行的方案。 如果有人能搞定,建议关注这几个方向:

  • 逆向 Weixin.dll 定位 setCipherKey 函数地址
  • 或者等 chatlog / ZedeX 等项目更新适配 4.1.9.56 的数据结构
  • 微信官方的备份功能是目前唯一的导出方式

花了一下午,代码写了一堆,结论是:打不过就加入,老老实实用微信自带的备份功能吧。

详情请移步 GitHub 仓库:Ray0612/WeChat-v4-export-research