使用说明
GhidraMCP
Ghidra扩展通过 模型上下文协议(MCP).在Ghidra中打开二进制文件,启用插件,让Claude(或任何MCP客户端)反编译函数、重命名符号、注释代码、搜索漏洞等。
建筑
AI Client (Claude Desktop / CLI)
| stdio + MCP JSON-RPC
v
Go MCP Bridge (mcp_bridge)
| TCP, length-prefixed JSON-RPC
v
Ghidra Plugin (MCPServerPlugin)
|
v
Ghidra Program API
这 Ghidra插件 (Java)在Ghidra中启动TCP服务器并自动启动 去桥 二元的。该网桥通过stdio向AI客户端发送MCP,并通过具有4字节长度前缀JSON-RPC帧的本地TCP套接字将调用转发给Java插件。可选的API-key身份验证可保护TCP通道。
特性
- 70个MCP工具 跨越查询、变异、分析、恶意软件分类、物联网/嵌入式安全、结构管理、异步反编译和多实例支持
- 易于设置 --插件自动启动网桥;使用 MCP>设置>写入Claude配置 配置MCP客户端
- 跨平台 --为Linux x86_64、Windows x86_64macOS x86_64.和macOS ARM64预构建的桥接二进制文件
- 可配置的 --端口,localhost-only绑定,API-key身份验证,自动启动,通过启用/禁用桥接
GhidraMCP.properties - 多实例 --使用以下命令同时处理多个Ghidra窗口
target_port路由工具调用 - 异步反编译 --无阻塞地反编译大型函数;稍后对结果进行投票
- 连接重试 --如果Ghidra重新启动或连接中断,网桥会自动重新连接
- 分页 --支持大型结果集(函数、字符串、导入等)
offset/limit用于安全增量检索 - CI/CD --自动构建、Go+Java测试、Ghidra集成测试,以及新Ghidra版本发布时的自动发布
快速开始
先决条件
安装
- 从下载最新版本的ZIP 发布
- 在Ghidra: 文件>安装扩展>“+”>选择ZIP
- 重新启动Ghidra
启用
- 打开一个项目和一个程序(二进制)
- 文件>配置>GhidraMCP--检查MCPServerPlugin
- 插件自动启动TCP服务器(默认
localhost:8765)并启动大桥
要配置Claude Desktop,请打开 MCP>设置 然后单击 写信给Claude Config。对于其他MCP客户端,请单击 复制到剪贴板 并将其添加到您的客户端配置中:
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "localhost", "--port", "8765"]
}
}
}
如果您有一个API密钥集,请将其包含在 env block(插件会自动执行此操作):
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "localhost", "--port", "8765"],
"env": {
"GHIDRA_API_KEY": "your-key-here"
}
}
}
}
您还可以从Ghidra中获取代码片段: MCP>复制MCP配置 (将其复制到剪贴板)。
工具
参数、类型和示例的完整参考: TOOLS.md
下表给出了快速概述。看 TOOLS.md 查看详细的参数文档。
查询(1-21)
| 工具 | 说明 |
|---|---|
list_functions |
列出所有具有入口点、大小、返回类型的函数 |
list_classes |
列出所有类/命名空间 |
list_imports |
列出导入的符号和外部依赖项 |
list_exports |
列出导出的符号 |
list_namespaces |
列出所有命名空间 |
list_data_items |
列出定义的数据(全局变量、常量、数组、结构) |
list_strings |
列出带有可选子字符串过滤器的字符串 |
search_functions_by_name |
按名称子字符串搜索函数 |
get_function_by_address |
地址处函数的详细信息 |
get_current_address |
Ghidra当前选定的地址 |
get_current_function |
当前光标位置的功能 |
decompile_function |
按名称分解为C伪代码 |
decompile_function_by_address |
按地址分解为C伪代码 |
disassemble_function |
函数的原始拆卸列表 |
get_xrefs_to |
交叉引用地址 |
get_xrefs_from |
地址的交叉引用 |
get_function_xrefs |
函数的所有外部参照(调用者+被调用者) |
get_program_info |
程序元数据(arch、编译器、格式等) |
get_memory_map |
具有段权限的内存布局 |
get_variables |
函数的参数和局部值 |
突变(22-38)
| 工具 | 说明 |
|---|---|
rename_function |
按名称重命名函数 |
rename_function_by_address |
按地址重命名函数 |
rename_data |
重命名数据标签 |
rename_variable |
重命名局部变量 |
set_decompiler_comment |
设置反编译器视图注释 |
set_disassembly_comment |
设置拆卸视图注释 |
set_function_prototype |
设置全功能原型 |
set_local_variable_type |
更改变量的数据类型 |
set_bookmark |
添加书签 |
remove_bookmark |
删除书签 |
set_equate |
在标量操作数上设置命名常量 |
create_structure |
创建结构数据类型 |
create_enum |
创建枚举数据类型 |
apply_data_type |
在地址处应用数据类型 |
set_namespace |
为函数设置命名空间或类 |
set_calling_convention |
设置函数的调用约定 |
set_image_base |
设置图像基址 |
set_memory_permissions |
修改内存块权限 |
高级分析(39-45)
| 工具 | 说明 |
|---|---|
patch_bytes |
修补地址处的原始字节 |
get_basic_blocks |
获取函数的基本块 |
extract_api_call_sequences |
提取API调用序列以进行安全分析 |
identify_user_input_sources |
查找用户输入入口点 |
generate_call_graph |
层次调用图 |
identify_crypto_patterns |
检测加密实现 |
find_obfuscated_strings |
查找混淆的字符串 |
恶意软件分析(46-53)
| 工具 | 说明 |
|---|---|
search_bytes |
搜索字节模式 |
emulate_function |
模拟一个函数 |
extract_iocs |
提取妥协指标 |
find_dynamic_api_resolution |
检测动态API分辨率 |
detect_anti_analysis |
检测反分析技术 |
add_external_function |
添加外部函数引用 |
get_pe_info |
PE标头详细信息 |
get_elf_info |
ELF标头详细信息 |
物联网/嵌入式安全(54-59)
| 工具 | 说明 |
|---|---|
create_memory_block |
创建内存块 |
detect_security_mitigations |
检测二进制安全缓解措施 |
find_format_string_vulns |
查找格式字符串漏洞 |
find_rop_gadgets |
查找ROP小工具 |
detect_control_flow_flattening |
检测控制流变平 |
mark_code_coverage |
标记代码覆盖区域 |
公用事业(60-62)
| 工具 | 说明 |
|---|---|
get_bookmarks |
列出书签(可选按地址) |
list_equates |
列出所有等效项 |
ping |
健康检查连接 |
多实例(63)
| 工具 | 说明 |
|---|---|
list_ghidra_instances |
扫描端口8765-8774以运行Ghidra实例 |
所有工具都接受可选 target_port 参数,用于将调用路由到特定的Ghidra实例。这使您可以同时处理在单独的Ghidra窗口中打开的多个二进制文件。
结构管理(64-68)
| 工具 | 说明 |
|---|---|
get_structure |
获取结构的完整细节(字段、偏移、类型) |
list_structures |
列出所有已定义的带分页的结构 |
edit_structure |
在结构中添加、插入、删除、替换或清除字段 |
rename_structure |
重命名现有结构 |
delete_structure |
删除结构数据类型 |
异步反编译(69-70)
| 工具 | 说明 |
|---|---|
decompile_function_async |
启动大型函数的异步反编译(返回任务ID) |
get_decompile_result |
按任务ID轮询异步反编译结果 |
异步反编译对于可能需要30多秒才能反编译的大型函数非常有用。客户端可以启动反编译,继续其他工作,并在以后轮询结果。
配置
该插件将设置存储在 GhidraMCP.properties 在Ghidra的用户设置目录中:
| 属性 | 默认值 | 描述 |
|---|---|---|
port |
8765 |
Java服务器的TCP端口 |
localhost_only |
true |
仅绑定到本地主机 |
api_key |
(空) | 网桥身份验证的共享密钥 |
auto_start |
true |
加载插件时启动服务器 |
bridge_enabled |
true |
自动启动Go桥二进制文件 |
设置对话框
打开 MCP>设置 在Ghidra菜单中,通过GUI配置所有属性。该对话框包括:
- 已启用端口、本地主机绑定、API密钥、自动启动和桥接的可编辑字段
- 生成 按钮,用于创建加密随机32个字符的API密钥
- 写信给Claude Config 将GhidraMCP合并到Claude Desktop的按钮
claude_desktop_config.json - 复制到剪贴板 按钮,用于复制MCP配置JSON代码段以进行手动设置
- 如果在没有API密钥的情况下启用远程访问,则会发出安全警告
- 保存时,如果服务器正在运行,则会自动重新启动提示
单击“确定”时,更改将保存到磁盘。您还可以直接在对话框中显示的路径上编辑属性文件。
如果 auto_start 是 false,从手动启动服务器 MCP>切换服务器 在Ghidra菜单中。
注: 这
bridge_enabled该设置适用于高级用例——开发人员调试桥接二进制文件,或者用户使用自定义MCP客户端直接与Java服务器进行TCP通信。大多数用户应该启用它。
安全
默认情况下,TCP服务器绑定到 仅限本地主机 并且已经 没有API密钥,这对于本地单用户使用来说很好。对于更严格的设置:
API-Key身份验证
- 打开 MCP>设置 然后单击 生成 创建随机密钥(或键入自己的密钥)
- 单击“确定”保存——网桥在下次启动时自动拾取密钥
- 在连接时,网桥发送
authenticate在任何其他呼叫之前使用密钥请求 - 服务器拒绝所有非身份验证请求,直到身份验证成功
- 之后 3次失败的尝试 服务器终止连接
API密钥通过 GHIDRA_API_KEY 环境变量(不是CLI标志),以防止它在进程参数列表中泄漏。手动运行网桥时,设置环境变量:
# Linux/macOS
export GHIDRA_API_KEY="your-key-here"
./mcp_bridge --host localhost --port 8765
# Windows (PowerShell)
$env:GHIDRA_API_KEY = "your-key-here"
.\mcp_bridge.exe --host localhost --port 8765
当设置了API密钥时 写信给Claude Config 和 复制到剪贴板 “设置”对话框中的按钮包括 env 自动封锁。
本地主机绑定
随着 localhost_only=true (默认),服务器只接受来自的连接 127.0.0.1。设置为 false 如果你需要远程访问(例如,无头服务器上的Ghidra),但是 始终使用API密钥 在本地主机之外暴露端口时。
远程/无头设置
GhidraMCP可以为运行在不同机器上的AI客户端提供服务。当Ghidra在无头分析服务器上运行,而AI客户端在其他地方运行时,这很有用。
- 打开 MCP>设置
- 取消选中 仅限本地主机 接受远程连接
- 点击 生成 创建API密钥(始终使用一个用于远程访问)
- 单击“确定”并重新启动服务器
在远程计算机上,配置MCP客户端以指向Ghidra主机:
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "ghidra-server.local", "--port", "8765"],
"env": {
"GHIDRA_API_KEY": "your-key-here"
}
}
}
}
警告: 在本地主机之外公开服务器时,请始终使用API密钥。在没有身份验证的情况下,任何可以访问该端口的人都可以完全访问Ghidra API。
从源头构建
git clone https://github.com/13bm/GhidraMCP.git
cd GhidraMCP
建造Go桥
cd mcp-bridge
go build -o mcp_bridge .
cd ..
构建Ghidra扩展
export GHIDRA_INSTALL_DIR=/path/to/ghidra
gradle buildExtension
扩展名ZIP将位于 dist/.
运行测试
# Go tests
cd mcp-bridge && go test ./... -v && cd ..
# Java unit + integration tests (requires Xvfb on headless Linux)
xvfb-run gradle test -PGHIDRA_INSTALL_DIR=$GHIDRA_INSTALL_DIR
CI/CD
该项目使用GitHub Actions进行自动构建和发布:
build.yml--触发推送/PRmaster以及标签上。运行Go测试,交叉编译4个平台的桥,在Xvfb下运行Java单元+Ghidra集成测试,构建扩展ZIP,并在v*标签。check-ghidra-release.yml--每天跑步。检测新的Ghidra版本,打开版本升级PR,通过GitHub App自动批准,如果所有测试都通过,则自动合并。
贡献
欢迎投稿!请打开问题或提交pull请求。
- 分叉存储库
- 创建要素分支:
git checkout -b feature/my-feature - 提交您的更改
- 推送并打开拉取请求
许可证
致谢
GhidraMCP不隶属于国家安全局或Ghidra项目,也不受其认可。
