Files
zWorkFlow/EXE_USAGE.md
ylytdeng e5e2269947 fix: PR #107 后续清理 (security/正确性/一致性)
针对 4 个 review agent 在 PR #107 (5649 行巨型 PR) 找到的关键问题做最小
侵入修复。已合并代码本身能跑,这次是收紧 security + 消重 + 文档一致性。

## 安全修复

### wxwork_keys.json 落盘权限 (find_wxwork_keys.py)
含明文 16-byte raw key 的 keys 文件,之前 default umask 落盘。改成:
  1. 写 tmp 文件
  2. chmod 0o600 (Unix 严格 owner-only; Windows 上 chmod 控制只读位,
     至少避免世界可读最差情况)
  3. atomic rename
旧产物自然过期,新生成的都受保护。

### SNS XXE 防护 (export_sns.py)
朋友圈 XML 来源是不可信输入(他人发的 content),原 `ET.fromstring()`
完全没过滤,可被恶意 entity expansion / 外部实体引用攻击。加跟
`mcp_server._XML_UNSAFE_RE` 同模式的过滤(拒 `<!DOCTYPE>` / `<!ENTITY>`)
+ 200KB 大小上限。`_parse_timeline_xml` 检查后才进 ET.fromstring。

## 正确性 / 消重

### AES 对齐公式统一 (decode_image.py + decrypt_sns.py + export_sns.py)
原本三处各写一份:
  - decode_image.py:   aes_size -= ~(~aes_size % 16)   ← bitwise trick
  - decrypt_sns.py:    同上
  - export_sns.py:     aes_size + (16 - aes_size%16) if … else aes_size+16
两个公式数学等价(对 0/1/15/16/17/100/1000/12345 全部验证一致),但
bitwise trick 难读且漂移风险高。抽 `aligned_aes_block_size()` 到
decode_image.py 作 canonical 实现, 另两处 import 复用。

