## 决策背景 用户反馈 "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 变化重启监听, 不需要 用户手动重启进程 (现在的设计是"重启进程才激活")
590 lines
19 KiB
Markdown
590 lines
19 KiB
Markdown
# 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 打包 |
|
||
|
||
---
|
||
|
||
## ⭐ 快速开始
|
||
|
||
<details open>
|
||
<summary>macOS — 最小路径(展开查看)</summary>
|
||
|
||
```bash
|
||
# 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
|
||
```
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary>Windows — 最小路径 (CLI)</summary>
|
||
|
||
```bash
|
||
# 1. 以管理员身份打开终端
|
||
# 2. 安装依赖
|
||
py -m pip install -r requirements.txt
|
||
|
||
# 3. 提取密钥 + 解密
|
||
python main.py decrypt
|
||
|
||
# 4. 批量导出
|
||
python export_all_chats.py
|
||
```
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary>Windows — Web UI / EXE (推荐非技术用户)</summary>
|
||
|
||
```bash
|
||
# 直接跑 Web UI (开发模式)
|
||
python monitor_web.py # → 浏览器自动开 http://localhost:5678
|
||
|
||
# 或打包成单 exe 分发给别人
|
||
build.bat # 输出 dist/WeChatDecrypt.exe
|
||
# 双击 exe → 自动开浏览器 → Web UI 工具箱
|
||
```
|
||
|
||
工具箱 3 个 tab (📱 个人微信 / 🏢 企业微信 / 🔧 工具),
|
||
覆盖解密 / 导出 / 朋友圈 / 语音转 MP3 全部场景, 导出带模态框筛选 (不会动不动跑全量)。
|
||
|
||
实时消息监听跟工具箱在同一页面。详见 [EXE_USAGE.md](./EXE_USAGE.md)。
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary>Windows — 企业微信 (实验)</summary>
|
||
|
||
```bash
|
||
# 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 实测可用。详见技术细节里的「企业微信数据库解密」章节。
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary>Linux — 最小路径</summary>
|
||
|
||
```bash
|
||
# 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
|
||
```
|
||
|
||
</details>
|
||
|
||
---
|
||
|
||
## 📖 详细指南
|
||
|
||
### 环境要求
|
||
|
||
- 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`
|
||
- 微信正在运行
|
||
|
||
### 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
<details>
|
||
<summary>⚠️ 安装失败? 点击展开</summary>
|
||
|
||
**问题:`error: externally-managed-environment` (PEP 668)**
|
||
|
||
Homebrew Python (3.12+) 和部分 Linux 发行版禁止 `pip install` 直接写入系统 Python 环境。
|
||
|
||
**解决:使用虚拟环境**
|
||
|
||
```bash
|
||
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`):
|
||
|
||
```bash
|
||
make setup # 一键安装所有依赖 + 编译扫描器
|
||
make decrypt # 等价于 .venv/bin/python3 main.py decrypt
|
||
make all # 从密钥提取到导出全部完成
|
||
```
|
||
|
||
Windows 可改用:
|
||
|
||
```bash
|
||
py -m pip install --user -r requirements.txt
|
||
```
|
||
|
||
</details>
|
||
|
||
### 配置
|
||
|
||
程序会自动检测微信数据目录并生成 `config.json`。如果自动检测失败,手动创建:
|
||
|
||
```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 Server(Claude) | `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 Server(Claude AI 集成)
|
||
|
||
将微信数据查询能力接入 Claude Code,让 AI 直接读取你的微信消息。
|
||
|
||
**注册:**
|
||
|
||
```bash
|
||
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 -t`、`transcribe_chat.py` 和 `transcribe_voice` MCP 工具共享同一套转录配置。
|
||
|
||
**后端对比:**
|
||
|
||
| 后端 | 速度 | 隐私 | 依赖 | 配置 |
|
||
|------|------|------|------|------|
|
||
| `local`(默认) | CPU,较慢 | 数据不出本机 | `pip install -r requirements.txt` | 无需配置 |
|
||
| `openai` | API,最快 | 语音上传至 OpenAI | `pip install openai` | 需 `openai_api_key` |
|
||
| `whisper_cpp` | Metal GPU,3-5x | 数据不出本机 | `brew install whisper-cpp` + 模型 | 自动检测 |
|
||
|
||
**配置方式(config.json):**
|
||
|
||
```json
|
||
{
|
||
"transcription_backend": "whisper_cpp"
|
||
}
|
||
```
|
||
|
||
启用 whisper_cpp 前需安装:
|
||
|
||
```bash
|
||
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 缓存派生,无需扫描进程内存:
|
||
|
||
```bash
|
||
python find_image_key_macos.py
|
||
```
|
||
|
||
密钥自动保存到 `config.json`,之后 Web UI 自动显示图片预览。
|
||
|
||
### Makefile 命令
|
||
|
||
```bash
|
||
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 # 列出所有命令
|
||
```
|
||
|
||
---
|
||
|
||
## 文件说明
|
||
|
||
文件按功能分组,方便定位。
|
||
|
||
<details open>
|
||
<summary><b>① 入口 / 一键脚本</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `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` 预览) |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>② 密钥提取 (从进程内存)</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `find_all_keys.py` | 平台分发入口 (Windows / Linux) |
|
||
| `find_all_keys_windows.py` | Windows: 扫 Weixin.exe 内存找 SQLCipher raw key |
|
||
| `find_all_keys_linux.py` | Linux: 同上, 走 /proc/<pid>/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` | 扫描器共用工具 |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>③ 数据库 / 图片 / 语音解密</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `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 |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>④ 导出 (JSON / CSV / HTML)</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `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 时间线) |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>⑤ 实时监听 / 服务</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `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` 工具的命令行包装) |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>⑥ 语音 / 音频</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `transcribe_chat.py` | 语音转文本 (local Whisper / OpenAI / whisper.cpp 三 backend) |
|
||
| `voice_to_mp3.py` | SILK_V3 → MP3 (需要 ffmpeg in PATH) |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>⑦ 打包 / 配置 / 文档</b></summary>
|
||
|
||
| 文件 | 说明 |
|
||
|---|---|
|
||
| `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`) |
|
||
|
||
</details>
|
||
|
||
<details>
|
||
<summary><b>⑧ 测试 / 文档</b></summary>
|
||
|
||
| 路径 | 说明 |
|
||
|---|---|
|
||
| `tests/` | 单元测试 (185+ 用例, 含 wxsqlite3 / image v2 / msg types / pagination 等) |
|
||
| `docs/` | 部署 / 排错指南 + 字段研究报告 |
|
||
| `latency_test.py` | 开发工具: 测量消息从 WeChat 写入到我们检测的延迟 |
|
||
|
||
</details>
|
||
|
||
---
|
||
|
||
## 🔧 技术细节
|
||
|
||
### 原理
|
||
|
||
微信 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 同局域网可用
|
||
|
||
#### 直接运行
|
||
|
||
```bash
|
||
python monitor_web.py # → 浏览器自动开 http://localhost:5678
|
||
```
|
||
|
||
#### 打包为单 exe
|
||
|
||
```bash
|
||
pip install pyinstaller
|
||
build.bat # → dist\WeChatDecrypt.exe
|
||
```
|
||
|
||
输出约 20MB 的单 exe, 双击即用, 无需安装 Python。
|
||
|
||
> 语音转 MP3 需要系统安装 [FFmpeg](https://ffmpeg.org/download.html) 并加入 PATH。
|
||
|
||
详细说明见 [EXE_USAGE.md](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 区
|
||
|
||
提取并解密:
|
||
|
||
```bash
|
||
python find_wxwork_keys.py
|
||
python decrypt_wxwork_db.py
|
||
python export_wxwork_messages.py
|
||
```
|
||
|
||
如果自动提取失败但你已有 raw key,也可以直接传入 32 位 hex key:
|
||
|
||
```bash
|
||
python decrypt_wxwork_db.py --key 00112233445566778899aabbccddeeff
|
||
```
|
||
|
||
配置项:
|
||
|
||
```json
|
||
{
|
||
"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`
|
||
|
||
### 编译和使用
|
||
|
||
```bash
|
||
# 编译
|
||
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
|