逆向工程AI辅助工具

GhidraMCP是一个Ghidra扩展,通过Model Context Protocol (MCP)向AI助手提供70种逆向工程工具,支持反编译、符号重命名、代码注释、漏洞搜索等功能。

  • by 13bm
  • Java
  • 本地部署
  • 149 星标
  • 更新于
在 GitHub 查看 13bm/GhidraMCP

使用说明

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版本发布时的自动发布

快速开始

先决条件

安装

  1. 从下载最新版本的ZIP 发布
  2. 在Ghidra: 文件>安装扩展>“+”>选择ZIP
  3. 重新启动Ghidra

启用

  1. 打开一个项目和一个程序(二进制)
  2. 文件>配置>GhidraMCP--检查MCPServerPlugin
  3. 插件自动启动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身份验证

  1. 打开 MCP>设置 然后单击 生成 创建随机密钥(或键入自己的密钥)
  2. 单击“确定”保存——网桥在下次启动时自动拾取密钥
  3. 在连接时,网桥发送 authenticate 在任何其他呼叫之前使用密钥请求
  4. 服务器拒绝所有非身份验证请求,直到身份验证成功
  5. 之后 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客户端在其他地方运行时,这很有用。

  1. 打开 MCP>设置
  2. 取消选中 仅限本地主机 接受远程连接
  3. 点击 生成 创建API密钥(始终使用一个用于远程访问)
  4. 单击“确定”并重新启动服务器

在远程计算机上,配置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 --触发推送/PR master 以及标签上。运行Go测试,交叉编译4个平台的桥,在Xvfb下运行Java单元+Ghidra集成测试,构建扩展ZIP,并在 v* 标签。
  • check-ghidra-release.yml --每天跑步。检测新的Ghidra版本,打开版本升级PR,通过GitHub App自动批准,如果所有测试都通过,则自动合并。

贡献

欢迎投稿!请打开问题或提交pull请求。

  1. 分叉存储库
  2. 创建要素分支: git checkout -b feature/my-feature
  3. 提交您的更改
  4. 推送并打开拉取请求

许可证

Apache许可证2.0

致谢


GhidraMCP不隶属于国家安全局或Ghidra项目,也不受其认可。