### 32-bit pointer 假设明确化 (find_wxwork_keys.py)
reviewer 担心 `_read_u32` 在 64-bit 进程上错位,实测 WXWork.exe 5.0.x
是 **32-bit 进程** (`Program Files (x86)\WXWork\` + PE Machine = x86),
所以 4 字节读指针是对的。加注释明确这个假设,腾讯如果升级到 64-bit
要重做整套逆向, 当前实测全部 17 db 解密通过印证。

## 一致性

### main.py show_status() 走 _config_file_path() (main.py)
原硬编码 `config_file = "config.json"` 绕开 PR #107 新引入的
`_config_file_path()`,打包成 exe 后 cwd 不一定是 exe 目录,会读到错
位置。改成 `from config import _config_file_path`。

### EXE_USAGE.md 输出目录写错 (EXE_USAGE.md)
EXE_USAGE 说导出到 `export/`,代码实际 `output_base_dir = wechat_files/
<wxid>/`,联系人下还是 `messages.csv/html/json` 而不是
`message_0.db.csv`。修正成真实结构。

## 文档

README 加两段:
  - 安全提示: keys 文件 chmod 0600 + 不要 commit 到 git
  - 朋友圈 XML XXE 防护说明

## 测试

185/185 通过 (含已有 wxsqlite3 roundtrip + image v2 + msg types filter
+ pagination hint + chat export helpers 等)。
aligned_aes_block_size 单独验证跟旧公式等价(0/1/15/16/17/100/1000/12345)。

## 未跟进 (后续 follow-up issue)

- 3 处 V1/V2/XOR 解密代码完全重复(decode_image / decrypt_sns /
  export_messages 各自实现)——抽出来工作量大,本次先抽 helper 不动
  完整解密路径,后续单独 PR
- export_messages HTML base64 内联图片可能爆几 GB,应改成可选 flag
- SNS / wxwork export / batch_decrypt_images / voice_to_mp3 测试缺位
  (0 个 test)
2026-05-17 17:00:20 +08:00

126 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WeChat Decrypt 工具箱 使用说明
## 快速开始
1. **启动微信**并登录账号;如果要解密企业微信,也请先启动企业微信
2. 双击 `WeChatDecrypt.exe` 打开工具箱
3. 根据需要点击按钮:
- **① 微信解密** → 从微信进程提取密钥并解密数据库到 `decrypted/` 目录
- **② 图片密钥** → 从微信进程提取新版图片 AES 密钥
- **③ 导出数据** → 将聊天记录导出为 CSV / HTML / JSON 到 `wechat_files/<wxid>/<联系人>/` 目录
- **④ 朋友圈图片** → 解密朋友圈缓存图片
- **⑤ 企业微信解密** → 从企业微信进程提取密钥并解密数据库到 `wxwork_decrypted/` 目录
- **⑥ 企业微信导出** → 选择某个人或群,导出 CSV / HTML / JSON 到 `wxwork_export/` 目录
## 前置要求
- Windows 10 / 11
- 微信 PC 版已登录(解密微信时需要微信进程运行)
- 企业微信 PC 版已登录(解密企业微信时需要企业微信进程运行)
- [FFmpeg](https://ffmpeg.org/download.html) 已安装并加入 PATH转换音频需要
### 检查 FFmpeg
打开命令提示符,输入:
```
ffmpeg -version
```
如果提示"不是内部或外部命令",需要先安装 FFmpeg。
## 输出目录说明
运行后在 exe 所在目录下生成以下文件夹:
```
WeChatDecrypt.exe
config.json ← 首次运行自动生成的配置文件
decrypted/ ← ① 解密后的数据库文件
wxwork_decrypted/ ← ⑤ 解密后的企业微信数据库文件
wxwork_export/ ← ⑥ 导出的企业微信聊天记录
群名_R_123/
.info
messages.csv
messages.html
messages.json
wechat_files/ ← ③ 导出的聊天记录 (按 wxid + 联系人组织)
<wxid>/
张三/
.info ← 联系人信息username/alias/remark/nick_name
messages.csv ← CSV 格式Excel 可直接打开)
messages.html ← HTML 格式(浏览器打开,微信气泡样式)
messages.json ← JSON 格式(程序处理用)
image/ ← 该联系人聊天涉及的图片
朋友圈图片/ ← ④ 解密后的朋友圈缓存图片
李四/
...
```
## 导出格式说明
### CSV
- 编码UTF-8 with BOMExcel 双击即可正确显示中文
- 字段时间、发送者、消息类型、内容、server_id
### HTML
- 浏览器打开,模拟微信聊天界面
- 左侧气泡为接收消息,右侧为发送消息
- 按日期自动分组
### JSON
- 完整结构化数据,包含所有元信息
- 适合程序二次处理或 AI 训练
## 配置文件
首次运行会自动检测微信数据目录并生成 `config.json`
```json
{
"db_dir": "D:\\xwechat_files\\wxid_xxx\\db_storage",
"keys_file": "all_keys.json",
"decrypted_dir": "decrypted",
"wechat_process": "Weixin.exe",
"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"
}
```
如果自动检测失败,请手动修改 `db_dir` 为你的微信数据目录。
路径可在:微信设置 → 文件管理 中找到。
## 常见问题
**Q: 点击"解密数据库"提示未检测到微信进程**
A: 请确保微信 PC 版已启动并登录,然后重试。
**Q: 解密失败 / 密钥提取失败**
A: 检查 `config.json` 中的 `db_dir` 是否与当前登录的微信账号匹配。切换账号后需要删除 `all_keys.json` 重新提取。
**Q: 企业微信解密失败 / 找不到企业微信数据目录**
A: 确认企业微信 PC 版已启动并登录。若自动检测失败,请在 `config.json` 中设置 `wxwork_db_dir`,路径通常类似 `C:\Users\<用户>\Documents\WXWork\<account_id>\Data`。切换企业微信账号后删除 `wxwork_keys.json` 重新提取。
**Q: 企业微信导出为空 / 找不到会话**
A: 先执行"⑤ 企业微信解密",确认 `wxwork_decrypted/message.db``wxwork_decrypted/session.db` 存在,然后再执行"⑥ 企业微信导出"。
**Q: 转换音频没有输出**
A: 确认已安装 FFmpeg 并加入系统 PATH。确认已先执行"① 解密数据库"。
**Q: 导出消息为空**
A: 确认已先执行"① 解密数据库",且 `decrypted/message/` 下有 `.db` 文件。
**Q: 目录名是 wxid_xxx 而不是昵称**
A: 该联系人不在通讯录中contact.db 无记录),会使用原始 username。
## 自行打包
安装依赖后双击 `build.bat` 即可重新打包:
```
pip install pyinstaller pycryptodome zstandard pilk
build.bat
```
输出文件:`dist\WeChatDecrypt.exe`