Ghidra MCP Server

Expõe dados de análise binária do Ghidra, incluindo funções e pseudocódigo, para LLMs.

Documentação

🔍 Ghidra MCP Server

Este projeto permite que você use Ghidra em modo headless para extrair dados ricos de análise binária (funções, pseudocódigo, structs, enums, etc.) para um arquivo JSON e expô-los a LLMs como Claude via Model Context Protocol (MCP).

Ele transforma o Ghidra em um backend interativo de engenharia reversa.


🚀 Recursos

  • Descompila um binário usando o modo headless do Ghidra
  • Extrai:
    • Pseudocódigo de funções, nomes, parâmetros, variáveis, strings, comentários
    • Estruturas de dados (structs), enums e definições de funções
  • Saída para ghidra_context.json
  • O servidor MCP expõe ferramentas como:
    • list_functions(), get_pseudocode(name)
    • list_structures(), get_structure(name)
    • list_enums(), get_enum(name)
    • list_function_definitions(), get_function_definition(name)

⚙️ Requisitos do Sistema

  • macOS (testado)
  • Python 3.10+
  • Ghidra 11.3.1+
  • Java 21 (Temurin preferido)
  • Cliente MCP (ex.: Claude Desktop)
  • mcp CLI (instale via pip install mcp)

🧪 Instalação e Configuração

✅ 1. Instale o Java 21 (OBRIGATÓRIO para Ghidra 11.3.1)

brew install --cask temurin@21

Em seguida, configure-o:

export JAVA_HOME=$(/usr/libexec/java_home -v 21)
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 21)' >> ~/.zshrc
source ~/.zshrc

Verifique:

java -version

Deve dizer: openjdk version "21.0.x"...


✅ 2. Instale o Ghidra

Baixe e extraia Ghidra 11.3.1


✅ 3. Configure o projeto

cd ghidra_mcp
gcc -Wall crackme.c -o crackme

✅ 4. Instale o servidor via MCP CLI

mcp install main.py

Isso registra o servidor MCP para que Claude ou outros clientes possam acessá-lo.


✅ 5. Execute em modo de desenvolvimento (para testes)

mcp dev main.py

Isso permite recarga automática (hot reload) e logs de desenvolvedor.


🛰️ Ferramentas Disponíveis

FerramentaDescrição
setup_context(...)Executa o Ghidra em um binário
list_functions()Todas as funções
get_pseudocode(name)Pseudocódigo descompilado
list_structures()Todas as structs
get_structure(name)Detalhes de uma struct
list_enums()Todos os enums
get_enum(name)Valores de enum
list_function_definitions()Todos os protótipos de função
get_function_definition()Tipo de retorno e argumentos

Exemplo de Prompt

Analise o arquivo binário localizado em <BINARY_PATH> usando o Ghidra instalado em <GHIDRA_PATH>. Primeiro, configure o contexto de análise usando ambos os caminhos, depois liste todas as funções no binário. Examine a função de ponto de entrada principal e forneça uma visão geral de alto nível do que o programa faz.

🧠 Problemas Comuns e Correções

❌ O Ghidra falha com “versão Java não suportada”

➡️ Correção: Instale Java 21, não 17 ou 24:

brew install --cask temurin@21
export JAVA_HOME=$(/usr/libexec/java_home -v 21)

❌ spawn uv ENOENT (O Claude Desktop não consegue encontrar seu binário UV)

➡️ O Claude não consegue localizar uv pelo nome. Para corrigir:

  1. Execute no seu terminal:
which uv

Exemplo de saída:

/Users/yourname/.cargo/bin/uv
  1. Abra o arquivo de configuração do Claude Desktop:
open ~/Library/Application\ Support/Claude/claude_desktop_config.json
  1. Atualize-o da seguinte forma:
{
  "mcpServers": {
    "ghidra": {
      "command": "/Users/yourname/.cargo/bin/uv",
      "args": [
        "--directory",
        "/Users/yourname/Documents/ghidra_mcp",
        "run",
        "main.py"
      ]
    }
  }
}
  1. Reinicie o Claude Desktop. Agora você deve ver suas ferramentas MCP personalizadas.

❌ The operation couldn’t be completed. Unable to locate a Java Runtime.

➡️ Correção: Java não instalado ou JAVA_HOME não definido. Siga as instruções de configuração acima.


📂 Estrutura do Projeto

ArquivoFinalidade
main.pyServidor MCP com ferramentas
export_context.pyScript Ghidra que extrai JSON
crackme.cBinário C de exemplo
crackmeBinário compilado para teste

👨‍💻 Autor

Tomi Bamimore
Ghidra pela NSA
MCP pela Anthropic