GhidraMCP 原理与使用部署

本文作者:杉木@涂鸦智能安全实验室

本文档汇总 GhidraMCP 的架构原理、部署方式及与本项目相关的使用实践,便于后续复现与扩展。


一、GhidraMCP 是什么

GhidraMCPLaurieWired/GhidraMCP)是一个基于 Model Context Protocol (MCP) 的 Ghidra 桥接方案,让支持 MCP 的客户端(如 Cursor、Claude Desktop、Cline)能够通过统一协议调用 Ghidra 的反编译、符号、重命名等能力,从而用自然语言或自动化脚本做逆向分析。

核心价值:

  • 在 IDE/对话中直接"问"Ghidra:列出函数、反编译、按地址/名称重命名等。
  • 可编写脚本(如从 SO 导出符号并写回 Ghidra)或由 AI 根据反编译结果做漏洞分析、生成 PoC。

二、架构与原理

2.1 整体架构

复制代码
┌─────────────────────────────────────────────────────────────────┐
│  MCP 客户端(Cursor / Claude Desktop / Cline 等)                 │
│  - 通过 stdio 或 SSE 与 MCP Server 通信                           │
│  - 展示"工具"列表并调用(如 list_methods, decompile_function)     │
└────────────────────────────┬────────────────────────────────────┘
                             │ MCP 协议 (stdio or SSE)
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  Python MCP Server(bridge_mcp_ghidra.py)                        │
│  - 使用 FastMCP 暴露一组"工具"(list_methods, decompile, rename...) │
│  - 每个工具内部通过 HTTP 请求转发到 Ghidra 端                     │
└────────────────────────────┬────────────────────────────────────┘
                             │ HTTP (默认 http://127.0.0.1:8080/)
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  Ghidra 插件(GhidraMCP Plugin,Java)                            │
│  - 在 Ghidra 进程内启动 HTTP 服务(默认 8080)                    │
│  - 提供 REST 风格接口:/methods, /decompile, /rename_function_    │
│    by_address, /segments 等                                       │
│  - 直接调用 Ghidra API 完成反编译、符号表修改等                   │
└────────────────────────────┬────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│  Ghidra 当前打开的项目 / 程序                                     │
│  - 当前激活的 Program 的符号、反编译、内存布局等                   │
└─────────────────────────────────────────────────────────────────┘

要点:

  • Ghidra 端:只负责"当前项目"的分析与数据;所有对函数、符号、反编译的读写都通过插件提供的 HTTP 接口完成。
  • 桥接端:Python 脚本不实现任何逆向逻辑,只做"协议转换":MCP 工具调用 → HTTP 请求 → Ghidra 插件 → Ghidra API。
  • 客户端:用户或 AI 在 Cursor 等环境中调用 MCP 工具,等价于对当前打开的 Ghidra 程序执行对应操作。

2.2 协议与传输

  • MCP:Model Context Protocol,定义"工具(Tools)"的命名、参数与返回格式;客户端通过 JSON-RPC 调用这些工具。
  • 传输方式
    • stdio:子进程标准输入/输出交换 JSON,适合 Cursor、Claude Desktop 等本地单进程调用。
    • SSE :桥接脚本作为 HTTP 服务暴露 /sse,客户端通过 Server-Sent Events 连接,适合 Cline 等"远程 MCP"场景。
  • Ghidra 与桥接之间 :固定为 HTTP ,默认 http://127.0.0.1:8080/,由插件在 Ghidra 内提供。

2.3 典型工具与对应 HTTP 接口

MCP 工具(示例) 作用 大致对应 HTTP 行为
list_methods / list_functions 列出函数 GET /methods 或 /list_functions
decompile_function(name) 按名称反编译 POST /decompile,body=函数名
get_function_by_address 按地址取函数信息 GET /get_function_by_address?address=
rename_function_by_address 按地址重命名函数 POST /rename_function_by_address
list_segments 列出段/内存布局 GET /segments

桥接脚本中通过 safe_get(endpoint, params)safe_post(endpoint, data) 调用上述接口,并将结果返回给 MCP 客户端。


三、部署方式

3.1 前置条件

  • 已安装 Ghidra(本文以 12.0.4 为例,路径可自定)。
  • Python 3.10+ ,并安装依赖:mcprequests(见桥接脚本内 PEP 723 或 requirements.txt)。
  • 若需从 SO 还原符号:系统具备 nm(通常来自 binutils)。

3.2 第一步:安装 Ghidra 插件

  1. GhidraMCP Releases 下载对应版本的 zip(如 GhidraMCP-1-4.zip)。
  2. 在 Ghidra 中:File → Install Extensions ,点击 +,选择该 zip。
  3. 重启 Ghidra。
  4. File → Configure → Developer 中勾选启用 GhidraMCPPlugin
  5. (可选)Edit → Tool Options → GhidraMCP HTTP Server 中修改端口,默认 8080

完成后,打开任意项目并分析,插件会在本机 8080 端口提供 HTTP 接口。

3.3 第二步:部署 Python 桥接(MCP Server)

  1. 将发布包中的 bridge_mcp_ghidra.py 放到本机某目录(如 Extensions/GhidraMCP-release-1-4/)。

  2. 安装依赖:

    bash 复制代码
    cd /path/to/GhidraMCP-release-1-4
    pip install -r requirements.txt   # 或 pip install mcp requests
  3. 本地测试桥接是否连通 Ghidra:

    bash 复制代码
    python3 bridge_mcp_ghidra.py --ghidra-server http://127.0.0.1:8080/
    # 无报错即说明参数正确;实际作为 MCP 由 Cursor 启动时不会常驻前台

3.4 第三步:配置 MCP 客户端(以 Cursor 为例)

在 Cursor 中让 MCP 使用上述桥接脚本:

  • 全局配置 :编辑 ~/.cursor/mcp.json(若不存在则新建)。
  • 项目级配置 :在项目根目录下 .cursor/mcp.json

示例内容:

json 复制代码
{
  "mcpServers": {
    "ghidra": {
      "command": "python3",
      "args": [
        "/绝对路径/bridge_mcp_ghidra.py",
        "--ghidra-server",
        "http://127.0.0.1:8080/"
      ]
    }
  }
}
  • command:本机 Python 解释器(或 python3)。
  • args:桥接脚本路径 + -ghidra-server + Ghidra HTTP 地址;若 Ghidra 改了端口,此处需一致。
  • 保存后重启 Cursor ,即可在对话或 MCP 面板中看到并调用 ghidra 的工具。

3.5 传输方式选择

  • 默认(stdio) :不写 -transport 时,Cursor 通过标准输入/输出与桥接进程通信;上述配置即 stdio 模式。

  • SSE 模式(如配合 Cline 等):

    bash 复制代码
    python3 bridge_mcp_ghidra.py --transport sse --mcp-host 127.0.0.1 --mcp-port 8081 --ghidra-server http://127.0.0.1:8080/

    客户端连接 http://127.0.0.1:8081/sse 使用 MCP。


四、与本项目相关的使用实践

4.1 SO 文件函数名还原(apply_so_symbols.py)

问题 :strip 后的 SO 在 Ghidra 中大量显示为 FUN_xxxx,仅有动态符号表(.dynsym)中的导出符号有名字。

思路 :用系统自带的 nm -D --defined-only 从 SO 中解析出"地址 + 函数名",再通过 Ghidra 的 rename_function_by_address 接口,按"当前程序基址 + 偏移"写回 Ghidra。

要点

  • 基址 :Ghidra 中 SO 的加载基址往往不是 0(如 arm64-v8a 常见为 0x100000)。脚本通过 GET /segments 取首段起始地址作为基址,再与 nm 得到的偏移相加,得到 Ghidra 内真实地址。
  • 仅能还原导出符号 :脚本只处理 nm -D 中 type 为 T/t 的符号,数量有限(例如约 110 个);其余未导出函数仍会显示为 FUN_xxx,需 FLIRT 或带符号 SO 进一步处理。

基本用法

bash 复制代码
cd /path/to/GhidraMCP-release-1-4
. .venv/bin/activate   # 若使用虚拟环境
python3 apply_so_symbols.py /path/to/libxxx.so
# 不指定 --base 时,脚本会从 Ghidra 自动读取基址

4.2 连接与连通性测试

  • Ghidra 侧:确认已打开目标程序并完成分析,GhidraMCP 插件已启用,HTTP 服务监听 8080。
  • 脚本测试 :可写简单脚本请求 http://127.0.0.1:8080/segments?offset=0&limit=1http://127.0.0.1:8080/methods,返回 200 即表示 Ghidra 端正常。
  • Cursor 侧:配置好 mcp.json 并重启后,在对话中通过 MCP 调用"列出函数""反编译某函数"等,能返回结果即表示端到端打通。

4.3 漏洞分析工作流示例

  1. 在 Ghidra 中打开目标 SO(如 libthing_security_algorithm.so),执行自动分析。
  2. 运行 apply_so_symbols.py 还原导出函数名(注意架构与基址)。
  3. 在 Cursor 中通过 MCP 或直接 HTTP 调用:
    • list_functions / list_methods 获取函数列表;
    • decompile_function(name) 或按地址反编译关键函数。
  4. 根据反编译结果做人工/脚本化漏洞分析,并编写 PoC 与修复方案(如本项目中的漏洞 1/2/3)。

五、常见问题与注意点

问题 可能原因 处理建议
函数名还原后界面上仍无变化 基址错误,符号写到了错误地址 使用脚本自动获取基址,或显式传 --base 0x100000 等正确基址
Cursor 中看不到 Ghidra 工具 mcp.json 未生效或路径错误 检查 command/args 路径,重启 Cursor,确认 MCP 配置已加载
Ghidra HTTP 请求超时/连接拒绝 插件未启用或未打开项目 确认插件已勾选、已打开并分析目标程序,端口与配置一致
大量函数仍为 FUN_xxx SO 已 strip,仅 .dynsym 有符号 属预期;可考虑 FLIRT、带符号 SO 或人工命名

六、参考与延伸


其实前面内容都是让AI生成的,在实际操作都可以让AI自己配置和操作,其中只有Ghidra中的配置需要用户自己进行配置,具体就是文档中3.2的操作流程,其他的都是AI自己配置的;

我这边测试了两个,一个是cursor(文档主要内容也是cursor生成)以VS插件的形式调用,一个是claude,以token api的形式调用;

下图左边是claude,右边是cursor,不知道是不是cursor是后台配置了主要是研发代码生成的prompt还是啥,在还原函数调用ghidra的api时候无法还原,他会先生成一个调用api的python脚本去调用,但是却还原不了,效果也不好;而cursor则全自己处理还完完成,前提都是存在符号表的;

至于在漏洞检索方面,两边各自生成了一份漏洞报告,具体结果倒是大差不差;

函数还原前;

函数还原后的效果;


| 💡

函数还原对话小技巧

在让其还原的时候,可以先让他检索代码日志、打印这块东西,然后从中结合理解函数的能力来还原,结果会更加准确。

漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

相关推荐
mobility8 小时前
免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频
ai·vibe coding
doiito11 小时前
【Agent Harness】Gliding Horse 给 Agent OS 装上双曲空间引擎与默克尔树边云同步
ai·rust·架构设计·系统设计·ai agent
knqiufan14 小时前
从 Python 到 TypeScript,用 GLM-5.2 跑通 PowerMem SDK 的长程任务工程
ai·memory·agentic·powermem
小白跃升坊1 天前
Codex 增强部署:基于 Codex++ 接入 DeepSeek
ai·ai编程·codex·deepseek·ai coding·codex++
AlfredZhao1 天前
GPT 省钱,不是别用最新模型,而是别浪费缓存
gpt·ai
doiito2 天前
【Agent Harness】Gliding Horse 本体论系统设计:给 AI Agent 装上“语义大脑”
ai·rust·架构设计·系统设计·ai agent
小七-七牛开发者2 天前
周一上线 | SpaceX 收购 Cursor、支付宝进入 AI 时代、DeepSeek 完成 500 亿元融资
ai·agent·token·glm·智谱·claudecode·ai coding·周一上线
doiito3 天前
【Agent Harness】为什么我把 JSON‑LD “编译成 DAG” 后,整个 Agent 平台立刻聪明了
ai·rust·架构设计·系统设计·ai agent
ServBay3 天前
Laravel Herd MCP 的替代,多语言与跨平台的 AI 本地开发选择
后端·ai编程·mcp