🚀 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 提供了模型上下文協議規範
有問題或疑問?
請在項目倉庫中創建一個問題,用於報告錯誤、提出功能請求或詢問使用和開發相關的問題。