内容
# KGhidraMCP
KGhidraMCP 是一个直接嵌入到 Ghidra 插件中的模型上下文协议(MCP)服务器,允许大型语言模型(LLM)自主地逆向工程应用程序。它通过原生 Kotlin 实现,暴露了 Ghidra 核心功能的许多工具给 MCP 客户端。
## 架构
这是一个 **原生 Kotlin 实现**,它直接在 Ghidra 插件中嵌入了一个 MCP 服务器,消除了对外部 Python 桥梁的需求。
```mermaid
graph TD
A[MCP 客户端<br/>Claude Desktop, Cline, Roo 等] -->|MCP 协议通过 SSE| B[Kotlin MCP 服务器<br/>嵌入到 Ghidra 插件中]
B -->|直接 API 调用| C[Ghidra 分析引擎]
```
### 关键优势
- ✅ **单一工件**:无 Python 依赖,只需 Ghidra 插件
- ✅ **原生 MCP 协议**:使用官方 Kotlin SDK 的直接实现
- ✅ **更好的性能**:无 HTTP → Python → MCP 翻译开销
- ✅ **类型安全**:Kotlin 类型系统 + MCP 模式验证
- ✅ **SSE 原生**:通过 Ktor 内置流媒体支持
- ✅ **更容易部署**:安装插件,配置端口,完成
## 功能
- 在 Ghidra 中反编译和分析二进制文件
- 自动重命名方法、变量和数据
- 列出方法、类、导入、导出和字符串
- 按名称搜索函数
- 添加注释和设置函数签名
- 导航交叉引用
- 所有工具都支持大型数据集的分页
## 可用工具
插件暴露了 **29 个 MCP 工具**,组织成以下类别:
### 反编译工具(6 个工具)
- **get_function_by_address** - 按地址获取函数信息
- **get_current_function** - 获取光标处的函数
- **decompile_function** - 按名称反编译
- **decompile_function_by_address** - 按地址反编译
- **disassemble_function** - 获取汇编列表
- **list_functions** - 列出所有函数
### 列表工具(8 个工具)
- **list_methods** - 列出函数名称(分页)
- **list_classes** - 列出类/命名空间名称(分页)
- **list_segments** - 列出内存段(分页)
- **list_imports** - 列出导入符号(分页)
- **list_exports** - 列出导出符号(分页)
- **list_namespaces** - 列出命名空间(分页)
- **list_data_items** - 列出定义的数据(分页)
- **list_strings** - 列出字符串(分页,支持筛选)
### 搜索工具(1 个工具)
- **search_functions_by_name** - 按子字符串搜索函数
### 修改工具(4 个工具)
- **rename_function** - 按名称重命名函数
- **rename_function_by_address** - 按地址重命名函数
- **rename_variable** - 重命名局部变量
- **rename_data** - 重命名数据标签
### 注释工具(4 个工具)
- **set_decompiler_comment** - 添加反编译器注释
- **set_disassembly_comment** - 添加反汇编注释
- **set_function_prototype** - 设置函数签名
- **set_local_variable_type** - 设置变量类型
### 导航工具(6 个工具)
- **get_current_address** - 获取光标地址
- **get_current_function_info** - 获取光标位置的函数信息
- **get_xrefs_to** - 获取到地址的引用(分页)
- **get_xrefs_from** - 获取从地址的引用(分页)
- **get_function_xrefs** - 获取函数的引用(分页)
- **get_caller_functions** - 获取函数的调用者(分页)
## 安装
### 先决条件
- [Ghidra](https://ghidra-sre.org) 11.0 或更高版本
- Java 17 或更高版本
### 安装插件
1. 下载最新版本或从源代码构建
2. 运行 Ghidra
3. 选择 `文件` → `安装扩展`
4. 点击 `+` 按钮
5. 选择 `KGhidraMCP.zip` 文件
6. 重启 Ghidra
7. 在代码浏览器工具中,前往 `文件` → `配置...`
8. 在“杂项”下,勾选“KGhidraMCPPlugin”复选框
9. 点击“确定”
### 配置插件
可以通过 Ghidra 的工具选项配置插件:
1. 前往 `编辑` → `工具选项`
2. 导航到 `KGhidraMCP 服务器`
3. 配置:
- **服务器端口**:MCP 服务器的端口(默认值:3001)
- **自动启动服务器**:插件加载时启动服务器(默认值:true)
**注意**:端口更改需要重新加载插件或重启 Ghidra。
## MCP 客户端配置
MCP 服务器默认在 `http://localhost:3001/` 运行(可在 Ghidra 中配置)。服务器仅使用 **服务器发送事件(SSE)** 传输。
### Claude Desktop
添加到您的 Claude Desktop 配置文件(`claude_desktop_config.json`):
```json
{
"mcpServers": {
"ghidra": {
"type": "sse",
"url": "http://localhost:3001/"
}
}
}
```
配置文件位置:
- **macOS**:`~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**:`%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**:`~/.config/Claude/claude_desktop_config.json`
### Cline(VS Code)
使用 [Cline](https://cline.bot) 配置 KGhidraMCP:
1. 打开 Cline 并在顶部选择 `MCP 服务器`
2. 选择 `远程服务器` 并添加:
- **服务器名称**:KGhidraMCP
- **服务器网址**:`http://localhost:3001/`
或者,在 `cline_mcp_settings.json` 中手动配置:
```json
{
"mcpServers": {
"ghidra": {
"type": "sse",
"url": "http://localhost:3001/"
}
}
}
```
### Roo 代码(VS Code)
使用 Roo 代码配置 KGhidraMCP,请在 `.roo/mcp.json` 中添加:
```json
{
"mcpServers": {
"ghidra": {
"type": "sse",
"url": "http://localhost:3001/"
}
}
}
```
### ChatGPT(OpenAI)
使用 ChatGPT 配置 KGhidraMCP(需要 Pro、Team 或 Enterprise 计划):
1. 在 ChatGPT 中启用 **开发者模式**:
- 前往设置 → 连接器 → 高级 → 开发者模式
2. 添加自定义 MCP 连接器:
- 点击“创建”或“添加连接器”
- 将 SSE 网址设置为:`http://localhost:3001/`
- 配置任何所需的身份验证(如果适用)
**注意**:开发者模式是一项测试功能。请确保您的 ChatGPT 计划支持自定义连接器。
### VS Code Copilot
在 VS Code 中使用 GitHub Copilot 配置 KGhidraMCP:
1. 打开 VS Code 设置(JSON 格式)
2. 添加以下 MCP 服务器配置:
```json
{
"github.copilot.chat.mcp.servers": {
"ghidra": {
"type": "sse",
"url": "http://localhost:3001/"
}
}
}
```
或者,通过工作区或用户设置目录中的 `mcp.json` 进行配置。
### 其他 MCP 客户端
对于任何支持 SSE 连接的 MCP 客户端,请使用以下端点:
```
http://localhost:3001/
```
服务器仅使用 **SSE(服务器发送事件)** 传输。确保您的 MCP 客户端支持 SSE 远程服务器。
## 使用示例
### 与 Claude Desktop 配合使用
配置完成后,您可以通过 Claude 与 Ghidra 交互:
```
您: “反编译地址 0x1400010a0 处的函数”
Claude: [使用 decompile_function_by_address 工具]
以下是反编译的代码:
...
```
```
您: “查找名称中包含 'encrypt' 的所有函数”
Claude: [使用 search_functions_by_name 工具]
找到 3 个函数:
- encrypt_data at 0x14000a120
- decrypt_data at 0x14000a340
- init_encryption at 0x14000a560
```
```
您: “将地址 0x1400010a0 处的函数重命名为 process_input”
Claude: [使用 rename_function_by_address 工具]
成功将函数重命名为 'process_input'
```
## 从源代码构建
### 先决条件
- Java 17 或更高版本
- Gradle 8.x 或更高版本
- Ghidra 11.0 或更高版本
- `GHIDRA_INSTALL_DIR` 环境变量设置为您的 Ghidra 安装目录
### 构建步骤
1. 设置 `GHIDRA_INSTALL_DIR` 环境变量:
```bash
export GHIDRA_INSTALL_DIR=/path/to/ghidra
```
2. 构建扩展:
```bash
gradle clean packageExtension
```
3. 可安装的扩展将创建在:
```
dist/KGhidraMCP.zip
```
### 使用 NixOS/devenv
如果您正在使用提供的 devenv 环境:
```bash
# 进入 devenv shell
devenv shell
# 构建扩展
gradle clean packageExtension
```
## 技术细节
### 技术栈
- **语言**:Kotlin 2.1.0
- **MCP SDK**:官方 Kotlin SDK 0.5.0
- **服务器**:Ktor 3.0.0(Netty + SSE)
- **序列化**:kotlinx.serialization 1.6.2
- **异步**:kotlinx.coroutines 1.7.3
### 线程安全
所有 Ghidra API 调用都通过 `GhidraContext` 包装器自动封送到 Swing 事件调度线程(EDT),确保线程安全。
### 错误处理
所有工具都遵循一致的错误处理:
- 捕获异常并返回结构化错误响应
- 触发清晰的错误消息以处理缺失的参数
- 以优雅的方式处理无效地址或不存在的函数
### 分页
返回大型数据集的工具通过 `offset` 和 `limit` 参数支持分页:
- 默认 `offset`:0
- 默认 `limit`:100
- 最大 `limit`:用户可定义每个查询
## 致谢
- 灵感来自 [@LaurieWired](https://github.com/LaurieWired) 的原始 [GhidraMCP](https://github.com/LaurieWired/GhidraMCP)