feat: macOS 图片 AES key 从磁盘 kvcomm 缓存派生(issue #23)
macOS 用户长期无法用 C 版 find_image_key_macos 从微信进程内存提取 V2 图片密钥(issue #23 报告 197K 候选全部失败)。新增 find_image_key_macos.py 走完全不同的路径:从磁盘 kvcomm 缓存 文件名派生密钥,无需扫描内存、无需 root、无需重签名。 派生算法 -------- - 扫 ~/.../app_data/net/kvcomm/key_<code>_*.statistic 文件名 - 对每个 (code, wxid) 候选: xor_key = code & 0xFF aes_key = MD5(str(code) + cleaned_wxid).hex()[:16] # ASCII 字符串 - 用 V2 _t.dat 文件 [0xF:0x1F] 16 字节做 AES-128-ECB 模板验证: 解出来必须是图像 magic(JPEG / PNG / GIF / WebP / wxgf) - 为防短 magic 偶然命中,要求多个不同模板都通过验证才算成功 - 命中后写回 config.json 的 image_aes_key / image_xor_key, monitor_web.py 自动加载 致谢 ---- 派生算法源自 @hicccc77 在 issue #23 的评论;参考实现见其 WeFlow 项目 (CC BY-NC-SA 4.0)。本模块是独立的 Python clean-room 实现, 未复制其 TypeScript 源码;函数边界与变量命名沿用算法的自然结构 (regex 模式 / MD5 调用顺序 / magic 字节表等不可避免地相同)。 健壮性细节 ---------- - 多候选 kvcomm 路径:枚举 5 个不同的 macOS 微信版本路径布局 - 多模板交叉验证:默认收集 3 个不同密文,全部通过才算命中 - 已有 image_aes_key 仍有效时短路返回,不重写 config - 原子写 config.json:tmp + os.replace + finally 清理 .tmp - 多 wxid 候选:同时试 raw 和归一化后的 wxid(A_Hare_626a → A_Hare) - print(flush=True) 逐次显式(与 find_image_key.py 风格一致) 测试 ---- 新增 tests/test_find_image_key_macos.py,53 个测试覆盖: 派生算法 / wxid 归一化 / kvcomm 路径推算(含多候选)/ 模板收集 (去重 / 子目录 / max_files 边界)/ AES 验证(5 种 magic / 短输入 / 空 key)/ 多模板交叉验证 / 端到端集成(命中 / 各种失败分支)/ 原子写 / main 短路(已有有效 key 不重写 / 已有错 key 落到派生)。 全部通过:python -m unittest discover tests → 88/88。 兼容性 ------ - 无新增依赖(pycryptodome 已在 requirements.txt) - 不改任何现有 Python 文件,零回归风险 - 现有 Windows / Linux 路径 (find_image_key.py / find_image_key_monitor.py) 不受影响
This commit is contained in:
23
README.md
23
README.md
@@ -205,7 +205,9 @@ claude mcp add wechat -- python C:\Users\你的用户名\wechat-decrypt\mcp_serv
|
||||
|
||||
### 图片解密 (V2 格式)
|
||||
|
||||
微信 4.0 (2025-08+) 的 .dat 图片文件使用 AES-128-ECB + XOR 混合加密 (V2 格式)。AES 密钥需要从运行中的微信进程内存中提取:
|
||||
微信 4.0 (2025-08+) 的 .dat 图片文件使用 AES-128-ECB + XOR 混合加密 (V2 格式)。AES 密钥的获取方式因平台而异:
|
||||
|
||||
**Windows / Linux**(从进程内存扫描):
|
||||
|
||||
```bash
|
||||
# 1. 在微信中打开查看 2-3 张图片(点击看大图)
|
||||
@@ -216,9 +218,19 @@ python find_image_key_monitor.py
|
||||
python find_image_key.py
|
||||
```
|
||||
|
||||
密钥会自动保存到 `config.json` 的 `image_aes_key` 字段。之后 `monitor_web.py` 启动时会自动加载密钥,图片消息将显示内联预览。
|
||||
> AES 密钥仅在微信查看图片时临时加载到内存中。如果扫描未找到密钥,请先在微信中查看几张图片,然后立即重新运行脚本。
|
||||
|
||||
> **注意**: AES 密钥仅在微信查看图片时临时加载到内存中。如果扫描未找到密钥,请先在微信中查看几张图片,然后立即重新运行脚本。
|
||||
**macOS**(从磁盘 kvcomm 缓存派生,**无需扫描进程内存**):
|
||||
|
||||
```bash
|
||||
python find_image_key_macos.py
|
||||
```
|
||||
|
||||
无需提前在微信中查看图片,无需 root 权限,无需重签名。脚本会扫描 `~/Library/Containers/com.tencent.xinWeChat/.../app_data/net/kvcomm/key_*.statistic` 文件名提取派生码 `code`,配合 `db_dir` 路径里的 wxid,按 `aes_key = MD5(str(code) + cleaned_wxid)[:16]` / `xor_key = code & 0xFF` 的规则推算密钥,并用一张 V2 `_t.dat` 缩略图做 AES 模板验证。解决 [issue #23](https://github.com/ylytdeng/wechat-decrypt/issues/23)(macOS 内存扫描器 197K 候选全部失败)。
|
||||
|
||||
派生算法的发现归功于 [@hicccc77](https://github.com/hicccc77) 在 issue #23 的[评论](https://github.com/ylytdeng/wechat-decrypt/issues/23),参考实现见其 [WeFlow 项目](https://github.com/hicccc77/WeFlow/blob/dev/electron/services/keyServiceMac.ts)(CC BY-NC-SA 4.0)。本仓库的 `find_image_key_macos.py` 是基于该算法的独立 Python clean-room 实现。
|
||||
|
||||
密钥会自动保存到 `config.json` 的 `image_aes_key` / `image_xor_key` 字段。之后 `monitor_web.py` 启动时会自动加载,图片消息将显示内联预览。
|
||||
|
||||
## 文件说明
|
||||
|
||||
@@ -234,8 +246,9 @@ python find_image_key.py
|
||||
| `monitor_web.py` | 实时消息监听 (Web UI + SSE + 图片预览) |
|
||||
| `monitor.py` | 实时消息监听 (命令行) |
|
||||
| `decode_image.py` | 图片 .dat 文件解密模块 (XOR / V1 / V2) |
|
||||
| `find_image_key.py` | 从微信进程内存提取图片 AES 密钥 |
|
||||
| `find_image_key_monitor.py` | 持续监控版密钥提取(推荐) |
|
||||
| `find_image_key.py` | 从微信进程内存提取图片 AES 密钥(Windows / Linux) |
|
||||
| `find_image_key_monitor.py` | 持续监控版密钥提取(Windows / Linux,推荐) |
|
||||
| `find_image_key_macos.py` | macOS 版图片密钥派生(从磁盘 kvcomm 缓存推算,无需扫描内存) |
|
||||
| `latency_test.py` | 延迟测量诊断工具 |
|
||||
| `find_all_keys_macos.c` | macOS 版内存密钥扫描器 (C, Mach VM API) |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user