Files
zWorkFlow/README.md
ylytdeng e826b1a565 refactor: 删除 tkinter app_gui.py, 完全切到 Web UI 作为唯一入口
## 决策背景

用户反馈 "windows GUI 太难看了, 还是完全用 webUI 吧, 用户可以选择"。

tkinter app_gui.py (PR #107 引入, 929 行) 的问题:
- 中文字体下渲染糊 ("WeChat Decrypt 工具箱" 标题模糊)
- 90 年代 Windows 控件风格, 不暗色不现代
- 只能跑 Windows, 不跨平台
- 没法远程访问
- 跟 Web UI 维护两套, 重复

Web UI (monitor_web.py) 已经完全对齐功能:
- 8 个工具按钮 (3 tab 分组: 个人微信 / 企微 / 工具)
- 终止按钮 + 实时日志推送
- 导出筛选模态框 (会话搜索/复选/格式选择, close #112)
- 跟实时消息监听共享 SSE 通道
- Lucide SVG icon 统一风格 (无 emoji)
- 暗色主题 + design tokens + 玻璃质感顶栏

## 改动

### 删除
- \`app_gui.py\` (929 行 tkinter GUI)

### monitor_web.py
拆 \`main()\` → \`_start_monitor_if_ready()\` + 精简的 \`main()\`:

之前: keys 不存在 → \`sys.exit(1)\` 直接挂

现在: keys 不存在 → 跳过监听线程启动, 仅起 Web UI 服务。
用户从工具箱点 "① 提取密钥 + 解密数据库" 跑完后重启进程, 监听自动激活。
这样 exe 用户第一次双击时不会报错挂掉, 而是看到 Web UI 工具箱可以
直接用。

新启动流程: \`_start_monitor_if_ready\` 检查 keys 文件 / session.db
密钥 / session.db 路径都 OK 才启 monitor_thread, 任一不满足都给友好
提示但不退出。

### WeChatDecrypt.spec
- 入口 \`app_gui.py\` → \`monitor_web.py\`
- datas 清单补全 (加 export_all_chats / chat_export_helpers /
  batch_decrypt_images / transcribe_chat 等之前漏的)
- hiddenimports 显式列 Crypto / zstandard / pilk (避免 PyInstaller
  漏 detect)

### build.bat
- 删 30 行重复的 --add-data 清单 (跟 .spec 漂移风险)
- 改成 \`pyinstaller --noconfirm WeChatDecrypt.spec\`
- 单一 source of truth 是 .spec
- 完成提示从 "GUI 启动" 改成 "双击 → 浏览器开 Web UI"

### EXE_USAGE.md
完全重写为 Web UI 视角:
- 快速开始: 双击 exe → 浏览器自动打开
- 工具箱 3 tab 各自能力详解
- 导出筛选模态框使用说明
- 任务终止说明
- 输出目录布局
- 远程访问说明
- 结尾解释为什么去掉了 tkinter

### README.md
- 三平台 quick-start 里 "Windows GUI / EXE" → "Windows Web UI / EXE"
- 文件清单: \`app_gui.py\` 那行 → \`monitor_web.py\` (新身份: Web UI
  总入口)
- 技术细节里 "GUI 工具箱" 章节重写: 强调 Web UI 优势 (筛选模态框 /
  终止按钮 / 跨平台 / 远程访问 / 跟监听共存) + 末尾 1 句历史说明
  解释 tkinter 已删除

## 实测

- python monitor_web.py: keys 在 → 正常启动监听 + Web UI
- python monitor_web.py: 假装 keys 不在 → 跳过监听, Web UI 仍能开,
  用户从工具箱点 "① 提取密钥" 后重启即激活
- 测试 185/185 通过

## 没改 (留 follow-up)

- 实际打包 .spec 验证 (需要 Win 跑 pyinstaller, 没在 CI 跑)
- monitor_web 启动后**自动**检测 keys 文件 mtime 变化重启监听, 不需要
  用户手动重启进程 (现在的设计是"重启进程才激活")
2026-05-17 19:22:47 +08:00

19 KiB
Raw Blame History

WeChat 4.x Database Decryptor

微信 / 企业微信本地数据库解密 + 数据工具集 (Windows / macOS / Linux)

从运行中的进程内存提取加密密钥,解密 SQLite 加密数据库,衍生出一整套实用工具:

能力 支持范围
🔓 数据库解密 个人微信 4.0 (SQLCipher 4) + 企业微信 5.x (wxSQLite3 AES-128)
📡 实时消息监听 Web UI (SSE) / 命令行 / MCP Server (Claude AI 集成)
📦 批量导出 全部聊天 → JSON / CSV / HTML, 含增量 + 日期范围 + dry-run
🖼️ 图片解密 V1 / V2 / wxgf 三种 .dat 格式 + 朋友圈缓存
🎙️ 语音转录 SILK → WAV → 文本 (local Whisper / OpenAI / whisper.cpp 三种 backend)
🪧 朋友圈 SnsTimeLine 解析 + 缓存图片解密 + HTML 时间线
🖱️ Windows GUI tkinter 界面整合所有功能 + PyInstaller 单 exe 打包

快速开始

macOS — 最小路径(展开查看)
# 1. 安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
brew install whisper-cpp           # 语音转录加速(可选,推荐)

# 2. 密钥提取(退出微信后先重签名)
killall WeChat
sudo codesign --force --deep --sign - /Applications/WeChat.app
cc -O2 -o find_all_keys_macos find_all_keys_macos.c -framework Foundation
sudo ./find_all_keys_macos         # 扫描内存提取密钥

# 3. 解密 + 导出 + 转录
python3 decrypt_db.py              # 解密所有数据库
python3 export_all_chats.py -t     # 导出全部聊天并转录语音

# 或一条命令从零到完成:
make all
Windows — 最小路径 (CLI)
# 1. 以管理员身份打开终端
# 2. 安装依赖
py -m pip install -r requirements.txt

# 3. 提取密钥 + 解密
python main.py decrypt

# 4. 批量导出
python export_all_chats.py
Windows — Web UI / EXE (推荐非技术用户)
# 直接跑 Web UI (开发模式)
python monitor_web.py        # → 浏览器自动开 http://localhost:5678

# 或打包成单 exe 分发给别人
build.bat                    # 输出 dist/WeChatDecrypt.exe
                             # 双击 exe → 自动开浏览器 → Web UI 工具箱

工具箱 3 个 tab (📱 个人微信 / 🏢 企业微信 / 🔧 工具), 覆盖解密 / 导出 / 朋友圈 / 语音转 MP3 全部场景, 导出带模态框筛选 (不会动不动跑全量)。

实时消息监听跟工具箱在同一页面。详见 EXE_USAGE.md

Windows — 企业微信 (实验)
# 1. 启动企业微信并登录
# 2. 提取企微 keys + 解密
python find_wxwork_keys.py    # 自动检测 Documents\WXWork\<id>\Data
python decrypt_wxwork_db.py   # 解密到 wxwork_decrypted/

# 3. (可选) 导出聊天记录
python export_wxwork_messages.py

仅 Windows 5.x 实测可用。详见技术细节里的「企业微信数据库解密」章节。

Linux — 最小路径
# 1. 安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# 2. 提取密钥(需要 root 或 CAP_SYS_PTRACE
sudo python3 main.py decrypt

# 3. 批量导出
python3 export_all_chats.py

📖 详细指南

环境要求

  • Python 3.10+
  • 微信 4.x 正在运行

macOS:

  • Xcode Command Line Tools: xcode-select --install
  • 需要对 /Applications/WeChat.app 做 ad-hoc 重签名(允许进程内存读取)
  • 需要 root 权限运行扫描器

Windows:

  • 管理员权限(读取进程内存)
  • 微信正在运行

Linux:

  • root 权限或 CAP_SYS_PTRACE
  • 微信正在运行

安装依赖

pip install -r requirements.txt
⚠️ 安装失败? 点击展开

问题:error: externally-managed-environment (PEP 668)

Homebrew Python (3.12+) 和部分 Linux 发行版禁止 pip install 直接写入系统 Python 环境。

解决:使用虚拟环境

python3 -m venv .venv
source .venv/bin/activate   # 激活虚拟环境
pip install -r requirements.txt

# 后续运行脚本时使用 .venv 中的 Python
.venv/bin/python3 main.py
.venv/bin/python3 decrypt_db.py

或使用 Makefile已配置 .venv/bin/python3

make setup   # 一键安装所有依赖 + 编译扫描器
make decrypt # 等价于 .venv/bin/python3 main.py decrypt
make all     # 从密钥提取到导出全部完成

Windows 可改用:

py -m pip install --user -r requirements.txt

配置

程序会自动检测微信数据目录并生成 config.json。如果自动检测失败,手动创建:

{
    "db_dir": "/path/to/your/wxid/db_storage",
    "keys_file": "all_keys.json",
    "decrypted_dir": "decrypted",
    "wechat_process": "WeChat"
}

各平台默认路径:

  • macOS: ~/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/<wxid>/db_storage
  • Windows: 微信设置 → 文件管理中查看
  • Linux: ~/Documents/xwechat_files/<wxid>/db_storage

常用命令

用途 命令
提取密钥macOS sudo ./find_all_keys_macos
提取密钥Windows/Linux python find_all_keys.py
解密全部数据库 python decrypt_db.py
启动 Web UI实时消息 python main.py
批量导出聊天记录 python export_all_chats.py
批量导出 + 语音转录 python export_all_chats.py --with-transcriptions
转录单个文件语音 python transcribe_chat.py input.json [output.json]
注册 MCP ServerClaude claude mcp add wechat -- python /path/to/mcp_server.py

Web UI

python main.py 启动后打开 http://localhost:5678 查看实时消息流。

  • 30ms 轮询 WAL 文件变化
  • SSE 实时推送到浏览器
  • 图片消息内联预览

HTTP API

端点 说明
GET /api/history 最近消息列表
GET /api/history?chat=群名 按会话过滤
GET /api/history?since=1712000000 增量拉取
GET /api/tags 联系人标签
GET /stream SSE 实时消息推送

MCP ServerClaude AI 集成)

将微信数据查询能力接入 Claude Code让 AI 直接读取你的微信消息。

注册:

claude mcp add wechat -- python /path/to/mcp_server.py

可用工具:

工具 功能
get_recent_sessions(limit) 最近会话列表
get_chat_history(chat_name, limit, offset, start_time, end_time) 聊天记录
search_messages(keyword, chat_name, limit, offset, ...) 搜索消息
get_contacts(query, limit) 联系人搜索
get_contact_tags() 联系人标签
get_voice_messages(chat_name) 语音消息列表
decode_voice(chat_name, local_id) 解码语音为 WAV
transcribe_voice(chat_name, local_id) 转录语音为文字

⚠️ 语音转录

export_all_chats.py -ttranscribe_chat.pytranscribe_voice MCP 工具共享同一套转录配置。

后端对比:

后端 速度 隐私 依赖 配置
local(默认) CPU较慢 数据不出本机 pip install -r requirements.txt 无需配置
openai API最快 语音上传至 OpenAI pip install openai openai_api_key
whisper_cpp Metal GPU3-5x 数据不出本机 brew install whisper-cpp + 模型 自动检测

配置方式config.json

{
    "transcription_backend": "whisper_cpp"
}

启用 whisper_cpp 前需安装:

brew install whisper-cpp
# 模型自动检测常见路径,或手动下载:
# curl -L -o ~/whisper-models/ggml-base.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin

注意事项:

  • 首次启用 openai 或 whisper_cpp 时会打印一行提示
  • openai 缺 key 时静默回退 local
  • whisper_cpp 二进制未找到时静默回退 local
  • 切换后端后旧缓存自动失效并重新转录

图片解密

微信 4.0 的 .dat 图片文件使用三种加密格式之一:

格式 时期 加密方式
旧 XOR ~2025-07 单字节 XOR
V1 过渡期 AES-ECB + XOR
V2 2025-08+ AES-128-ECB + XOR

macOS 图片密钥从磁盘 kvcomm 缓存派生,无需扫描进程内存:

python find_image_key_macos.py

密钥自动保存到 config.json,之后 Web UI 自动显示图片预览。

Makefile 命令

make setup      # 全自动venv → pip install → brew install → 编译扫描器 → 配置
make build      # 编译 macOS 密钥扫描器
make keys       # 提取密钥(需要 root
make decrypt    # 解密全部数据库
make web        # 启动 Web UI
make all        # 从零到完成setup → keys → decrypt → export
make status     # 显示当前数据状态
make clean      # 交互式清理:选择删除 decrypted / exported_chats / 临时文件
make help       # 列出所有命令

文件说明

文件按功能分组,方便定位。

① 入口 / 一键脚本
文件 说明
main.py CLI 总入口 — 子命令 decrypt / export / all / status / decode-images / help
monitor_web.py Web UI 总入口 — 实时监听 + 8 个工具按钮 + 导出筛选模态框 (python monitor_web.py 即用, PyInstaller 打包成单 exe 给非技术用户)
setup.sh 一键安装依赖 (macOS / Linux / Windows Git Bash)
setup.py 交互式配置向导 (python setup.py --check 仅检查环境)
cleanup.py 磁盘清理工具 (status 查看用量 / --dry-run 预览)
② 密钥提取 (从进程内存)
文件 说明
find_all_keys.py 平台分发入口 (Windows / Linux)
find_all_keys_windows.py Windows: 扫 Weixin.exe 内存找 SQLCipher raw key
find_all_keys_linux.py Linux: 同上, 走 /proc//mem
find_all_keys_macos.c macOS: C + Mach VM API (需 codesign + 重签 WeChat.app)
find_image_key.py 从进程内存提取图片 AES 密钥 (Windows / Linux)
find_image_key_macos.py macOS: 从磁盘 kvcomm 缓存推算 (无需进程在线)
find_image_key_monitor.py 持续监控模式 (Windows)
find_wxwork_keys.py 企业微信 5.x wxSQLite3 raw key 提取 (cipher 结构体扫描)
key_scan_common.py / key_utils.py 扫描器共用工具
③ 数据库 / 图片 / 语音解密
文件 说明
decrypt_db.py 全量解密 SQLCipher 4 数据库 (支持 -i 增量)
decode_image.py 图片 .dat 解密 (V1 / V2 / 旧 XOR), 含 aligned_aes_block_size 公共 helper
decrypt_wxwork_db.py 企业微信 wxSQLite3 AES-128 数据库解密
decrypt_sns.py 朋友圈缓存图片解密 (V1 / V2 / XOR)
wxwork_crypto.py 企业微信 wxSQLite3 per-page 加密原语 (MD5 派生 + AES-128-CBC)
batch_decrypt_images.py CLI: 任意目录递归批量解 .dat
④ 导出 (JSON / CSV / HTML)
文件 说明
export_all_chats.py 批量导出全部聊天为 JSON (含 -t 转录 / -i 增量 / 日期范围 / --dry-run)
export_chat.py 单会话 JSON 导出 (供 export_all_chats 调用)
chat_export_helpers.py JSON 导出共享格式化函数 (避免漂移)
export_messages.py CSV / HTML / JSON 三种格式导出, 图片可内联 (PR #107)
export_wxwork_messages.py 企业微信版导出 (CSV / HTML / JSON)
export_sns.py 朋友圈 SnsTimeLine 导出 (JSON + HTML 时间线)
⑤ 实时监听 / 服务
文件 说明
monitor_web.py (见 ① 入口) — 同一个文件既是 Web UI 总入口也是实时消息监听
monitor.py 命令行实时监听
mcp_server.py MCP Server — Claude AI 查询微信数据 (含 get_chat_history / decode_voice / decode_refer 等 20+ 工具)
decode_transfer.py CLI: 查单条转账消息 (mcp_server decode_transfer 工具的命令行包装)
⑥ 语音 / 音频
文件 说明
transcribe_chat.py 语音转文本 (local Whisper / OpenAI / whisper.cpp 三 backend)
voice_to_mp3.py SILK_V3 → MP3 (需要 ffmpeg in PATH)
⑦ 打包 / 配置 / 文档
文件 说明
config.py 配置加载器 (自动检测微信数据目录, 支持打包后 exe 路径)
config.json 配置文件 (首次运行自动生成)
WeChatDecrypt.spec PyInstaller 打包描述
build.bat Windows 一键打包为单 exe
requirements.txt Python 依赖
EXE_USAGE.md GUI / EXE 使用说明
Makefile 常用命令快捷方式 (make all / make clean / make status)
⑧ 测试 / 文档
路径 说明
tests/ 单元测试 (185+ 用例, 含 wxsqlite3 / image v2 / msg types / pagination 等)
docs/ 部署 / 排错指南 + 字段研究报告
latency_test.py 开发工具: 测量消息从 WeChat 写入到我们检测的延迟

🔧 技术细节

原理

微信 4.0 使用 SQLCipher 4 加密本地数据库:

  • 加密算法: AES-256-CBC + HMAC-SHA512
  • KDF: PBKDF2-HMAC-SHA512, 256,000 iterations
  • 每个数据库有独立的 salt 和 enc_key

WCDB (微信的 SQLCipher 封装) 会在进程内存中缓存派生后的 raw key格式为 x'<64hex_enc_key><32hex_salt>'。三个平台均可通过扫描进程内存匹配此模式,再通过 HMAC 校验 page 1 确认密钥正确性。

安全提示

  • all_keys.json / wxwork_keys.json 包含明文 raw key,落盘时已 chmod 0600(Unix)或保留默认 ACL(Windows)。勿提交到 git 或与人共享——拿到 key 等于拿到全部聊天解密能力。
  • 解密后的 .db 文件是明文 SQLite,内容包括所有联系人、群、消息,同样需要小心备份和分享

朋友圈解密的 XML 安全

export_sns.py 解析 SnsTimeLine 的 XML 时已加 XXE 防护(拒绝 <!DOCTYPE> / <!ENTITY> + 200KB 大小上限),避免恶意朋友圈 XML 通过 entity expansion 或外部实体引用执行 SSRF / 读取本地文件。mcp_server.py 解析其他类型 appmsg XML 同样有这层保护。

Web UI 工具箱 & 单 exe 打包

monitor_web.py 既是实时消息监听 (浏览器 Web UI), 又是工具箱总入口。 右上角 🛠️ 工具 按钮展开 3 个 tab:

  • 📱 个人微信: Step 1 解密 / 图片密钥 → Step 2 导出聊天 / 批量解图片 / 朋友圈
  • 🏢 企业微信: Step 1 解密 → Step 2 导出聊天 (CSV/HTML/JSON)
  • 🔧 工具: 语音转 MP3 等

特点:

  • 导出筛选模态框: 不会一点就跑全量, 弹框选会话 (含搜索/全选/选最近 30 天)
  • 任务终止: 按钮变红 🛑, 一点立刻 SIGTERM 子进程
  • 跟实时监听共存: 同一页面下方就是消息流, 互不影响
  • 跨平台 + 远程可访问: 浏览器渲染清晰, 默认 bind 0.0.0.0 同局域网可用

直接运行

python monitor_web.py        # → 浏览器自动开 http://localhost:5678

打包为单 exe

pip install pyinstaller
build.bat                    # → dist\WeChatDecrypt.exe

输出约 20MB 的单 exe, 双击即用, 无需安装 Python。

语音转 MP3 需要系统安装 FFmpeg 并加入 PATH。

详细说明见 EXE_USAGE.md

历史: 旧版本提供过 tkinter app_gui.py 桌面 GUI, 在 commit 273fe65 后完全移除。 原因: 渲染糊 / Windows-only / 维护两套 UI。Web UI 功能完全对齐且更好。

WAL 处理

微信使用 SQLite WAL 模式WAL 文件是预分配固定大小 (4MB)。检测变化时:

  • 不能用文件大小(永远不变)
  • 使用 mtime 检测写入
  • 解密 WAL frame 时需校验 salt 值,跳过旧周期遗留的 frame

图片 .dat 加密格式

微信本地图片 (.dat) 有三种加密格式:

格式 时期 Magic 加密方式 密钥来源
旧 XOR ~2025-07 单字节 XOR 自动检测 (对比 magic bytes)
V1 过渡期 07 08 V1 08 07 AES-ECB + XOR 固定 key: cfcd208495d565ef
V2 2025-08+ 07 08 V2 08 07 AES-128-ECB + XOR 从进程内存提取

V2 文件结构: [6B signature] [4B aes_size LE] [4B xor_size LE] [1B padding] + [AES-ECB encrypted] [raw unencrypted] [XOR encrypted]

企业微信数据库解密 (实验)

企业微信 Windows 5.x 的本地数据库不是普通微信 SQLCipher 4 格式,而是 wxSQLite3 AES-128-CBC

  • 16 字节 raw key
  • 每页按 page index + sAlT 派生 AES key
  • 每页 IV 由 page index 派生
  • 无 SQLCipher HMAC / reserve 区

提取并解密:

python find_wxwork_keys.py
python decrypt_wxwork_db.py
python export_wxwork_messages.py

如果自动提取失败但你已有 raw key也可以直接传入 32 位 hex key

python decrypt_wxwork_db.py --key 00112233445566778899aabbccddeeff

配置项:

{
    "wxwork_db_dir": "C:\\Users\\<用户>\\Documents\\WXWork\\<account_id>\\Data",
    "wxwork_keys_file": "wxwork_keys.json",
    "wxwork_decrypted_dir": "wxwork_decrypted",
    "wxwork_export_dir": "wxwork_export"
}

数据库结构

解密后包含约 26 个数据库:

  • session/session.db - 会话列表 (最新消息摘要)
  • message/message_*.db - 聊天记录
  • contact/contact.db - 联系人
  • media_*/media_*.db - 媒体文件索引
  • 其他: head_image, favorite, sns, emoticon 等

macOS 数据库密钥扫描 (WeChat 4.x)

macOS 版微信 4.x 使用 SQLCipher 4 加密本地数据库,密钥格式为 x'<64hex_key><32hex_salt>'。C 版扫描器通过 Mach VM API 扫描微信进程内存提取密钥。

前置条件

  • macOS (Apple Silicon / Intel)
  • WeChat 4.x (macOS 版)
  • Xcode Command Line Tools: xcode-select --install
  • 微信需要 ad-hoc 签名(或安装了防撤回补丁): sudo codesign --force --deep --sign - /Applications/WeChat.app

编译和使用

# 编译
cc -O2 -o find_all_keys_macos find_all_keys_macos.c -framework Foundation

# 运行(自动查找微信进程、扫描内存、匹配 DB salt
sudo ./find_all_keys_macos

<details>
<summary>点击展开</summary>

#### 2025-03-03 — 富媒体内容 & 组合消息修复
- 表情包内联显示
- 富媒体内容解析(链接卡片、文件、视频号、小程序等)
- 文字+图片组合消息不再丢失
- 隐藏消息检测机制
- Web UI 改进

</details>

### 免责声明

本工具仅用于学习和研究目的,用于解密**自己的**微信数据。请遵守相关法律法规,不要用于未经授权的数据访问。

防失联 TG: https://t.me/wechat_decrypt