🚀 GhidrAssistMCP
GhidrAssistMCP 是一款强大的 Ghidra 扩展程序,它提供了一个 MCP(模型上下文协议)服务器,允许 AI 助手和其他工具通过标准化 API 与 Ghidra 的逆向工程功能进行交互。
🚀 快速开始
GhidrAssistMCP 架起了人工智能分析工具与 Ghidra 全面逆向工程平台之间的桥梁。通过实现模型上下文协议(MCP),该扩展程序允许外部 AI 助手、自动化分析工具和自定义脚本与 Ghidra 的分析功能进行无缝交互。
✨ 主要特性
- MCP 服务器集成:使用官方 SDK 完整实现模型上下文协议(MCP)服务器。
- 31 个内置工具:涵盖函数、数据、交叉引用等方面的综合分析工具集。
- 可配置的用户界面:易于使用的界面,用于管理工具和监控活动。
- 实时日志记录:通过详细的日志记录跟踪所有 MCP 请求和响应。
- 动态工具管理:可单独启用/禁用工具,并持久保存设置。
- 当前上下文感知:工具能够理解 Ghidra 的当前光标位置和活动函数。
📦 安装指南
前提条件
- Ghidra 11.4 及以上版本(已在 Ghidra 11.4 公开版上进行测试)
- 一个 MCP 客户端(如 GhidrAssist)
二进制版本发布(推荐)
- 下载最新版本:
- 访问 发布页面
- 下载最新的
.zip
文件(例如,GhidrAssistMCP - v1.0.0.zip
)
- 安装扩展程序:
- 在 Ghidra 中:文件 → 安装扩展程序 → 添加扩展程序
- 选择下载的 ZIP 文件
- 提示时重启 Ghidra
- 启用插件:
- 文件 → 配置 → 配置插件
- 搜索 “GhidrAssistMCP”
- 勾选复选框以启用插件
从源代码构建
- 克隆仓库:
git clone <repository - url>
cd GhidrAssistMCP
- 设置 Ghidra 安装路径:
export GHIDRA_INSTALL_DIR=/path/to/your/ghidra/installation
- 构建扩展程序:
gradle buildExtension
- 安装扩展程序:
- 从
dist/
目录复制生成的 ZIP 文件
- 在 Ghidra 中:文件 → 安装扩展程序 → 添加扩展程序
- 选择 ZIP 文件并重启 Ghidra
- 启用插件:
- 文件 → 配置 → 配置插件
- 搜索 “GhidrAssistMCP”
- 勾选复选框以启用插件
💻 使用示例
基础用法
基本程序信息
{
"method": "tools/call",
"params": {
"name": "get_program_info"
}
}
函数分析
{
"method": "tools/call",
"params": {
"name": "get_function_info",
"arguments": {
"function_name": "main"
}
}
}
反编译
{
"method": "tools/call",
"params": {
"name": "decompile_function",
"arguments": {
"function_name": "encrypt_data"
}
}
}
结构创建
{
"method": "tools/call",
"params": {
"name": "auto_create_struct",
"arguments": {
"function_identifier": "0x00401000",
"variable_name": "ctx"
}
}
}
设置函数原型
{
"method": "tools/call",
"params": {
"name": "set_function_prototype",
"arguments": {
"function_address": "0x00401000",
"prototype": "int main(int argc, char** argv)"
}
}
}
📚 详细文档
配置
初始设置
- 打开控制面板:
- 窗口 → GhidrAssistMCP(或使用工具栏图标)
- 配置服务器设置:
- 主机:默认为
localhost
- 端口:默认为
8080
- 启用/禁用:切换 MCP 服务器的开启/关闭状态
工具管理
配置选项卡允许您:
- 查看所有可用工具(共 31 个)
- 使用复选框启用/禁用单个工具
- 保存配置以在会话间持久保存
- 实时监控工具状态
可用工具
程序分析
get_program_info
- 获取基本程序信息
list_functions
- 列出程序中的所有函数
list_data
- 列出数据定义
list_strings
- 列出字符串引用
list_imports
- 列出导入的函数
list_exports
- 列出导出的函数
list_segments
- 列出内存段
list_namespaces
- 列出命名空间
list_classes
- 列出类定义
list_methods
- 列出方法定义
函数分析
get_function_info
- 获取详细的函数信息
get_class_info
- 获取详细的类信息
get_function_by_address
- 查找特定地址的函数
get_current_function
- 获取光标位置的函数
decompile_function
- 将函数反编译为类似 C 的代码
disassemble_function
- 获取汇编反汇编代码
search_functions
- 按名称模式搜索函数
search_classes
- 按名称模式搜索类
function_xrefs
- 获取函数交叉引用
位置与导航
get_current_address
- 获取当前光标地址
xrefs_to
- 查找对某个地址的引用
xrefs_from
- 查找从某个地址发出的引用
修改工具
rename_function
- 重命名函数
rename_function_by_address
- 重命名特定地址的函数
rename_variable
- 重命名变量
rename_data
- 重命名数据定义
set_function_prototype
- 设置函数签名
set_local_variable_type
- 设置变量数据类型
set_disassembly_comment
- 添加反汇编注释
set_decompiler_comment
- 添加反编译器注释
高级分析
auto_create_struct
- 根据变量使用模式自动创建结构
架构
核心组件
GhidrAssistMCP/
├── GhidrAssistMCPPlugin # 主插件入口点
├── GhidrAssistMCPServer # HTTP/SSE MCP 服务器
├── GhidrAssistMCPBackend # 工具管理和执行
├── GhidrAssistMCPProvider # UI 组件提供程序
└── tools/ # 单个 MCP 工具
├── Analysis Tools/
├── Modification Tools/
└── Navigation Tools/
MCP 协议实现
- 传输:使用服务器发送事件(SSE)的 HTTP
- 端点:
GET /sse
- 用于双向通信的 SSE 连接
POST /message
- 消息交换端点
- 工具注册:动态工具发现和注册
- 会话管理:具有适当生命周期管理的有状态会话
插件架构
- 观察者模式:使用事件监听器实现解耦的 UI 更新
- 事务管理:支持回滚的安全数据库操作
- 工具注册表:具有启用/禁用功能的动态工具注册
- 设置持久化:配置保存到 Ghidra 的设置系统中
- 线程安全:对 UI 操作进行适当的 Swing EDT 处理
开发
项目结构
src/main/java/ghidrassistmcp/
├── GhidrAssistMCPPlugin.java # 主插件类
├── GhidrAssistMCPProvider.java # 带有选项卡的 UI 提供程序
├── GhidrAssistMCPServer.java # MCP 服务器实现
├── GhidrAssistMCPBackend.java # 后端工具管理
├── McpBackend.java # 后端接口
├── McpTool.java # 工具接口
├── McpEventListener.java # 事件通知接口
└── tools/ # 工具实现
├── ProgramInfoTool.java
├── ListFunctionsTool.java
├── DecompileFunctionTool.java
├── AutoCreateStructTool.java
└── ... (共 29 个工具)
添加新工具
- 实现 McpTool 接口:
public class MyCustomTool implements McpTool {
@Override
public String getName() { return "my_custom_tool"; }
@Override
public String getDescription() { return "Description"; }
@Override
public McpSchema.JsonSchema getInputSchema() { }
@Override
public McpSchema.CallToolResult execute(Map<String, Object> arguments, Program program) {
}
}
- 在后端注册:
registerTool(new MyCustomTool());
构建命令
gradle clean
gradle buildExtension
gradle -PGHIDRA_INSTALL_DIR=/path/to/ghidra buildExtension
gradle buildExtension --debug
依赖项
- MCP SDK:
io.modelcontextprotocol.sdk:mcp:0.10.0
- Jetty 服务器:
11.0.20
(HTTP/SSE 传输)
- Jackson:
2.17.0
(JSON 处理)
- Ghidra API:随 Ghidra 安装包捆绑
日志记录
UI 日志记录
日志 选项卡提供实时监控:
- 会话事件:服务器启动/停止、程序更改
- 工具请求:
REQ: tool_name {parameters...}
- 工具响应:
RES: tool_name {response...}
- 错误消息:失败的操作和诊断信息
控制台日志记录
Ghidra 控制台中的详细日志记录:
- 工具注册和初始化
- MCP 服务器生命周期事件
- 数据库事务操作
- 错误堆栈跟踪和调试信息
故障排除
常见问题
服务器无法启动
- 检查端口 8080 是否可用
- 验证 Ghidra 安装路径
- 检查控制台日志中的错误信息
工具未显示
- 确保插件已启用
- 检查配置选项卡中的工具状态
- 在日志中验证后端初始化情况
MCP 客户端连接问题
- 确认服务器正在运行(检查 GhidrAssistMCP 窗口)
- 测试连接:
curl http://localhost:8080/sse
- 检查防火墙设置
工具执行失败
- 验证程序是否已在 Ghidra 中加载
- 检查工具参数是否正确
- 查看日志选项卡中的错误消息
调试模式
通过在 Ghidra 启动时添加以下内容启用调试日志记录:
-Dlog4j.logger.ghidrassistmcp=DEBUG
贡献
- 分叉仓库
- 创建功能分支:
git checkout -b feature - name
- 进行更改 并进行适当的测试
- 遵循代码风格:使用现有的模式和约定
- 提交拉取请求 并提供详细描述
代码标准
- 适当使用 Java 21+ 特性
- 正确的异常处理 并提供有意义的消息
- 所有数据库操作的事务安全
- UI 操作的线程安全
- 公共 API 的全面文档
📄 许可证
本项目采用 MIT 许可证 - 详情请参阅 LICENSE 文件。
致谢
- NSA/Ghidra 团队 提供了出色的逆向工程平台
- Anthropic 提供了模型上下文协议规范
有问题或疑问?
请在项目仓库中创建一个问题,用于报告错误、提出功能请求或询问使用和开发相关的问题。