Files

229 lines
7.6 KiB
Markdown
Raw Permalink 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.
# MCP 配置与验证 (MCP-SETUP)
> 本工作台靠 **3 个 MCP** 提供工具能力。本文说明:**它们是什么、装到哪、怎么验证、出问题怎么办。**
>
> 📦 **各 MCP 依赖的工具从哪里下载** → 见 **`Tool/docs/DOWNLOADS.md`**
---
## 一、MCP 与 Skill 的关系
```
Skill(提示词层) → 告诉 agent「该做什么、走哪条路」
MCP(工具层) → 给 agent「实际干活的手」
```
**举例**:`apkseep` Skill 说「用 jadx 反编译这个 APK」→ agent 调 `seep_apk_decompile`
→ seep MCP 内部驱动 jadx 完成反编译。
> **Skill 是说明书,MCP 是工具。** 两者都装好才能干活。
---
## 二、3 个已注册 MCP
| MCP | 工具数 | 用途 | 依赖 | 安装方式 |
| :--- | :---: | :--- | :--- | :--- |
| **seep** ⭐ | **22** | 二进制逆向 + APK 逆向 + Frida 生成 + 知识库 | radare2 / jadx / apktool | 本包自带 + 脚本下载工具 |
| **ida** | **~243** | IDA 全套分析链 | **你自备的 IDA Pro** | 脚本装 MCP + 你装 IDA |
| **playwright** | — | 浏览器自动化 | npx | 自动(npx 按需拉取) |
### seep MCP 的 22 个工具
| 分组 | 工具 |
| :--- | :--- |
| 状态环境 (2) | `seep_status` · `seep_ida_status` |
| 二进制 r2 (8) | `seep_r2_info` · `_cmd` · `_strings` · `_functions` · `_disasm` · `_decompile` · `_diff` · `_asm` |
| Android (5) | `seep_apk_info` · `_decompile` · `_unpack` · `_smali_search` · `_gen_hook` |
| 知识库 (4) | `seep_kb_search` · `_read` · `_checklist` · `_payloads` |
| 流程编排 (3) | `seep_task_init` · `seep_auto_triage` · `seep_gen_security_report` |
---
## 三、安装过程(`install-pi.ps1` 自动完成)
```
1. 备份现有 ~/.pi/agent/ 配置
2. 复制 Skill → ~/.pi/agent/skills/
3. 复制提示词 → ~/.pi/agent/SYSTEM.md · AGENTS.md
4. 复制扩展 → ~/.pi/agent/extensions/
5. 生成 mcp.json:
· <SEEP_ROOT> → 本包实际路径
· <IDA_ROOT> → 自动探测(D:\Tool\IDA Pro / C:\Program Files\IDA Pro / C:\IDA Pro)
· <IDA_PYTHON> → 探测到的 IDA Python
· playwright token → 需你自填(不用浏览器自动化可留空)
6. 写 settings.json(12 个 pi packages)
7. 执行 pi update --extensions
```
**生成的 `~/.pi/agent/mcp.json` 结构**:
```json
{
"mcpServers": {
"seep": {
"command": "python",
"args": ["<本包路径>\\Tool\\mcp\\seep_mcp_server.py"],
"env": { "PYTHONIOENCODING": "utf-8" },
"transport": "stdio"
},
"ida": {
"command": "<IDA Python 路径>",
"args": ["<IDA 安装目录>\\Lib\\site-packages\\ida_pro_mcp\\server.py"],
"transport": "stdio",
"lifecycle": "eager",
"requestTimeoutMs": 180000
},
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp@latest", "--extension"],
"env": { "PLAYWRIGHT_MCP_EXTENSION_TOKEN": "<你的token>" },
"transport": "stdio"
}
}
}
```
---
## 四、⚠️ 关键约束:`Tool/mcp/Tool/` 不可搬动
`seep_mcp_server.py` **内部硬编码**了运行时目录:
```python
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # = Tool/mcp/
TOOL_DIR = os.path.join(BASE_DIR, "Tool") # = Tool/mcp/Tool/
SAFE_DIR = os.path.join(TOOL_DIR, "safe") # = Tool/mcp/Tool/safe/
KB_DIR = os.path.join(TOOL_DIR, "reverselab", "kb") # = Tool/mcp/Tool/reverselab/kb
```
因此:
| 依赖 | 必须位于 |
| :--- | :--- |
| radare2 | `Tool/mcp/Tool/safe/radare2/bin/` |
| jadx | `Tool/mcp/Tool/safe/jadx/bin/` |
| apktool | `Tool/mcp/Tool/safe/apktool/` |
| Hook 模板 | `Tool/mcp/Tool/safe/hook-mcp/templates/` |
| 知识库 | `Tool/mcp/Tool/reverselab/kb/` |
> **搬走任何一个,对应的 MCP 工具就会失效。**
---
## 五、验证 MCP 是否就绪
### 方法 1:跑自检脚本(推荐)
```powershell
cd Desktop\Seep\setup
powershell -ExecutionPolicy Bypass -File .\verify.ps1
```
### 方法 2:在 pi 里问
```
你:seep_status 能跑吗?
pi:[返回 radare2 / jadx / apktool / 知识库 的就绪状态]
```
### 方法 3:手工检查
```powershell
# 1. 配置无占位符残留
Select-String -Path "$env:USERPROFILE\.pi\agent\mcp.json" -Pattern "<[A-Z_]+>"
# 2. seep MCP 语法可解析
python -c "import ast; ast.parse(open(r'C:\...\Seep\Tool\mcp\seep_mcp_server.py',encoding='utf-8').read())"
# 3. 知识库在位
(Get-ChildItem "C:\...\Seep\Tool\mcp\Tool\reverselab\kb" -Recurse -Filter *.md).Count # 期望 ≥289
```
---
## 六、工具 → MCP 依赖对照(排障用)
| MCP 工具 | 依赖的目录 / 工具 | 缺失时的现象 |
| :--- | :--- | :--- |
| `seep_kb_*`(4 个) | `Tool/mcp/Tool/reverselab/kb/` | 检索返回空 / 报路径不存在 |
| `seep_r2_*`(8 个) | `Tool/mcp/Tool/safe/radare2/bin/` | "radare2 not found" |
| `seep_apk_decompile` | `Tool/mcp/Tool/safe/jadx/bin/` | "jadx not found" |
| `seep_apk_unpack` | `Tool/mcp/Tool/safe/apktool/` | "apktool not found" |
| `seep_apk_gen_hook` | `Tool/mcp/Tool/safe/hook-mcp/templates/` | 模板缺失 |
| `mcp_ida_*`(~243 个) | 自备 IDA Pro + `Tool/mcp/Tool/safe/ida-pro-mcp/` | "IDA not available" |
| playwright 工具 | npx + token | 浏览器不可用 |
**排障口诀**:工具报错 → 看它读哪个目录 → 检查该目录是否存在且非空。
---
## 七、IDA Pro 不可用时的降级路线
> **原则**:不阻塞、不报错,直接用 `seep_r2_*` 继续推进。
| 需求 | seep MCP 替代 |
| :--- | :--- |
| 架构 / 壳 / 熵 / 字符串 | `seep_r2_info` · `seep_r2_strings` |
| 反汇编 + 交叉引用 | `seep_r2_disasm` · `seep_r2_functions` |
| 类 C 伪代码 | `seep_r2_decompile` |
| 二进制差分 | `seep_r2_diff` |
| 汇编 ↔ 机器码 | `seep_r2_asm` |
报告中应标注:**"未使用 IDA 反编译器,伪代码质量受限"**。
详见 `MANUAL/IDA-PRO.md`(含 3 种方案对比)。
---
## 八、可选注册的 MCP(默认关闭)
`reverselab` 自带 3 个 MCP,源码在 `Tool/mcp/Tool/reverselab/tools/skills/mcp/`,
**默认不注册**。需要时手工加入 `mcp.json`:
| MCP | 位置 | 用途 |
| :--- | :--- | :--- |
| **ReverseLabToolsMCP** | `.../mcp/ReverseLabToolsMCP/` | reverselab 主 MCP(150+ 工具) |
| **JSHookLocal** | `.../mcp/JSHookLocal/` | JS Hook 本地服务 |
| **GhidraMCP** | `.../mcp/GhidraMCP/` | Ghidra 桥接 |
**注册示例**:
```json
"reverselab": {
"command": "python",
"args": ["<本包路径>\\Tool\\mcp\\Tool\\reverselab\\tools\\skills\\mcp\\ReverseLabToolsMCP\\reverse_lab_tools_mcp.py"],
"cwd": "<本包路径>\\Tool\\mcp\\Tool\\reverselab",
"transport": "stdio"
}
```
> ⚠️ 需先装其 Python 依赖(见该目录 `requirements.txt`)。
---
## 九、常见问题
| 问题 | 处理 |
| :--- | :--- |
| pi 启动后 MCP 没加载 | **重启 pi**(MCP 在启动时注册) |
| `seep` 工具全部不可用 | 检查 `mcp.json` 的 `seep.args[0]` 路径是否存在 |
| `seep_kb_*` 报错 | 检查 `Tool/mcp/Tool/reverselab/kb/` 是否 ≥289 篇 |
| `seep_r2_*` 报错 | 重跑 `setup\install-tools.ps1` |
| `ida` 工具报错 | 确认 IDA 已装 + `mcp.json` 里 ida 路径正确 |
| MCP 配置文件被我改坏了 | 重跑 `setup\install-pi.ps1`(会自动备份旧配置) |
| 想看 MCP 报错日志 | pi 启动时的 stderr;或手工 `python Tool\mcp\seep_mcp_server.py` 看输出 |
---
## 十、手工验证 seep MCP(不通过 pi)
```powershell
cd Desktop\Seep\Tool\mcp
python seep_mcp_server.py
# 正常应挂起等待 stdio 输入(无报错即 OK)
# Ctrl+C 退出
```
若报 `ModuleNotFoundError: mcp` → 重跑 `setup\install-python.ps1`。