Commit 98be58b0c7ffe9e1d9dedfcc036600de58d1410f
1 parent
30083104
refactor(wechat_plain/scripts): 按功能重组目录结构
把顶层平铺的脚本按功能归入子目录,并清理可重新生成的产物: - db-decrypt/: Frida 抓 key + 解密 EnMicroMsg.db(attach↔hunter 同目录依赖保持) - search/: Web 搜索服务 + 聊天统计生成 - docs/: HANDOFF.md / README_Android.md + notes/(原 md/) - 删除 *.tar.gz / *.zip 打包产物与 GITEOF,新增 .gitignore - 新增 README.md 目录索引,同步文档内路径引用 lsposed-wechat-sendmsg / local-testkit / platform-tools / frida-daemon / archive 保持不动。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Showing
25 changed files
with
56 additions
and
13 deletions
wechat_plain/scripts/.gitignore
0 → 100644
wechat_plain/scripts/GITEOF deleted
wechat_plain/scripts/README.md
0 → 100644
| 1 | +# wechat_plain/scripts — 目录索引 | ||
| 2 | + | ||
| 3 | +Pixel 上微信 bot 的脚本与工具,按功能分目录管理。 | ||
| 4 | + | ||
| 5 | +| 目录 | 功能 | 状态 | | ||
| 6 | +|------|------|------| | ||
| 7 | +| [`db-decrypt/`](db-decrypt/) | Frida hook `libWCDB.so` 抓 SQLCipher key + 解密 `EnMicroMsg.db`(Android v1/v2 + Mac 旧路线 + 浏览器解密页) | 可用 | | ||
| 8 | +| [`search/`](search/) | 解密库之上的 Web 搜索服务(`search_server*.py`)+ 聊天统计生成(`build_chat_stats.py`) | 可用 | | ||
| 9 | +| [`lsposed-wechat-sendmsg/`](lsposed-wechat-sendmsg/) | **A11y 发送模块 = 当前唯一能把消息真正推进 `message` 表的主发送链路**(`HermesAccessibilityService`,纯 UI 自动化) | 主线 ✅ | | ||
| 10 | +| [`local-testkit/`](local-testkit/) | Pixel 端部署 / 自启动 / 测试套件(hermes daemon、termux boot、各类 debug/test 脚本) | 可用 | | ||
| 11 | +| [`platform-tools/`](platform-tools/) | adb / fastboot 等 Android 平台二进制 | 工具 | | ||
| 12 | +| [`frida-daemon/`](frida-daemon/) | 早期 Frida 发送队列实现 | **已废弃**(注入大 bundle 触发反调试致微信崩溃) | | ||
| 13 | +| [`archive/`](archive/) | 更早期的 Frida / lldb PoC 脚本 | 归档 | | ||
| 14 | +| [`docs/`](docs/) | 文档:`HANDOFF.md`、`README_Android.md`、`notes/`(项目/参考笔记) | — | | ||
| 15 | + | ||
| 16 | +> 发送链路现状详见仓库根 `CLAUDE.md` §微信集成架构:只有 `lsposed-wechat-sendmsg` 的 A11y service 真正生效,frida-daemon 与 LSPosed 反射 API 两条路径均已废弃。 | ||
| 17 | + | ||
| 18 | +## 常见入口 | ||
| 19 | + | ||
| 20 | +```bash | ||
| 21 | +# 以本目录 (wechat_plain/scripts/) 为工作目录 | ||
| 22 | + | ||
| 23 | +# 抓 key + 解密(Android) | ||
| 24 | +python3 db-decrypt/wechat_android_attach.py # 抓 SQLCipher key | ||
| 25 | +python3 db-decrypt/wechat_android_attach.py --extract-db | ||
| 26 | +python3 db-decrypt/wechat_android_attach.py --decrypt | ||
| 27 | + | ||
| 28 | +# 启动搜索 Web UI | ||
| 29 | +python3 search/search_server_android.py ~/wxmoment/dbs/EnMicroMsg.db.decrypted.db | ||
| 30 | +``` | ||
| 31 | + | ||
| 32 | +详细操作见 [`docs/README_Android.md`](docs/README_Android.md) 与 [`docs/HANDOFF.md`](docs/HANDOFF.md)。 |
wechat_plain/scripts/wechat-db-decrypt.html renamed to wechat_plain/scripts/db-decrypt/wechat-db-decrypt.html
wechat_plain/scripts/wechat_android_attach.py renamed to wechat_plain/scripts/db-decrypt/wechat_android_attach.py
wechat_plain/scripts/wechat_android_attach_v2.py renamed to wechat_plain/scripts/db-decrypt/wechat_android_attach_v2.py
wechat_plain/scripts/wechat_android_full_hunter.js renamed to wechat_plain/scripts/db-decrypt/wechat_android_full_hunter.js
wechat_plain/scripts/wechat_android_key_hunter.js renamed to wechat_plain/scripts/db-decrypt/wechat_android_key_hunter.js
wechat_plain/scripts/wechat_earlybird.py renamed to wechat_plain/scripts/db-decrypt/wechat_earlybird.py
wechat_plain/scripts/wechat_export_all.py renamed to wechat_plain/scripts/db-decrypt/wechat_export_all.py
wechat_plain/scripts/wechat_key_hunter.js renamed to wechat_plain/scripts/db-decrypt/wechat_key_hunter.js
wechat_plain/scripts/HANDOFF.md renamed to wechat_plain/scripts/docs/HANDOFF.md
| @@ -11,12 +11,15 @@ | @@ -11,12 +11,15 @@ | ||
| 11 | 11 | ||
| 12 | ## 文件位置(全部在 Termux 主目录下) | 12 | ## 文件位置(全部在 Termux 主目录下) |
| 13 | 13 | ||
| 14 | +部署到手机后这些文件**平铺**在一个目录里(下方命令均假设当前目录就是它)。 | ||
| 15 | +仓库源码则按功能分目录:`scripts/db-decrypt/`(解密套件)、`scripts/search/`(搜索服务)、`scripts/docs/`(本文档)。 | ||
| 16 | + | ||
| 14 | ``` | 17 | ``` |
| 15 | ~/.hermes/tools/wechat/ | 18 | ~/.hermes/tools/wechat/ |
| 16 | -├── wechat_android_key_hunter.js # Frida 脚本:hook libWCDB.so 截获 SQLCipher key | ||
| 17 | -├── wechat_android_attach.py # Python 控制脚本:attach / extract / decrypt | ||
| 18 | -├── search_server_android.py # Web 搜索服务器:读取解密后的 EnMicroMsg.db | ||
| 19 | -└── README_Android.md # 完整操作文档 | 19 | +├── wechat_android_key_hunter.js # Frida 脚本:hook libWCDB.so 截获 SQLCipher key ← 源: db-decrypt/ |
| 20 | +├── wechat_android_attach.py # Python 控制脚本:attach / extract / decrypt ← 源: db-decrypt/ | ||
| 21 | +├── search_server_android.py # Web 搜索服务器:读取解密后的 EnMicroMsg.db ← 源: search/ | ||
| 22 | +└── README_Android.md # 完整操作文档 ← 源: docs/ | ||
| 20 | ``` | 23 | ``` |
| 21 | 24 | ||
| 22 | ## 关键成果(已通过测试验证) | 25 | ## 关键成果(已通过测试验证) |
wechat_plain/scripts/README_Android.md renamed to wechat_plain/scripts/docs/README_Android.md
| 1 | # WeChat Android EnMicroMsg.db 解密读取工具链 | 1 | # WeChat Android EnMicroMsg.db 解密读取工具链 |
| 2 | 2 | ||
| 3 | +> 下面命令均以 `wechat_plain/scripts/` 为工作目录。解密套件在 `db-decrypt/`,搜索服务在 `search/`。 | ||
| 4 | + | ||
| 3 | ## 文件清单 | 5 | ## 文件清单 |
| 4 | 6 | ||
| 5 | | 文件 | 用途 | 运行环境 | | 7 | | 文件 | 用途 | 运行环境 | |
| 6 | |------|------|----------| | 8 | |------|------|----------| |
| 7 | -| `wechat_android_key_hunter.js` | Frida 脚本:hook `libWCDB.so` 的 `sqlite3_key` / `sqlite3_key_v2`,截获 SQLCipher 密码 | Android 微信进程 | | ||
| 8 | -| `wechat_android_attach.py` | Python 控制脚本:attach 微信、收集 key、提取 DB、自动解密 | Termux / Debian proot / Mac | | ||
| 9 | -| `search_server_android.py` | Web 搜索服务器:读取解密后的 `EnMicroMsg.db`,提供会话/联系人/聊天记录搜索 | 任意有 Python 的环境 | | 9 | +| `db-decrypt/wechat_android_key_hunter.js` | Frida 脚本:hook `libWCDB.so` 的 `sqlite3_key` / `sqlite3_key_v2`,截获 SQLCipher 密码 | Android 微信进程 | |
| 10 | +| `db-decrypt/wechat_android_attach.py` | Python 控制脚本:attach 微信、收集 key、提取 DB、自动解密 | Termux / Debian proot / Mac | | ||
| 11 | +| `search/search_server_android.py` | Web 搜索服务器:读取解密后的 `EnMicroMsg.db`,提供会话/联系人/聊天记录搜索 | 任意有 Python 的环境 | | ||
| 10 | 12 | ||
| 11 | ## 工作原理 | 13 | ## 工作原理 |
| 12 | 14 | ||
| @@ -23,7 +25,7 @@ adb shell su -c cat 复制 DB 文件到本地 | @@ -23,7 +25,7 @@ adb shell su -c cat 复制 DB 文件到本地 | ||
| 23 | ↓ | 25 | ↓ |
| 24 | sqlcipher 解密:PRAGMA key="e03ce81"; PRAGMA cipher_compatibility=1; PRAGMA cipher_page_size=1024; | 26 | sqlcipher 解密:PRAGMA key="e03ce81"; PRAGMA cipher_compatibility=1; PRAGMA cipher_page_size=1024; |
| 25 | ↓ | 27 | ↓ |
| 26 | -SQLite 明文库 → search_server_android.py 提供 Web UI | 28 | +SQLite 明文库 → search/search_server_android.py 提供 Web UI |
| 27 | ``` | 29 | ``` |
| 28 | 30 | ||
| 29 | ## 关键发现(WeChat 8.0.72 on Android) | 31 | ## 关键发现(WeChat 8.0.72 on Android) |
| @@ -82,7 +84,7 @@ pip install frida==17.9.10 | @@ -82,7 +84,7 @@ pip install frida==17.9.10 | ||
| 82 | ### 2. 捕获 SQLCipher key | 84 | ### 2. 捕获 SQLCipher key |
| 83 | 85 | ||
| 84 | ```bash | 86 | ```bash |
| 85 | -python3 wechat_android_attach.py | 87 | +python3 db-decrypt/wechat_android_attach.py |
| 86 | ``` | 88 | ``` |
| 87 | 89 | ||
| 88 | - 脚本会自动 kill 微信、重新启动、attach Frida | 90 | - 脚本会自动 kill 微信、重新启动、attach Frida |
| @@ -92,7 +94,7 @@ python3 wechat_android_attach.py | @@ -92,7 +94,7 @@ python3 wechat_android_attach.py | ||
| 92 | ### 3. 提取 DB 文件 | 94 | ### 3. 提取 DB 文件 |
| 93 | 95 | ||
| 94 | ```bash | 96 | ```bash |
| 95 | -python3 wechat_android_attach.py --extract-db | 97 | +python3 db-decrypt/wechat_android_attach.py --extract-db |
| 96 | ``` | 98 | ``` |
| 97 | 99 | ||
| 98 | - 复制 `EnMicroMsg.db` + `-shm` + `-wal` 到 `~/wxmoment/dbs/` | 100 | - 复制 `EnMicroMsg.db` + `-shm` + `-wal` 到 `~/wxmoment/dbs/` |
| @@ -101,7 +103,7 @@ python3 wechat_android_attach.py --extract-db | @@ -101,7 +103,7 @@ python3 wechat_android_attach.py --extract-db | ||
| 101 | ### 4. 解密 DB | 103 | ### 4. 解密 DB |
| 102 | 104 | ||
| 103 | ```bash | 105 | ```bash |
| 104 | -python3 wechat_android_attach.py --decrypt | 106 | +python3 db-decrypt/wechat_android_attach.py --decrypt |
| 105 | ``` | 107 | ``` |
| 106 | 108 | ||
| 107 | - 自动尝试字符串密码 / hex key + 多种 cipher 配置组合 | 109 | - 自动尝试字符串密码 / hex key + 多种 cipher 配置组合 |
| @@ -110,7 +112,7 @@ python3 wechat_android_attach.py --decrypt | @@ -110,7 +112,7 @@ python3 wechat_android_attach.py --decrypt | ||
| 110 | ### 5. 启动搜索服务器 | 112 | ### 5. 启动搜索服务器 |
| 111 | 113 | ||
| 112 | ```bash | 114 | ```bash |
| 113 | -python3 search_server_android.py ~/wxmoment/dbs/EnMicroMsg.db.decrypted.db | 115 | +python3 search/search_server_android.py ~/wxmoment/dbs/EnMicroMsg.db.decrypted.db |
| 114 | ``` | 116 | ``` |
| 115 | 117 | ||
| 116 | - 访问 http://localhost:5002 | 118 | - 访问 http://localhost:5002 |
| @@ -131,7 +133,7 @@ DETACH DATABASE plain; | @@ -131,7 +133,7 @@ DETACH DATABASE plain; | ||
| 131 | 133 | ||
| 132 | ## Frida 脚本 API 说明 | 134 | ## Frida 脚本 API 说明 |
| 133 | 135 | ||
| 134 | -`wechat_android_key_hunter.js` 的 Hook 点: | 136 | +`db-decrypt/wechat_android_key_hunter.js` 的 Hook 点: |
| 135 | 137 | ||
| 136 | | Hook 函数 | 模块 | 用途 | | 138 | | Hook 函数 | 模块 | 用途 | |
| 137 | |-----------|------|------| | 139 | |-----------|------|------| |
wechat_plain/scripts/md/MEMORY.md renamed to wechat_plain/scripts/docs/notes/MEMORY.md
wechat_plain/scripts/md/project-claude-code-termux.md renamed to wechat_plain/scripts/docs/notes/project-claude-code-termux.md
wechat_plain/scripts/md/project-hermes-setup.md renamed to wechat_plain/scripts/docs/notes/project-hermes-setup.md
wechat_plain/scripts/md/reference-wechat-android-re.md renamed to wechat_plain/scripts/docs/notes/reference-wechat-android-re.md
wechat_plain/scripts/md/user-profile.md renamed to wechat_plain/scripts/docs/notes/user-profile.md
wechat_plain/scripts/md/wechat-auto-reply-status.md renamed to wechat_plain/scripts/docs/notes/wechat-auto-reply-status.md
wechat_plain/scripts/local-testkit.tar.gz deleted
No preview for this file type
wechat_plain/scripts/local-testkit.zip deleted
No preview for this file type
wechat_plain/scripts/build_chat_stats.py renamed to wechat_plain/scripts/search/build_chat_stats.py
wechat_plain/scripts/search_server.py renamed to wechat_plain/scripts/search/search_server.py
wechat_plain/scripts/search_server_android.py renamed to wechat_plain/scripts/search/search_server_android.py
wechat_plain/scripts/wechat_android_toolkit.tar.gz deleted
No preview for this file type