Ghidra MCP Server
Expone datos de análisis binario de Ghidra, incluyendo funciones y pseudocódigo, a los LLMs.
Documentación
🔍 Ghidra MCP Server
Este proyecto te permite usar Ghidra en modo headless para extraer datos ricos de análisis binario (funciones, pseudocódigo, estructuras, enumeraciones, etc.) en un archivo JSON, y exponerlos a LLMs como Claude a través de Model Context Protocol (MCP).
Convierte a Ghidra en un backend interactivo de ingeniería inversa.
🚀 Características
- Descompila un binario usando el modo headless de Ghidra
- Extrae:
- Pseudocódigo de funciones, nombres, parámetros, variables, cadenas, comentarios
- Estructuras de datos (structs), enumeraciones y definiciones de funciones
- Salida a
ghidra_context.json - El servidor MCP expone herramientas como:
list_functions(),get_pseudocode(name)list_structures(),get_structure(name)list_enums(),get_enum(name)list_function_definitions(),get_function_definition(name)
⚙️ Requisitos del sistema
- macOS (probado)
- Python 3.10+
- Ghidra 11.3.1+
- Java 21 (Temurin preferido)
- Cliente MCP (p. ej. Claude Desktop)
mcpCLI (instala víapip install mcp)
🧪 Instalación y Configuración
✅ 1. Instalar Java 21 (REQUERIDO por Ghidra 11.3.1)
brew install --cask temurin@21
Luego configúralo:
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 21)' >> ~/.zshrc
source ~/.zshrc
Verifícalo:
java -version
Debería decir: openjdk version "21.0.x"...
✅ 2. Instalar Ghidra
Descarga y extrae Ghidra 11.3.1
✅ 3. Configurar el proyecto
cd ghidra_mcp
gcc -Wall crackme.c -o crackme
✅ 4. Instalar el servidor mediante MCP CLI
mcp install main.py
Esto registra el servidor MCP para que Claude u otros clientes puedan acceder a él.
✅ 5. Ejecutar en modo desarrollo (para pruebas)
mcp dev main.py
Esto habilita la recarga en caliente y los registros de desarrollador.
🛰️ Herramientas Disponibles
| Tool | Descripción |
|---|---|
setup_context(...) | Ejecutar Ghidra en un binario |
list_functions() | Todas las funciones |
get_pseudocode(name) | Pseudocódigo descompilado |
list_structures() | Todas las estructuras |
get_structure(name) | Detalles de una estructura |
list_enums() | Todas las enumeraciones |
get_enum(name) | Valores de enumeración |
list_function_definitions() | Todos los prototipos de funciones |
get_function_definition() | Tipo de retorno y argumentos |
Ejemplo de Prompt
Analiza el archivo binario ubicado en <BINARY_PATH> usando Ghidra instalado en <GHIDRA_PATH>. Primero, configura el contexto de análisis usando ambas rutas, luego lista todas las funciones del binario. Examina la función de punto de entrada principal y proporciona una visión general de alto nivel de lo que hace el programa.
🧠 Problemas Comunes y Soluciones
❌ Ghidra falla con “versión de Java no compatible”
➡️ Solución: Instala Java 21, no 17 o 24:
brew install --cask temurin@21
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
❌ spawn uv ENOENT (Claude Desktop no puede encontrar tu binario UV)
➡️ Claude no puede localizar uv por nombre. Para solucionarlo:
- Ejecuta en tu terminal:
which uv
Ejemplo de salida:
/Users/yourname/.cargo/bin/uv
- Abre tu archivo de configuración de Claude Desktop:
open ~/Library/Application\ Support/Claude/claude_desktop_config.json
- Actualízalo de la siguiente manera:
{
"mcpServers": {
"ghidra": {
"command": "/Users/yourname/.cargo/bin/uv",
"args": [
"--directory",
"/Users/yourname/Documents/ghidra_mcp",
"run",
"main.py"
]
}
}
}
- Reinicia Claude Desktop. Ahora deberías ver tus herramientas MCP personalizadas.
❌ The operation couldn’t be completed. Unable to locate a Java Runtime.
➡️ Solución: Java no está instalado o JAVA_HOME no está configurado. Sigue las instrucciones de configuración anteriores.
📂 Estructura del Proyecto
| Archivo | Propósito |
|---|---|
main.py | Servidor MCP con herramientas |
export_context.py | Script de Ghidra que extrae JSON |
crackme.c | Binario C de ejemplo |
crackme | Binario compilado para probar |