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

4.6 KiB
Raw Blame History

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 已安装并加入 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

{
    "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.dbwxwork_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