
Assistente de engenharia reversa alimentado por IA que conecta o IDA Pro a modelos de linguagem por meio do MCP.
Simples Servidor MCP para permitir vibe reversing no IDA Pro.
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
Os binários e o prompt do vídeo estão disponíveis no repositório mcp-reversing-dataset.
idapyswitch para alternar para a versão mais recente do Pythonida-pro-mcp --config para obter a configuração JSON do 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"
Para instalar a versão mais recente do IDA Pro MCP no Claude Code:
claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia
Para instalar a versão mais recente do IDA Pro MCP no Codex:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
Para instalar a versão mais recente do IDA Pro MCP 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 skill idapython. Os plugins são copiados para
$KIMI_CODE_HOME/plugins/managed/, portanto o uv deve estar no seu PATH. A primeira sessão após
a instalação é mais lenta, porque o uv resolve as dependências antes de o servidor responder.
Nota: o plugin MCP não é mais recomendado e eventualmente será descontinuado. Use idalib-mcp em seu lugar.
Se você quiser configurar o servidor MCP manualmente pela 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) são executados em segundo plano e precisam ser encerrados pelo ícone da bandeja do sistema.
LLMs são propensos a alucinações e você precisa ser específico ao criar 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 o resultado!
Outro prompt de @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:
Os Modelos de Linguagem de Grande Porte (LLMs) são ferramentas poderosas, mas às vezes podem ter dificuldades com cálculos matemáticos complexos ou apresentar "alucinações" (inventar fatos). Certifique-se de dizer ao LLM para usar a ferramenta MCP int_convert; talvez você também precise do math-mcp para determinadas operações.
Outra coisa a ter em mente é que os LLMs não terão um bom desempenho em código ofuscado. Antes de tentar usar um LLM para resolver o problema, explore o binário e gaste algum tempo removendo (automaticamente) os seguintes itens:
Você também deve usar uma ferramenta como Lumina ou FLIRT para tentar resolver todo o código de bibliotecas de código aberto e a STL do C++; isso melhorará ainda mais a precisão.
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 o idalib, você também pode executar um servidor MCP headless. Você pode iniciar com um binário inicial:
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable
Ou inicie sem um binário e abra 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 é executado como um processo destacado que
sobrevive ao supervisor que o iniciou. Quando um novo supervisor (via stdio
ou HTTP) chama idb_open para um binário que já está aberto em um worker
neste host, o supervisor adota esse worker de forma transparente — não há
nenhum modo "compartilhado" separado para ativar. Os workers são encerrados sozinhos quando nenhuma requisição os acessa durante um intervalo ocioso.
Nota: O recurso idalib foi contribuído por Willi Ballenthin.
idalib-mcp é um supervisor que mantém cada banco de dados aberto em seu próprio processo worker do idalib. Os workers se registram em um diretório de descoberta local do host e sobrevivem ao supervisor que os iniciou; qualquer supervisor subsequente que quiser o mesmo caminho adota o worker em execução. Um worker é encerrado sozinho quando nenhuma requisição o acessa durante seu TTL ocioso (padrão de 1 hora). Chame idb_close para liberar um worker antecipadamente (liberando uma vaga em relação a --max-workers); instâncias adotadas de GUI/worker são destacadas em vez de encerradas.
idb_open escolhe o backend por meio do parâmetro mode:
prefer_headless (padrão): iniciar um worker do idalib (ou adotar um que já tenha o arquivo aberto).force_headless: o mesmo, 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, inicia um worker do idalib.force_gui: adota uma GUI em execução para o arquivo; caso contrário, inicia um novo processo de GUI do IDA.Toda chamada de ferramenta deve incluir um argumento database explícito. 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 da sessão retornado por idb_open (ou exibido em idb_list); nomes de arquivo e caminhos não são aceitos.
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 os subsistemas (cache de strings, Hex-Rays) e retorna o ID da sessão. Se um worker ou uma GUI para este caminho já estiver em execução no host, essa instância será adotada e preferred_session_id será ignorado.idb_list(): lista as sessões abertas e as instâncias de 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 o worker de sua propriedade, liberando uma vaga em relação a --max-workers. Instâncias adotadas de GUI/worker são destacadas, não encerradas.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: valor padrão de ambiente para --max-workers.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 de TLS, etc.)Estado da interface:
ida://cursor - Posição atual do cursor e funçãoida://selection - Intervalo de seleção atualInformações de tipo:
ida://types - Todos os tipos locaisida://structs - Todas as estruturas/uniõesida://struct/{name} - Definição da estrutura com camposConsultas:
ida://import/{name} - Detalhes do import por nomeida://export/{name} - Detalhes do export por nomeida://xrefs/from/{addr} - Referências cruzadas a partir do endereçolookup_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 o(s) 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).add_bookmark(addr, name, prefix): adiciona ou substitui o marcador (bookmark) do IDA em um endereço; defina prefix="" para não ter prefixo.set_comments(items): define comentários em endereço(s) nas visões de desmontagem e descompilador.patch_asm(items): aplica patch em instruções de assembly em endereço(s).declare_type(decls): declara tipo(s) C na biblioteca de tipos local.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): remove a definição de item(ns) em endereço(s), convertendo de volta para bytes brutos. Opcionalmente, especifique end ou size.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(is) global(is) por endereço ou nome (detecção automática; valores em tempo de compilação).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 offset(s) especificado(s).delete_stack(items): exclui variável(is) de pilha por nome.read_struct(queries): lê valores de campos de estrutura em endereço(s) específico(s).search_structs(filter): busca estruturas por padrão de nome.As ferramentas do depurador ficam ocultas por padrão. Ative-as 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 entrando na instrução.dbg_step_over(): executa passo a passo sobre a instrução.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): ativa/desativa 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 (GP), thread atual.dbg_gpregs_remote(tids): registradores de propósito geral (GP), thread(s) específica(s).dbg_regs_named(names): registradores nomeados, thread atual.dbg_regs_named_remote(tid, names): registradores nomeados, thread específica.Pilha e memória:
dbg_stacktrace(): pilha de chamadas com informações de módulo/símbolo.dbg_read(regions): lê memória do processo depurado.dbg_write(regions): escreve memória no processo depurado.py_eval(code): executa código Python arbitrário no contexto do IDA (retorna dict com result/stdout/stderr; suporta avaliação no estilo Jupyter).analyze_funcs(addrs): análise abrangente de função (descompilação, assembly, xrefs, callees, callers, strings, constantes, blocos básicos).find_regex(queries): busca strings com regex sem diferenciar maiúsculas/minúsculas (paginado).find_bytes(patterns, limit=1000, offset=0): encontra padrão(ões) de bytes no binário (ex.: "48 8B ?? ??"). Limite máximo: 10000.find_insns(sequences, limit=1000, offset=0): encontra 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 a dados/código). Limite máximo: 10000.basic_blocks(addrs): obtém blocos básicos com sucessores e predecessores.set_type(edits): aplica tipo(s) a funções, globais, locais ou variáveis de pilha.infer_types(addrs): infere tipos em endereço(s) usando Hex-Rays ou heurísticas.export_funcs(addrs, format): exporta função(ões) no formato especificado (json, c_header ou prototypes).callgraph(roots, max_depth): constrói grafo de chamadas a partir da(s) função(ões) raiz com profundidade configurável.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): aplica patch em várias sequências de bytes de uma só vez.put_int(items): escreve valores inteiros usando ty (i8/u64/i16le/i16be/etc).Principais recursos:
[{..., error: null|string}, ...]cursor: {next: offset} ou {done: true} (limite padrão: 1000, máximo imposto: 10000 para evitar estouro de tokens)build_strlist em projetos grandesAdicionar 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 nenhum boilerplate adicional! Abaixo está um vídeo em que 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 depois envio uma requisiçã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 dos commits diretos para main:
git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"
idb_save(session_id, path=""): salva o IDB de uma sessão em disco. Encaminhado como uma ferramenta comum de worker (database=<id> injetado) — mesma assinatura em ambos os backends.server_health(database=<id>) (encaminhado). idb_list() informa is_active a partir da sondagem TCP/RPC do supervisor.