IDA Pro MCP

Servidor MCP para engenharia reversa automatizada com IDA Pro.

Documentação

IDA Pro MCP

Servidor MCP simples para permitir engenharia reversa "vibe" no IDA Pro.

https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0

Os binários e o prompt para o vídeo estão disponíveis no repositório mcp-reversing-dataset.

Pré-requisitos

Nota: Isso requer ter o idalib ativado globalmente e o uv instalado:

# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# linux
uv run "/path/to/idapro-9.3/idalib/python/py-activate-idalib.py"

Instalação (Claude Code)

Para instalar o IDA Pro MCP mais recente no Claude Code:

claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia

Instalação (Codex)

Para instalar o IDA Pro MCP mais recente no Codex:

codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia

Instalação (Kimi Code)

Para instalar o IDA Pro MCP mais recente no Kimi Code, execute este comando de barra no chat:

/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload

Isso instala o servidor MCP idalib e a habilidade idapython. Os plugins são copiados para $KIMI_CODE_HOME/plugins/managed/, então uv deve estar no seu PATH. A primeira sessão após a instalação é mais lenta, porque uv resolve as dependências antes que o servidor responda.

Instalação (GUI)

Nota: o plugin MCP não é mais recomendado e será eventualmente descontinuado. Use idalib-mcp em vez disso.

Se você quiser configurar o servidor MCP manualmente a partir da GUI do IDA:

pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip

Configure os servidores MCP e instale o Plugin do IDA:

ida-pro-mcp --install

Importante: Certifique-se de reiniciar completamente o IDA e o seu cliente MCP para que a instalação tenha efeito. Alguns clientes (como o Claude) rodam em segundo plano e precisam ser encerrados pelo ícone da bandeja.

Engenharia de Prompt

LLMs são propensos a alucinações e você precisa ser específico com seus prompts. Para engenharia reversa, a conversão entre inteiros e bytes é especialmente problemática. Abaixo está um exemplo mínimo de prompt; sinta-se à vontade para iniciar uma discussão ou abrir uma issue se tiver bons resultados com um prompt diferente:

Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:

- Inspect the decompilation and add comments with your findings
- Rename variables to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive
- If more details are necessary, disassemble the function and add comments with your findings
- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!
- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts
- Create a report.md with your findings and steps taken at the end
- When you find a solution, prompt to user for feedback with the password you found

Este prompt foi apenas o primeiro experimento; compartilhe se você encontrou maneiras de melhorar a saída!

Outro prompt por @can1357:

Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.

Use the following systematic methodology:

1. **Decompilation Analysis**
   - Thoroughly inspect the decompiler output
   - Add detailed comments documenting your findings
   - Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)

2. **Improve Readability in the Database**
   - Rename variables to sensible, descriptive names
   - Correct variable and argument types where necessary (especially pointers and array types)
   - Update function names to be descriptive of their actual purpose

3. **Deep Dive When Needed**
   - If more details are necessary, examine the disassembly and add comments with findings
   - Document any low-level behaviors that aren't clear from the decompilation alone
   - Use sub-agents to perform detailed analysis

4. **Important Constraints**
   - NEVER convert number bases yourself - use the int_convert MCP tool if needed
   - Use MCP tools to retrieve information as necessary
   - Derive all conclusions from actual analysis, not assumptions

