wechat-miniprogram-mcp
by littlehack
README.md
# 微信小程序逆向 MCP Server
专用于小程序 JS 逆向的 MCP (Model Context Protocol) Server,支持脚本枚举、搜索、断点调试、函数跟踪、网络请求捕获等完整动态逆向能力。
## 核心能力
### 逆向工作流
```
搜索代码 → 定位函数 → 下断点 → 触发 → 查看参数 → 跟踪调用链 → 分析请求/加密逻辑
```
### 支持环境
- **微信小程序** (WeChatAppEx) - 主要目标
- **Chrome/Chromium** 浏览器
- **Node.js** 服务端
- **Electron** 桌面应用
- 任何支持 Chrome DevTools Protocol 的 JavaScript 运行环境
## 前置要求
- **Node.js**: v20.19.0 或更高版本
- **微信版本**: 支持微信 for Windows 4.x 及以上版本
- **调试目标**: 微信小程序需要 WMPFDebugger 代理
> **注意**: WMPFDebugger 通过 Frida hook 微信小程序运行时(WeChatAppEx.exe)。当前支持的内部版本号范围为 11581-19459。如果您的微信版本不在支持范围内,Frida hook 将无法正常工作。请确保微信版本为4.x 或更高版本。
## 快速开始
### 1. 安装依赖
```bash
git clone https://github.com/littlehack/wechat-miniprogram-mcp.git
cd wechat-miniprogram-mcp
npm install
```
### 2. 构建并启动
```bash
npm run build
npm start
```
### 3. 连接到调试目标
**方式一:连接到微信小程序**
```bash
# 需要先启动 WMPFDebugger 代理
npm start -- --cdp-port 62000
```
**方式二:连接到 Chrome 浏览器**
```bash
# 启动 Chrome 并启用远程调试
chrome.exe --remote-debugging-port=9222
```
## 命令行参数
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--debug-port <port>` | 调试服务器端口 | 9421 |
| `--cdp-port <port>` | CDP 代理服务器端口 | 62000 |
| `--debug-main` | 输出主进程调试信息 | false |
| `--log-file <path>` | 日志文件路径 | 无 |
## MCP 工具列表
### 微信小程序专用工具 (wechatTools)
| 工具名称 | 说明 |
|----------|------|
| `connect_cdp` | 连接到微信小程序 CDP |
| `disconnect_cdp` | 断开 CDP 连接 |
| `get_miniprogram_status` | 获取小程序运行状态 |
| `list_contexts` | 列出所有可用的 JavaScript 执行上下文 |
| `switch_context` | 切换执行上下文(如 app=逻辑层, page-frame=渲染层) |
| `extract_code_bundle` | 提取代码包(按虚拟文件系统保存) |
| `extract_page_business_logic` | 提取当前页面的业务逻辑代码 |
| `hook_miniprogram_api` | Hook 小程序 API(如 wx.request, wx.login) |
| `get_storage_data` | 获取本地存储数据(wx.getStorageSync) |
| `analyze_encryption_params` | 分析加密参数、签名算法、反爬虫机制 |
| `intercept_network_requests` | 拦截网络请求,记录 API 调用和数据传输 |
| `capture_appservice_network` | 捕获 AppService 逻辑层的网络请求 |
| `search_and_auto_break` | 搜索网络请求函数并自动设置断点 |
### JS 逆向核心工具 (jsReverseTools)
| 工具名称 | 说明 |
|----------|------|
| `evaluate_script` | 在目标环境执行 JavaScript 代码 |
| `search_in_sources` | 在所有脚本中搜索代码 |
| `search_in_script` | 在指定脚本中搜索代码 |
| `set_breakpoint` | 基于 scriptId/行号设置断点 |
| `set_breakpoint_on_text` | 基于代码文本搜索自动定位断点 |
| `get_paused_info` | 查看暂停状态、调用栈、变量 |
| `evaluate_on_call_frame` | 在暂停帧中执行表达式 |
| `get_call_stack` | 获取调用栈 |
| `step` | 单步执行(over/into/out) |
| `pause_or_resume` | 暂停/恢复执行 |
| `list_breakpoints` | 列出所有断点 |
| `remove_breakpoint` | 移除断点 |
| `watch_variable` | 监控变量变化 |
| `deobfuscate_code` | 代码反混淆 |
### JS 逆向扩展工具 (jsReverseExtendedTools)
| 工具名称 | 说明 |
|----------|------|
| `list_scripts` | 列出所有已加载的脚本 |
| `get_script_source` | 获取脚本源码 |
| `get_source_range` | 获取脚本指定行范围的源码 |
| `save_script_source` | 保存脚本源码到文件 |
| `list_network_requests` | 查看捕获的网络请求 |
| `clear_network_requests` | 清除网络请求记录 |
| `get_request_initiator` | 获取请求发起调用栈 |
| `break_on_xhr` | 设置 XHR/Fetch 断点 |
| `list_console_messages` | 查看控制台消息 |
| `take_screenshot` | 截取页面截图 |
| `click_element` | 点击页面元素 |
| `select_frame` | 选择页面框架(iframe) |
| `clear_site_data` | 清除站点数据(cookies、缓存、存储) |
### 函数调用跟踪工具 (functionTracingTools)
| 工具名称 | 说明 |
|----------|------|
| `trace_function` | Hook 函数并记录调用信息 |
| `get_trace_results` | 获取函数跟踪结果 |
| `stop_trace` | 停止函数跟踪 |
| `batch_hook` | 批量 Hook 多个函数 |
## 集成到 AI Agent
### Claude Desktop 配置
在 `claude_desktop_config.json` 中添加:
```json
{
"mcpServers": {
"wechat-miniprogram": {
"command": "node",
"args": ["D:\\path\\to\\wechat-miniprogram-mcp\\build\\index.js"]
}
}
}
```
### OpenCode 配置
在 `opencode.json` 中添加:
```json
{
"mcp": {
"wechat-miniprogram": {
"command": "node",
"args": ["D:\\path\\to\\wechat-miniprogram-mcp\\build\\index.js"]
}
}
}
```
## 典型逆向场景
### 场景 1:分析加密参数
```javascript
// 1. 连接到小程序
connect_cdp({})
// 2. 搜索加密相关代码
search_in_sources({ query: "encrypt" })
// 3. 定位加密函数并下断点
set_breakpoint_on_text({ text: "function encrypt(" })
// 4. 断点命中后查看参数
get_paused_info({})
// 5. 在暂停帧中查看变量
evaluate_on_call_frame({ expression: "JSON.stringify(data)" })
```
### 场景 2:跟踪函数调用
```javascript
// 1. 启动函数跟踪
trace_function({ target: "wx.request" })
// 2. 执行操作触发函数调用
evaluate_script({ script: "wx.request({url: '...'})" })
// 3. 获取跟踪结果
get_trace_results({ last_n: 10 })
```
### 场景 3:分析网络请求签名
```javascript
// 1. 设置 XHR 断点
break_on_xhr({ url: "api.example.com" })
// 2. 触发请求,断点命中后查看调用栈
get_paused_info({})
// 3. 向上遍历调用栈找到签名函数
evaluate_on_call_frame({
frame_index: 2,
expression: "JSON.stringify(arguments)"
})
```
### 场景 4:提取小程序代码
```javascript
// 1. 连接到小程序
connect_cdp({})
// 2. 提取完整代码包
extract_code_bundle({ save_path: "./miniprogram_scripts" })
// 3. 或提取当前页面业务逻辑
extract_page_business_logic({ save_path: "./business_logic" })
```
### 场景 5:Hook 小程序 API
```javascript
// 1. Hook wx.request
hook_miniprogram_api({ api_name: "wx.request", action: "log" })
// 2. Hook wx.login
hook_miniprogram_api({ api_name: "wx.login", action: "log" })
// 3. 执行操作,查看日志
```
### 场景 6:捕获 AppService 网络请求
```javascript
// 1. 捕获逻辑层网络请求(支持 URL 过滤)
capture_appservice_network({ url_filter: "api", duration_ms: 30000 })
// 2. 查看捕获的请求
list_network_requests({})
```
## 技术架构
```
┌─────────────────────────────────────────────────────────────────┐
│ wechat-miniprogram-mcp │
├─────────────────────────────────────────────────────────────────┤
│ Tools Layer │
│ ├── wechatTools (微信小程序专用工具) │
│ ├── jsReverseTools (核心调试工具) │
│ ├── jsReverseExtendedTools (扩展工具) │
│ └── functionTracingTools (函数跟踪) │
├─────────────────────────────────────────────────────────────────┤
│ CDP Client Layer │
│ ├── Proxy Mode (WMPFDebugger 代理,用于微信小程序) │
│ └── Direct Mode (直连 Chrome DevTools,通用场景) │
├─────────────────────────────────────────────────────────────────┤
│ Target Runtime │
│ ├── WeChatAppEx (微信小程序,通过代理) │
│ ├── Chrome/Chromium (浏览器) │
│ ├── Node.js (服务端) │
│ └── Electron (桌面应用) │
└─────────────────────────────────────────────────────────────────┘
```
## 项目结构
```
wechat-miniprogram-mcp/
├── src/ # TypeScript 源码
│ ├── tools/
│ │ ├── wechat-miniprogram.ts # 微信小程序专用工具
│ │ ├── js-reverse.ts # 核心调试工具
│ │ ├── js-reverse-extended.ts # 扩展工具
│ │ └── function-tracing.ts # 函数跟踪工具
│ ├── cdp-client.ts # CDP 客户端
│ ├── cdp-proxy.ts # CDP 代理服务器
│ ├── frida-inject.ts # Frida 注入模块
│ └── index.ts # 入口文件
├── frida/ # Frida 相关文件
│ ├── hook.js # Frida hook 脚本
│ └── config/ # 地址配置文件
├── build/ # 编译输出目录
├── package.json
└── README.md
```
## 免责声明
**使用本工具进行微信小程序逆向分析存在以下风险,使用前请仔细阅读:**
### 账号封禁风险
- 微信官方明确禁止对微信客户端及小程序进行逆向工程、调试或修改
- 使用本工具可能被微信检测为异常行为,导致**账号被封禁或限制功能**
- 建议使用**测试账号**进行调试,避免使用主账号
### 法律风险
- 逆向工程可能违反微信用户协议和相关法律法规
- 本工具仅供学习研究使用,不得用于商业用途或非法目的
- 用户应自行承担使用本工具产生的一切法律责任
### 技术风险
- Frida hook 可能导致微信客户端不稳定或崩溃
- 不当使用可能导致小程序数据异常或丢失
- 建议在虚拟机或测试环境中使用
### 建议
1. 使用测试账号进行调试
2. 不要在生产环境中使用
3. 遵守微信用户协议和相关法律法规
4. 仅用于学习和研究目的
## 许可证
Apache-2.0
## 致谢
- [WMPFDebugger](https://github.com/evi0s/WMPFDebugger) - 微信小程序调试工具
- [js-reverse-mcp](https://github.com/zhizhuodemao/js-reverse-mcp) - JS 逆向 MCP Server
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues