# IDA Pro MCP 工具速查

> 72 个 MCP 工具按功能分类，附常用参数和典型用法。
> 服务器名：`idapro`，工具前缀：`idapro_*`，HTTP 模式运行。

---

## 启动与会话管理

### 服务器启动

```powershell
# 启动 MCP HTTP 服务器（后台静默）
powershell -File "scripts/start.ps1"
# 输出 OK:72 表示就绪

# 打开目标文件（绕过 schema 校验）
powershell -File "scripts/open.ps1" -Path "C:\target.exe"
# 输出 OK:filename:session_id

# 大文件/GUI 程序建议加超时
powershell -File "scripts/open.ps1" -Path "C:\big.exe" -TimeoutSeconds 600

# 跳过自动分析（快速打开）
powershell -File "scripts/open.ps1" -Path "C:\huge.sys" -NoAutoAnalysis
```

### 会话工具

| 工具 | 用途 | 示例 |
|------|------|------|
| `idapro_idalib_list()` | 列出所有 session | — |
| `idapro_idalib_current()` | 当前绑定的 session | — |
| `idapro_idalib_switch(session_id)` | 切换 session | 多文件对比时 |
| `idapro_idalib_close(session_id)` | 关闭 session | 释放资源 |
| `idapro_idalib_save(path)` | 保存数据库 | 保存分析进度 |
| `idapro_idalib_health(session_id)` | 检查 worker 状态 | 排查卡死 |
| `idapro_server_health()` | 服务器健康检查 | — |
| `idapro_server_warmup()` | 预热子系统 | 首次使用前 |

---

## 第一步：全局概览

### survey_binary — 快速概况

```
idapro_survey_binary(detail_level="minimal")
```

返回：
- 架构（x86/x64/ARM/MIPS）
- 入口点
- 函数总数
- 字符串统计
- 段信息
- 导入分类（加密/网络/文件IO/注册表）
- 高 xref 热门函数

**detail_level 选项**：
- `"minimal"` — 快速概况（推荐首选）
- `"standard"` — 包含更多细节
- `"full"` — 完整信息

### 函数列表

```
# 列出所有函数（分页）
idapro_list_funcs(queries=[{"offset": 0, "limit": 50}])

# 按名称过滤
idapro_list_funcs(queries=[{"filter": "crypt", "offset": 0, "limit": 20}])
idapro_list_funcs(queries=[{"filter": "main", "offset": 0, "limit": 10}])
```

### 统一查询

```
# 查询导入函数
idapro_entity_query(kind="imports", filter="Create")

# 查询字符串
idapro_entity_query(kind="strings", filter="http")

# 查询所有命名符号
idapro_entity_query(kind="names", filter="")
```

---

## 反编译与反汇编

### 反编译（伪代码）

```
# 按函数名
idapro_decompile(addr="main")
idapro_decompile(addr="sub_140001000")

# 按地址
idapro_decompile(addr="0x140001000")
```

### 反汇编

```
# 默认指令数
idapro_disasm(addr="main")

# 指定指令数量
idapro_disasm(addr="0x401000", max_instructions=100)
```

### 综合分析（推荐）

```
# 一次性获取：伪代码 + 字符串 + 常量 + 调用者 + 被调用者 + 基本块
idapro_analyze_function(addr="main", include_asm=false)

# 包含汇编
idapro_analyze_function(addr="sub_401000", include_asm=true)
```

### 函数概要

```
# 批量获取函数指标（大小、块数、xref 数）
idapro_func_profile(queries=["main", "sub_401000", "sub_402000"])
```

---

## 交叉引用与调用图

### 谁引用了目标

```
# 查看谁调用了某函数
idapro_xrefs_to(addrs=["sub_401000"])

# 查看谁引用了某字符串/数据
idapro_xrefs_to(addrs=["0x404000"])

# 批量查询
idapro_xrefs_to(addrs=["CreateFileW", "ReadFile", "WriteFile"])
```

### 高级 xref 查询

```
# 指定方向和类型
idapro_xref_query(addr="0x401000", direction="to")    # 谁引用我
idapro_xref_query(addr="0x401000", direction="from")  # 我引用谁
```

### 被调用函数列表

```
idapro_callees(addrs=["main"])
```

### 调用图

```
# 从 main 开始，深度 3
idapro_callgraph(roots=["main"], max_depth=3)

# 多个起点
idapro_callgraph(roots=["sub_401000", "sub_402000"], max_depth=2)
```

### 数据流追踪

```
# 向后追踪：这个值从哪来
idapro_trace_data_flow(addr="0x401050", direction="backward", max_depth=5)

# 向前追踪：这个值流向哪里
idapro_trace_data_flow(addr="0x401050", direction="forward", max_depth=5)
```

---

## 搜索

### 字符串搜索（正则）

```
# 搜索 URL
idapro_find_regex(pattern="https?://", limit=20)

# 搜索文件路径
idapro_find_regex(pattern="C:\\\\", limit=20)

# 搜索错误信息
idapro_find_regex(pattern="error|fail|invalid", limit=30)

# 搜索密钥/密码相关
idapro_find_regex(pattern="key|password|secret|token", limit=20)
```

### 反汇编文本搜索

```
# 在反汇编列表中搜索
idapro_search_text(pattern="call    sub_")
idapro_search_text(pattern="xor     eax, eax")
```

### 字节模式搜索

```
# 精确字节
idapro_find_bytes(patterns=["48 8B 05"], limit=10)

# 带通配符
idapro_find_bytes(patterns=["48 89 ?? 24 ??"], limit=10)

# 多个模式
idapro_find_bytes(patterns=["CC CC CC CC", "90 90 90 90"], limit=5)
```

### 高级搜索

```
# 搜索立即数
idapro_find(type="immediate", targets=["0xDEADBEEF"])

# 搜索字符串引用
idapro_find(type="string", targets=["password"])
```

---

## 内存与数据读取

### 读原始字节

```
idapro_get_bytes(addrs=[{"addr": "0x401000", "size": 64}])
```

### 读字符串

```
idapro_get_string(addrs=["0x404000", "0x404100"])
```

### 读整数

```
idapro_get_int(queries=[{"addr": "0x405000", "size": 4}])
```

### 读全局变量

```
idapro_get_global_value(queries=["g_flag", "g_key_size"])
```

### 读结构体

```
idapro_read_struct(queries=[{"addr": "0x405000", "type": "HEADER"}])
```

### 搜索结构体

```
idapro_search_structs(filter="FILE")
```

---

## 修改操作

### 添加注释

```
# 单个注释
idapro_set_comments(items=[{"addr": "0x401000", "comment": "解密函数入口"}])

# 批量注释
idapro_set_comments(items=[
    {"addr": "0x401000", "comment": "XOR 解密循环"},
    {"addr": "0x401050", "comment": "密钥初始化"},
    {"addr": "0x4010A0", "comment": "结果校验"}
])

# 追加注释（不覆盖已有）
idapro_append_comments(items=[{"addr": "0x401000", "comment": "补充：密钥长度 16"}])
```

### 重命名

```
# 重命名函数
idapro_rename(batch={"func": [
    {"addr": "sub_401000", "name": "decrypt_payload"},
    {"addr": "sub_402000", "name": "verify_license"}
]})

# 重命名全局变量
idapro_rename(batch={"global": [
    {"addr": "0x405000", "name": "g_encryption_key"}
]})

# 重命名局部变量
idapro_rename(batch={"local": [
    {"func": "decrypt_payload", "old": "v1", "name": "plaintext_buf"}
]})
```

### Patch 汇编

```
# NOP 掉检测代码
idapro_patch_asm(items=[{"addr": "0x401050", "asm": "nop"}])

# 修改跳转
idapro_patch_asm(items=[{"addr": "0x401060", "asm": "jmp 0x401080"}])

# 强制返回 true
idapro_patch_asm(items=[
    {"addr": "0x401000", "asm": "mov eax, 1"},
    {"addr": "0x401005", "asm": "ret"}
])
```

### Patch 字节

```
# 直接写字节
idapro_patch(patches=[{"addr": "0x401050", "bytes": "9090909090"}])
```

---

## 类型系统

### 声明结构体

```
idapro_declare_type(decls=[{
    "name": "PacketHeader",
    "decl": "struct PacketHeader { uint32_t magic; uint16_t type; uint16_t length; uint8_t data[0]; };"
}])
```

### 应用类型

```
# 给函数设置原型
idapro_set_type(edits=[{
    "addr": "sub_401000",
    "type": "int __fastcall decrypt(void *buf, int size, const char *key)"
}])

# 给全局变量设置类型
idapro_set_type(edits=[{
    "addr": "0x405000",
    "type": "PacketHeader"
}])
```

### 推断类型

```
idapro_infer_types(addrs=["sub_401000", "sub_402000"])
```

### 查询/查看类型

```
idapro_type_query(queries=["Packet"])
idapro_type_inspect(queries=["PacketHeader"])
```

---

## 栈帧分析

```
# 查看函数栈帧
idapro_stack_frame(addrs=["main", "sub_401000"])

# 声明栈变量
idapro_declare_stack(items=[{
    "func": "sub_401000",
    "offset": -0x20,
    "name": "local_buf",
    "type": "char [32]"
}])
```

---

## 签名生成

```
# 为地址生成唯一字节签名
idapro_make_signature(addrs=["0x401000"])

# 为整个函数生成签名
idapro_make_signature_for_function(addrs=["decrypt_payload"])

# 为引用某地址的代码生成签名
idapro_find_xref_signatures(addrs=["0x405000"])
```

---

## 进制转换

```
# 十六进制 → 十进制
idapro_int_convert(inputs=["0x401000"])

# 十进制 → 十六进制
idapro_int_convert(inputs=["4198400"])

# 批量转换
idapro_int_convert(inputs=["0xDEAD", "0xBEEF", "12345"])
```

> ⚠️ **永远用这个工具做进制转换，不要自己算！**

---

## 导出与脚本

### 导出函数

```
# JSON 格式
idapro_export_funcs(addrs=["main", "sub_401000"], format="json")

# C 头文件
idapro_export_funcs(addrs=["main", "sub_401000"], format="c_header")

# 函数原型
idapro_export_funcs(addrs=["main", "sub_401000"], format="prototypes")
```

### 执行 Python 脚本

```
# 在 IDA 上下文中执行 Python
idapro_py_eval(code="import idautils; print(list(idautils.Functions())[:10])")

# 获取段信息
idapro_py_eval(code="import idc; print(idc.get_segm_name(0x401000))")

# 批量操作
idapro_py_eval(code="import ida_funcs; f=ida_funcs.get_func(0x401000); print(f.size())")
```

---

## 典型分析流程

### 恶意软件分析

```text
1. survey_binary → 看导入（网络API? 加密? 注册表?）
2. find_regex("http|socket|connect") → 找网络相关字符串
3. xrefs_to(网络字符串地址) → 找引用函数
4. decompile(引用函数) → 看通信逻辑
5. trace_data_flow(加密参数, "backward") → 追踪密钥来源
6. set_comments + rename → 标注发现
```

### 注册验证破解

```text
1. find_regex("serial|license|register|valid") → 找验证相关字符串
2. xrefs_to(验证字符串) → 定位验证函数
3. analyze_function(验证函数) → 理解逻辑
4. callgraph(验证函数, 2) → 看调用链
5. patch_asm(条件跳转地址, "jmp always_pass") → patch
```

### CTF 逆向

```text
1. survey_binary → 确认架构和入口
2. decompile("main") → 看主逻辑
3. find_regex("flag|correct|wrong") → 找判断点
4. trace_data_flow(判断点, "backward") → 追踪输入变换
5. 用 Python 辅助计算/解密 → 得到 flag
```

### 漏洞分析

```text
1. entity_query(kind="imports", filter="strcpy|sprintf|gets") → 找危险函数
2. xrefs_to(危险函数) → 找调用点
3. analyze_function(调用点所在函数) → 看上下文
4. stack_frame(函数) → 确认缓冲区大小
5. trace_data_flow(危险参数, "backward") → 确认用户可控
```

---

## 常见错误与解决

| 错误 | 原因 | 解决 |
|------|------|------|
| "No database bound" | 没有打开文件 | 执行 `open.ps1` |
| "Failed to open database" | 旧库被锁 | `open.ps1` 自动降级到 Temp |
| schema 校验失败 | MCP 客户端 BUG | 用 `open.ps1` 代替 `idalib_open` |
| 工具超时 | 大文件分析中 | 加 `-TimeoutSeconds 600` |
| "ERR:timeout" (start.ps1) | 服务器启动失败 | 检查 Python/idalib-mcp 安装 |
| 进制转换错误 | 手动计算出错 | 用 `idapro_int_convert` |
| 函数名找不到 | 名称不精确 | 用 `list_funcs` + filter 先搜索 |
