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
- Python (3.11 ou superior)
- Use
idapyswitchpara alternar para a versão mais recente do Python
- Use
- IDA Pro (8.3 ou superior, 9 recomendado), IDA Free não é suportado
- Cliente MCP suportado (escolha um de sua preferência)
- Amazon Q Developer CLI
- Augment Code
- Claude
- Claude Code
- Cline
- Codex
- Copilot CLI
- Crush
- Cursor
- Gemini CLI
- Kilo Code
- Kiro
- LM Studio
- Opencode
- Qodo Gen
- Qwen Coder
- Roo Code
- Trae
- VS Code
- VS Code Insiders
- Warp
- Windsurf
- Zed
- Kimi Code
- Outros clientes MCP: Execute
ida-pro-mcp --configpara obter a configuração JSON para o seu cliente.
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 epreferred_session_idé ignorado.idb_list(): Lista sessões abertas e instâncias GUI do IDA em execução. Cada entrada temadopted(True se este supervisor a gerencia, False para GUIs/workers descobertos, mas ainda não abertos viaidb_open),backend(workerougui),is_activee 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()relatais_activea 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ão4).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õesida://idb/entrypoints- Pontos de entrada (main, callbacks TLS, etc.)
Estado da UI:
ida://cursor- Posição atual do cursor e funçãoida://selection- Intervalo de seleção atual
Informações de Tipos:
ida://types- Todos os tipos locaisida://structs- Todas as estruturas/uniõesida://struct/{name}- Definição de estrutura com campos
Consultas:
ida://import/{name}- Detalhes de import por nomeida://export/{name}- Detalhes de export por nomeida://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; definaprefix=""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, especifiqueendpara 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, especifiqueendousize.
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 opcionaisfunc,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_strlistem 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"