5. **Documentation**
   - Produce comprehensive RE/*.md files with your findings
   - Document the steps taken and methodology used
   - When asked by the user, ensure accuracy over previous analysis file
   - Organize findings in a way that serves the project goals outlined in AGENTS.md or CLAUDE.md

Transmissão ao vivo discutindo prompts e mostrando análise de malware do mundo real:

Dicas para Melhorar a Precisão do LLM

Modelos de Linguagem de Grande Escala (LLMs) são ferramentas poderosas, mas às vezes podem ter dificuldades com cálculos matemáticos complexos ou exibir "alucinações" (inventar fatos). Certifique-se de dizer ao LLM para usar a ferramenta MCP int_convert e você também pode precisar do math-mcp para certas operações.

Outra coisa a ter em mente é que LLMs não terão um bom desempenho em código ofuscado. Antes de tentar usar um LLM para resolver o problema, dê uma olhada no binário e gaste algum tempo (automaticamente) removendo as seguintes coisas:

  • Criptografia de strings
  • Hash de imports
  • Achatamento de fluxo de controle
  • Criptografia de código
  • Truques anti-descompilação

Você também deve usar uma ferramenta como Lumina ou FLIRT para tentar resolver todo o código de biblioteca de código aberto e o C++ STL; isso melhorará ainda mais a precisão.

Transportes e MCP Headless

Você pode executar um servidor SSE para conectar-se à interface do usuário assim:

uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse

Após instalar idalib, você também pode executar um servidor MCP headless. Você pode começar com um binário inicial:

uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable

Ou começar sem um binário e abrir arquivos arbitrários mais tarde com idb_open(...):

uv run idalib-mcp --host 127.0.0.1 --port 8745

Para clientes baseados em stdio, use:

uv run idalib-mcp --stdio

Os workers de banco de dados são persistentes: cada um roda como um processo separado que sobrevive ao supervisor que o criou. Quando um novo supervisor (via stdio ou HTTP) chama idb_open para um binário que já está aberto sob um worker neste host, o supervisor adota esse worker de forma transparente — não há um modo "compartilhado" separado para ativar. Os workers se encerram sozinhos quando nenhuma requisição os acessa por um intervalo ocioso.

Nota: O recurso idalib foi contribuído por Willi Ballenthin.

Modelo de Sessão Headless do idalib

idalib-mcp é um supervisor que mantém cada banco de dados aberto em seu próprio processo worker idalib. Os workers se registram em um diretório de descoberta local do host e sobrevivem ao supervisor que os criou; qualquer supervisor subsequente que queira o mesmo caminho adota o worker em execução. Um worker se encerra sozinho quando nenhuma requisição o acessa por seu TTL ocioso (padrão 1 hora). Chame idb_close para liberar um worker imediatamente (liberando uma vaga em direção a --max-workers); instâncias GUI/worker adotadas são destacadas, não encerradas.

idb_open escolhe o backend via seu parâmetro mode:

  • prefer_headless (padrão): cria um worker idalib (ou adota um que já tenha o arquivo aberto).
  • force_headless: igual, mas nunca adota uma GUI em execução, mesmo que uma tenha o arquivo.
  • prefer_gui: adota uma GUI em execução para o arquivo; caso contrário, cria um worker idalib.
  • force_gui: adota uma GUI em execução para o arquivo; caso contrário, inicia um novo processo GUI do IDA.

Toda chamada de ferramenta deve carregar um argumento explícito database. Não há um "banco de dados atual" implícito — os chamadores nomeiam a sessão na qual desejam operar.

uv run idalib-mcp --stdio --max-workers 4

Fluxo típico:

idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")

decompile("main", database="binary_a")
xrefs_to("ImportantExport", database="library")

database deve ser o ID de sessão retornado por idb_open (ou mostrado em idb_list); nomes de arquivo e caminhos não são aceitos.

Ferramentas de gerenciamento

  • idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""): Abre um binário, aquece subsistemas (cache de strings, Hex-Rays) e retorna seu ID de sessão. Se um worker ou GUI para este caminho já estiver em execução no host, essa instância é adotada e preferred_session_id é ignorado.
  • idb_list(): Lista sessões abertas e instâncias GUI do IDA em execução. Cada entrada tem adopted (True se este supervisor a gerencia, False para GUIs/workers descobertos, mas ainda não abertos via idb_open), backend (worker ou gui), is_active e IDs de processo.
  • idb_close(database, save=True): Salva (opcionalmente), cancela o registro da sessão e encerra seu worker proprietário, liberando uma vaga em direção a --max-workers. Instâncias GUI/worker adotadas são destacadas, não encerradas.
  • idb_save(session_id, path=""): Salva o IDB de uma sessão em disco. Encaminhado como uma ferramenta worker regular (database=<id> injetado) — mesma assinatura em ambos os backends.
  • Saúde por banco de dados: chame server_health(database=<id>) (encaminhado). idb_list() relata is_active a partir da sondagem TCP/RPC do supervisor.

Controles do worker:

  • --max-workers N: número máximo de workers de banco de dados simultâneos (0 = ilimitado, padrão 4).
  • IDA_MCP_MAX_WORKERS: padrão de ambiente para --max-workers.

O plugin Codex incluído encaminha as variáveis de configuração IDA_MCP_* do runtime a partir do ambiente host do Codex:

  • Capacidade e ciclo de vida: IDA_MCP_MAX_WORKERS, IDA_MCP_OPEN_TIMEOUT, IDA_MCP_WEDGED_GRACE_SEC, IDA_MCP_WORKER_CALL_TIMEOUT.
  • Sondagens de saúde: IDA_MCP_HEALTH_TCP_TIMEOUT, IDA_MCP_HEALTH_RPC_TIMEOUT, IDA_MCP_HEALTH_RETRIES, IDA_MCP_HEALTH_RETRY_BACKOFF.
  • Comportamento do worker: IDA_MCP_TOOL_TIMEOUT_SEC, IDA_MCP_ANALYSIS_PROMPT, IDA_MCP_URL.
  • Registro de requisições: IDA_MCP_LOG_REQUESTS, IDA_MCP_LOG_SKIP_METHODS.

Recursos MCP

Recursos representam estado navegável (dados somente leitura) seguindo a filosofia do MCP.

Estado Principal do IDB:

  • ida://idb/metadata - Informações do arquivo IDB (caminho, arquitetura, base, tamanho, hashes)
  • ida://idb/segments - Segmentos de memória com permissões
  • ida://idb/entrypoints - Pontos de entrada (main, callbacks TLS, etc.)

Estado da UI:

  • ida://cursor - Posição atual do cursor e função
  • ida://selection - Intervalo de seleção atual

Informações de Tipos:

  • ida://types - Todos os tipos locais
  • ida://structs - Todas as estruturas/uniões
  • ida://struct/{name} - Definição de estrutura com campos

Consultas:

  • ida://import/{name} - Detalhes de import por nome
  • ida://export/{name} - Detalhes de export por nome
  • ida://xrefs/from/{addr} - Referências cruzadas a partir de um endereço

Funções Principais

  • lookup_funcs(queries): Obtém função(ões) por endereço ou nome (detecção automática, aceita lista ou string separada por vírgulas).
  • int_convert(inputs): Converte números para diferentes formatos (decimal, hexadecimal, bytes, ASCII, binário).
  • list_funcs(queries): Lista funções (paginado, filtrado).
  • list_globals(queries): Lista variáveis globais (paginado, filtrado).
  • imports(offset, count): Lista todos os símbolos importados com nomes de módulos (paginado).
  • decompile(addr): Descompila a função no endereço fornecido.
  • disasm(addr): Desmonta a função com detalhes completos (argumentos, quadro de pilha, etc).
  • xrefs_to(addrs): Obtém todas as referências cruzadas para endereço(s).
  • xrefs_to_field(queries): Obtém referências cruzadas para campo(s) específico(s) de estrutura.
  • callees(addrs): Obtém funções chamadas pela(s) função(ões) no(s) endereço(s).

Operações de Modificação

  • add_bookmark(addr, name, prefix): Adiciona ou substitui o marcador do IDA em um endereço; defina prefix="" para sem prefixo.
  • set_comments(items): Define comentários em endereço(s) tanto nas visualizações de desmontagem quanto de descompilação.
  • patch_asm(items): Aplica patches de instruções de assembly em endereço(s).
  • declare_type(decls): Declara tipo(s) C na biblioteca de tipos locais.
  • define_func(items): Define função(ões) em endereço(s). Opcionalmente, especifique end para limites explícitos.
  • define_code(items): Converte bytes em instrução(ões) de código em endereço(s).
  • undefine(items): Indefine item(ns) em endereço(s), convertendo de volta para bytes brutos. Opcionalmente, especifique end ou size.

Operações de Leitura de Memória

  • get_bytes(addrs): Lê bytes brutos em endereço(s).
  • get_int(queries): Lê valores inteiros usando ty (i8/u64/i16le/i16be/etc).
  • get_string(addrs): Lê string(s) terminada(s) em nulo.
  • get_global_value(queries): Lê valor(es) de variável global por endereço ou nome (detecção automática, valores em tempo de compilação).

Operações de Quadro de Pilha

  • stack_frame(addrs): Obtém variáveis do quadro de pilha para função(ões).
  • declare_stack(items): Cria variável(is) de pilha em deslocamento(s) especificado(s).
  • delete_stack(items): Exclui variável(is) de pilha por nome.

Operações de Estrutura

  • read_struct(queries): Lê valores de campos de estrutura em endereço(s) específico(s).
  • search_structs(filter): Pesquisa estruturas por padrão de nome.

Operações do Depurador (Extensão)

As ferramentas do depurador ficam ocultas por padrão. Ative com o parâmetro de consulta ?ext=dbg:

http://127.0.0.1:13337/mcp?ext=dbg

Controle:

  • dbg_start(): Inicia o processo do depurador.
  • dbg_exit(): Encerra o processo do depurador.
  • dbg_continue(): Continua a execução.
  • dbg_run_to(addr): Executa até o endereço.
  • dbg_step_into(): Executa passo a passo (instrução).
  • dbg_step_over(): Executa passo a passo (instrução, sem entrar).

Pontos de interrupção:

  • dbg_bps(): Lista todos os pontos de interrupção.
  • dbg_add_bp(addrs): Adiciona ponto(s) de interrupção.
  • dbg_delete_bp(addrs): Exclui ponto(s) de interrupção.
  • dbg_toggle_bp(items): Habilita/desabilita ponto(s) de interrupção.

Registradores:

  • dbg_regs(): Todos os registradores, thread atual.
  • dbg_regs_all(): Todos os registradores, todas as threads.
  • dbg_regs_remote(tids): Todos os registradores, thread(s) específica(s).
  • dbg_gpregs(): Registradores de propósito geral, thread atual.
  • dbg_gpregs_remote(tids): Registradores de propósito geral, thread(s) específica(s).
  • dbg_regs_named(names): Registradores nomeados, thread atual.
  • dbg_regs_named_remote(tid, names): Registradores nomeados, thread(s) específica(s). Stack & Memória:
  • dbg_stacktrace(): Pilha de chamadas com informações de módulo/símbolo.
  • dbg_read(regions): Ler memória do processo depurado.
  • dbg_write(regions): Escrever memória no processo depurado.

Operações Avançadas de Análise

  • py_eval(code): Executar código Python arbitrário no contexto do IDA (retorna dict com resultado/stdout/stderr, suporta avaliação estilo Jupyter).
  • analyze_funcs(addrs): Análise abrangente de funções (decompilação, assembly, xrefs, callees, callers, strings, constantes, blocos básicos).

Correspondência de Padrões e Busca

  • find_regex(queries): Buscar strings com regex sem diferenciar maiúsculas/minúsculas (paginado).
  • find_bytes(patterns, limit=1000, offset=0): Encontrar padrão(ões) de bytes no binário (ex.: "48 8B ?? ??"). Limite máximo: 10000.
  • find_insns(sequences, limit=1000, offset=0): Encontrar sequência(s) de instruções no código. Limite máximo: 10000.
  • find(type, targets, limit=1000, offset=0): Busca avançada (valores imediatos, strings, referências de dados/código). Limite máximo: 10000.

Análise de Fluxo de Controle

  • basic_blocks(addrs): Obter blocos básicos com sucessores e predecessores.

Operações de Tipos

  • set_type(edits): Aplicar tipo(s) a funções, globais, locais ou variáveis de pilha.
  • infer_types(addrs): Inferir tipos em endereço(s) usando Hex-Rays ou heurísticas.

Operações de Exportação

  • export_funcs(addrs, format): Exportar função(ões) em formato especificado (json, c_header ou prototypes).

Operações de Grafo

  • callgraph(roots, max_depth): Construir grafo de chamadas a partir de função(ões) raiz com profundidade configurável.

Operações em Lote

  • rename(batch): Operação unificada de renomeação em lote para funções, globais, locais e variáveis de pilha (aceita dict com chaves opcionais func, data, local, stack).
  • patch(patches): Aplicar patch em múltiplas sequências de bytes de uma vez.
  • put_int(items): Escrever valores inteiros usando ty (i8/u64/i16le/i16be/etc).

Recursos Principais:

  • API type-safe: Todas as funções usam parâmetros fortemente tipados com esquemas TypedDict para melhor suporte de IDE e saídas estruturadas para LLM
  • Design batch-first: A maioria das operações aceita tanto itens únicos quanto listas
  • Tratamento de erros consistente: Todas as operações em lote retornam [{..., error: null|string}, ...]
  • Paginação baseada em cursor: Funções de busca retornam cursor: {next: offset} ou {done: true} (limite padrão: 1000, máximo imposto: 10000 para evitar estouro de tokens)
  • Desempenho: Strings são armazenadas em cache com invalidação baseada em MD5 para evitar chamadas repetidas de build_strlist em projetos grandes

Desenvolvimento

Adicionar novos recursos é um processo super fácil e simplificado. Tudo o que você precisa fazer é adicionar uma nova função @tool aos arquivos de API modulares em src/ida_pro_mcp/ida_mcp/api_*.py e sua função estará disponível no servidor MCP sem qualquer boilerplate adicional! Abaixo está um vídeo onde adiciono a função get_metadata em menos de 2 minutos (incluindo testes):

https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257e316ae64

Para testar o próprio servidor MCP:

npx -y @modelcontextprotocol/inspector

Isso abrirá uma interface web em http://localhost:5173 e permitirá que você interaja com as ferramentas MCP para testes.

Para testes, crio um link simbólico para o plugin do IDA e então envio uma solicitação JSON-RPC diretamente para http://localhost:13337/mcp. Após habilitar links simbólicos, você pode executar o seguinte comando:

uv run ida-pro-mcp --install

Gere o changelog de commits diretos para main:

git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"