本节摘要:本节把 GhidraMCP 从「一个名词」变成「本机跑着的服务」。先拆 2.0 版架构:客户端(VS Code / Claude Code 等)经 MCP 协议连到 Python MCP 桥,桥再经 HTTP(默认端口 8080)连到 Ghidra 里的 Java 插件——2.0 起插件直接内置 HTTP server,Ghidra 侧不再需要旧版的 Python 桥接脚本;headless 场景则由 PyGhidra 驱动,要求 Python 3.10~3.13。然后是三步安装:取扩展、装进 Ghidra、装客户端桥;配 stdio 与 streamable-http 两种传输的选型与配置形态。再对照能力清单(列函数、反编译、重命名、xref、注释、段查看)把它映射回第 01 章的手艺动作。最后过安全注意(端口暴露、工程写权、样本敏感度)与五条常见故障排查。所有命令为写法示意,以官方仓库 README 为准。
版本背景(社区口径,2026-10):GhidraMCP 约 1.1 万 stars、Apache-2.0;2.0 于 2026-10-10 发布,适配 Ghidra 12.1.4。相对 1.x 的变化先用一张表看清:
| 维度 | 1.x(旧) | 2.0(2026-10-10 起) |
|---|---|---|
| Ghidra 侧接入 | 需要先在 Ghidra 里跑 Python 桥接脚本 | Java 插件内置 HTTP server,装扩展即用 |
| headless | 不支持 | 基于 PyGhidra(Python 3.10~3.13) |
| 客户端桥 | Python,stdio | Python(uvx / pip),stdio 与 streamable-http |
| 适配 Ghidra | 旧版本矩阵 | 12.1.4(随官方更新,以发行说明为准) |
┌─────────────────────┐ MCP(stdio / streamable-http) ┌──────────────────┐ │ MCP 客户端 │ ────────────────────────────────▶│ Python MCP 桥 │ │ VS Code、Claude Code │ ◀──────────────────────────────── │ (uvx / pip 安装) │ └─────────────────────┘ 工具调用与结果 └────────┬─────────┘ │ HTTP :8080 ▼ ┌────────────────────┐ │ Ghidra │ │ Java 插件内置 server│ │ GUI 工程 / headless │ └────────────────────┘
分层的意义:模型只见 MCP 工具描述(列函数、反编译……),不关心底下是 GUI 还是 headless;换 Ghidra 版本、换客户端,中间的桥保持稳定。「移除 Ghidra 侧 Python 桥接层」的直接好处是少一个易错环节——旧版最常见的安装故障(桥脚本没跑、版本不匹配)整类消失。
# bash —— 安装 GhidraMCP(三步,写法示意,以官方仓库 README 为准) # 步骤一:从官方仓库 Releases 取 2.0 发行包,得到扩展 zip # 步骤二:Ghidra 菜单 File - Install Extensions - 加号选 zip - 勾选启用 - 重启 Ghidra # 步骤三:安装并启动 Python MCP 桥(二选一) uvx ghidra-mcp # 或:pip install ghidra-mcp && ghidra-mcp
三步各自的自检:步骤二重启后,插件出现在插件列表且 CodeBrowser 状态可见服务已起(以插件界面提示为准);步骤三终端不报错即桥在等待连接;端到端自检在 3.2 节客户端接上后做——让模型列一次函数。
前置核对两条:Ghidra 版本与 GhidraMCP 版本要匹配(2.0 对应 Ghidra 12.1.4,随官方更新而变,以发行说明为准);Java 侧就绪(第 1.1 节已装)。headless 用法(不点开 GUI)在 3.3 节展开。
| 传输 | 形态 | 适用 | 注意 |
|---|---|---|---|
| stdio | 客户端本地拉起桥进程,管道通信 | 单机自用,最省事 | 默认推荐,配置最少 |
| streamable-http | 桥常驻,客户端经 HTTP 连接 | 跨机:Ghidra 在工作站、模型客户端在笔记本 | 注意网络可达与端口暴露 |
两种传输的配置形态示意(字段名以官方文档为准):
# mcp_stdio.json —— stdio 传输:客户端自己拉起桥(示意) { "servers": { "ghidra": { "type": "stdio", "command": "uvx", "args": ["ghidra-mcp"] } } }
# mcp_http.json —— streamable-http 传输:桥常驻,客户端连 URL(示意) { "servers": { "ghidra": { "type": "http", "url": "http://127.0.0.1:8080/mcp" } } }
选型经验:本机一台机器全搞定就用 stdio;团队共享一个 Ghidra 实例、多人多个客户端连同一个工程时,streamable-http 才有价值——此时 8080 端口等于把工程操作权暴露到网络上,务必放在受信网段。
| 能力 | 对应手艺动作(第 01 章) | 典型指令 | 人的复核动作 |
|---|---|---|---|
| 列出函数 | Functions 窗口 | 「列出全部函数,按大小排序」 | 对照 afl / 函数列表 |
| 反编译函数 | Decompiler 窗口 | 「反编译 FUN_00401160 并解释」 | 读同一段伪 C |
| 重命名 | 按 L 改名 | 「把它改名为 check_key」 | 核对命名依据 |
| 交叉引用 | Show References to | 「谁调用了它?」 | 在 xref 面板复看 |
| 注释 | Listing 注释 | 「在此地址加注释」 | 检查注释内容 |
| 段查看 | Memory Map | 「列出各段的起止与权限」 | 对照内存映射 |
对照第 1.2 节走查五步:入口定位(列函数 + xref)、字符串锚点(段与数据查看)、结构对照(反编译)、常量计算(模型算、人核)、落库固化(重命名 + 注释)——除了「人裁决」,全部能力都在清单里。复核动作一列是刻意加的:模型每动一次手,你都有一个对应的检查点。
# bash —— 连通性自检(写法示意):确认桥在、端口在 claude mcp list # 或客户端的等价命令:ghidra 应为已连接 netstat -ano | findstr 8080 # Windows 查端口;Linux 用 ss -ltnp | grep 8080
| 症状 | 多半原因 | 处理 |
|---|---|---|
| 客户端连不上、列函数无响应 | 插件没启用或 8080 没起 | 回步骤二查插件列表;看端口占用 |
| 桥启动即报 Ghidra 版本错误 | 版本不匹配 | 核对发行说明的适配矩阵 |
| 端口冲突 | 8080 被占 | 按插件配置改端口(以官方文档为准) |
| headless 起不来 | Python 版本越界 | 核对 3.10~3.13 要求(3.3 节详述) |
| 改名不生效 | 工程只读或未保存 | 查工程权限;改完让模型确认再手动保存 |
服务起来了,还没人跟它说话。下一节把 VS Code 与 Claude Code 两个客户端接上,完整走一遍「列函数、反编译、重命名、追引用」的对话式逆向。