
Asistente de ingeniería inversa impulsado por IA que conecta IDA Pro con modelos de lenguaje a través de MCP.
Servidor MCP sencillo para permitir el vibe reversing en IDA Pro.
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
Los binarios y el prompt del vídeo están disponibles en el repositorio mcp-reversing-dataset.
idapyswitch para cambiar a la versión más reciente de Pythonida-pro-mcp --config para obtener la configuración JSON de tu cliente.Nota: Esto requiere tener idalib activado globalmente y 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 el IDA Pro MCP más reciente en 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 el IDA Pro MCP más reciente en Codex:
codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia
Para instalar el IDA Pro MCP más reciente en Kimi Code, ejecuta este comando de barra en el chat:
/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload
Esto instala el servidor MCP idalib y la habilidad idapython. Los plugins se copian a $KIMI_CODE_HOME/plugins/managed/, por lo que uv debe estar en tu PATH. La primera sesión después de la instalación es más lenta, porque uv resuelve las dependencias antes de que el servidor responda.
Nota: el plugin MCP ya no se recomienda y finalmente quedará obsoleto. Usa idalib-mcp en su lugar.
Si quieres configurar el servidor MCP manualmente desde la GUI de IDA:
pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip
Configura los servidores MCP e instala el plugin de IDA:
ida-pro-mcp --install
Importante: Asegúrate de reiniciar completamente IDA y tu cliente MCP para que la instalación surta efecto. Algunos clientes (como Claude) se ejecutan en segundo plano y deben cerrarse desde el icono de la bandeja.
Los LLM son propensos a las alucinaciones y debes ser específico con tus prompts. En la ingeniería inversa, la conversión entre enteros y bytes es especialmente problemática. A continuación se muestra un ejemplo mínimo de prompt; no dudes en iniciar una discusión o abrir un issue si obtienes buenos resultados con otro prompt:
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 fue solo el primer experimento; comparte si encontraste formas de mejorar el resultado.
Otro 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
Transmisión en vivo que analiza los prompts y muestra análisis de malware del mundo real:
Los grandes modelos de lenguaje (LLM) son herramientas potentes, pero a veces pueden tener dificultades con cálculos matemáticos complejos o mostrar "alucinaciones" (inventar hechos). Asegúrate de indicar al LLM que use la herramienta MCP int_convert y es posible que también necesites math-mcp para ciertas operaciones.
Otra cosa a tener en cuenta es que los LLM no se desempeñan bien con código ofuscado. Antes de intentar usar un LLM para resolver el problema, examina el binario y dedica tiempo a eliminar (automáticamente) los siguientes elementos:
También deberías usar una herramienta como Lumina o FLIRT para intentar resolver todo el código de librerías de código abierto y la STL de C++; esto mejorará aún más la precisión.
Puedes ejecutar un servidor SSE para conectarte a la interfaz de usuario de esta manera:
uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse
Después de instalar idalib, también puedes ejecutar un servidor MCP headless. Puedes iniciarlo con un binario inicial:
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable
O iniciarlo sin binario y abrir archivos arbitrarios más tarde con idb_open(...):
uv run idalib-mcp --host 127.0.0.1 --port 8745
Para clientes basados en stdio, usa:
uv run idalib-mcp --stdio
Los workers de base de datos son persistentes: cada uno se ejecuta como un proceso separado que sobrevive al supervisor que lo creó. Cuando un nuevo supervisor (por stdio o HTTP) llama a idb_open para un binario que ya está abierto por un worker en este host, el supervisor adopta ese worker de forma transparente; no hay un modo "compartido" separado que activar. Los workers se cierran solos cuando no reciben ninguna solicitud durante un intervalo de inactividad.
Nota: La funcionalidad idalib fue aportada por Willi Ballenthin.
idalib-mcp es un supervisor que mantiene cada base de datos abierta en su propio proceso worker de idalib. Los workers se registran en un directorio de descubrimiento local del host y sobreviven al supervisor que los creó; cualquier supervisor posterior que quiera la misma ruta adopta al worker en ejecución. Un worker se cierra solo cuando no recibe ninguna solicitud durante su TTL de inactividad (1 hora por defecto). Llama a idb_close para liberar un worker de inmediato (liberando un lugar hacia --max-workers); las instancias de GUI/worker adoptadas se separan en lugar de terminar.
idb_open selecciona el backend mediante su parámetro mode:
prefer_headless (predeterminado): crea un worker de idalib (o adopta uno que ya tenga el archivo abierto).force_headless: igual, pero nunca adopta una GUI en ejecución, aunque tenga el archivo abierto.prefer_gui: adopta una GUI en ejecución para el archivo; de lo contrario, crea un worker de idalib.force_gui: adopta una GUI en ejecución para el archivo; de lo contrario, inicia un nuevo proceso de GUI de IDA.Cada llamada a herramienta debe incluir un argumento database explícito. No existe una "base de datos actual" implícita: los llamadores indican la sesión sobre la que quieren operar.
uv run idalib-mcp --stdio --max-workers 4
Flujo 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 debe ser el ID de sesión devuelto por idb_open (o mostrado en idb_list); no se aceptan nombres de archivo ni rutas.
idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""): Abre un binario, pone en marcha los subsistemas (caché de cadenas, Hex-Rays) y devuelve su ID de sesión. Si un worker o una GUI para esta ruta ya se está ejecutando en el host, se adopta esa instancia y se ignora preferred_session_id.idb_list(): Lista las sesiones abiertas y las instancias de GUI de IDA en ejecución. Cada entrada tiene adopted (True si este supervisor la gestiona, False para GUIs/workers descubiertos pero aún no abiertos mediante idb_open), backend (worker o gui), is_active y los IDs de proceso.idb_close(database, save=True): Guarda (opcionalmente), anula el registro de la sesión y termina el worker que posee, liberando un lugar hacia --max-workers. Las instancias de GUI/worker adoptadas se separan, no se terminan.Controles del worker:
--max-workers N: máximo de workers de base de datos simultáneos (0 = ilimitado, predeterminado 4).IDA_MCP_MAX_WORKERS: valor de entorno predeterminado para --max-workers.Los recursos representan estado navegable (datos de solo lectura) siguiendo la filosofía de MCP.
Estado principal del IDB:
ida://idb/metadata - Información del archivo IDB (ruta, arquitectura, base, tamaño, hashes)ida://idb/segments - Segmentos de memoria con permisosida://idb/entrypoints - Puntos de entrada (main, callbacks TLS, etc.)Estado de la interfaz:
ida://cursor - Posición actual del cursor y funciónida://selection - Rango de selección actualInformación de tipos:
ida://types - Todos los tipos localesida://structs - Todas las estructuras/unionesida://struct/{name} - Definición de estructura con camposBúsquedas:
ida://import/{name} - Detalles de la importación por nombreida://export/{name} - Detalles de la exportación por nombreida://xrefs/from/{addr} - Referencias cruzadas desde una direcciónlookup_funcs(queries): Obtiene la(s) función(es) por dirección o nombre (detección automática, acepta lista o cadena separada por comas).int_convert(inputs): Convierte números a diferentes formatos (decimal, hexadecimal, bytes, ASCII, binario).list_funcs(queries): Lista funciones (paginadas y filtradas).list_globals(queries): Lista variables globales (paginadas y filtradas).imports(offset, count): Lista todos los símbolos importados con nombres de módulo (paginado).decompile(addr): Descompila la función en la dirección indicada.disasm(addr): Desensambla la función con todos los detalles (argumentos, marco de pila, etc.).xrefs_to(addrs): Obtiene todas las referencias cruzadas a la(s) dirección(es).xrefs_to_field(queries): Obtiene referencias cruzadas a campo(s) específico(s) de estructura.callees(addrs): Obtiene las funciones llamadas por la(s) función(es) en la(s) dirección(es).add_bookmark(addr, name, prefix): Añade o reemplaza el marcador de IDA en una dirección; establece prefix="" para no usar prefijo.set_comments(items): Establece comentarios en la(s) dirección(es) tanto en la vista de desensamblado como en la del descompilador.patch_asm(items): Parchea instrucciones de ensamblador en la(s) dirección(es).declare_type(decls): Declara tipo(s) C en la biblioteca de tipos local.define_func(items): Define función(es) en la(s) dirección(es). Opcionalmente especifica end para límites explícitos.define_code(items): Convierte bytes en instrucción(es) de código en la(s) dirección(es).undefine(items): Indefine elemento(s) en la(s) dirección(es), convirtiéndolos de nuevo a bytes sin procesar. Opcionalmente especifica end o size.get_bytes(addrs): Lee bytes sin procesar en la(s) dirección(es).get_int(queries): Lee valores enteros usando ty (i8/u64/i16le/i16be/etc.).get_string(addrs): Lee cadena(s) terminada(s) en nulo.get_global_value(queries): Lee el/los valor(es) de variables globales por dirección o nombre (detección automática, valores en tiempo de compilación).stack_frame(addrs): Obtiene las variables del marco de pila de la(s) función(es).declare_stack(items): Crea variable(s) de pila en el/los desplazamiento(s) especificado(s).delete_stack(items): Elimina variable(s) de pila por nombre.read_struct(queries): Lee valores de campos de estructura en dirección(es) específica(s).search_structs(filter): Busca estructuras por patrón de nombre.Las herramientas del depurador están ocultas por defecto. Actívalas con el parámetro de consulta ?ext=dbg:
http://127.0.0.1:13337/mcp?ext=dbg
Control:
dbg_start(): Inicia el proceso del depurador.dbg_exit(): Sale del proceso del depurador.dbg_continue(): Continúa la ejecución.dbg_run_to(addr): Ejecuta hasta la dirección.dbg_step_into(): Ejecuta paso a paso (entrar en la instrucción).dbg_step_over(): Ejecuta paso a paso (saltar sobre la instrucción).Puntos de interrupción:
dbg_bps(): Lista todos los puntos de interrupción.dbg_add_bp(addrs): Añade punto(s) de interrupción.dbg_delete_bp(addrs): Elimina punto(s) de interrupción.dbg_toggle_bp(items): Activa/desactiva punto(s) de interrupción.Registros:
dbg_regs(): Todos los registros del hilo actual.dbg_regs_all(): Todos los registros de todos los hilos.dbg_regs_remote(tids): Todos los registros de hilo(s) específico(s).dbg_gpregs(): Registros de propósito general del hilo actual.dbg_gpregs_remote(tids): Registros de propósito general de hilo(s) específico(s).dbg_regs_named(names): Registros con nombre del hilo actual.dbg_regs_named_remote(tid, names): Registros con nombre de un hilo específico.Pila y memoria:
dbg_stacktrace(): Pila de llamadas con información de módulo/símbolo.dbg_read(regions): Lee memoria del proceso depurado.dbg_write(regions): Escribe memoria en el proceso depurado.py_eval(code): Ejecuta código Python arbitrario en el contexto de IDA (devuelve un dict con result/stdout/stderr, admite evaluación estilo Jupyter).analyze_funcs(addrs): Análisis exhaustivo de funciones (descompilación, ensamblador, referencias cruzadas, funciones llamadas, llamadores, cadenas, constantes, bloques básicos).find_regex(queries): Busca cadenas con expresiones regulares sin distinción de mayúsculas/minúsculas (paginado).find_bytes(patterns, limit=1000, offset=0): Encuentra patrón(es) de bytes en el binario (p. ej., "48 8B ?? ??"). Límite máximo: 10000.find_insns(sequences, limit=1000, offset=0): Encuentra secuencia(s) de instrucciones en el código. Límite máximo: 10000.find(type, targets, limit=1000, offset=0): Búsqueda avanzada (valores inmediatos, cadenas, referencias a datos/código). Límite máximo: 10000.basic_blocks(addrs): Obtiene bloques básicos con sucesores y predecesores.set_type(edits): Aplica tipo(s) a funciones, variables globales, locales o de pila.infer_types(addrs): Infiere tipos en la(s) dirección(es) usando Hex-Rays o heurísticas.export_funcs(addrs, format): Exporta función(es) en el formato especificado (json, c_header o prototypes).callgraph(roots, max_depth): Construye un grafo de llamadas a partir de la(s) función(es) raíz con profundidad configurable.rename(batch): Operación unificada de renombrado por lotes para funciones, variables globales, locales y de pila (acepta un dict con claves opcionales func, data, local, stack).patch(patches): Parchea múltiples secuencias de bytes a la vez.put_int(items): Escribe valores enteros usando ty (i8/u64/i16le/i16be/etc.).Características clave:
[{..., error: null|string}, ...]cursor: {next: offset} o {done: true} (límite predeterminado: 1000, máximo impuesto: 10000 para evitar desbordamiento de tokens)build_strlist en proyectos grandesAñadir nuevas funciones es un proceso muy fácil y simplificado. Solo tienes que añadir una nueva función @tool a los archivos de API modulares en src/ida_pro_mcp/ida_mcp/api_*.py y tu función estará disponible en el servidor MCP sin ningún boilerplate adicional. A continuación hay un vídeo en el que añado la función get_metadata en menos de 2 minutos (incluyendo las pruebas):
https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257e316ae64
Para probar el propio servidor MCP:
npx -y @modelcontextprotocol/inspector
Esto abrirá una interfaz web en http://localhost:5173 y te permitirá interactuar con las herramientas MCP para probarlas.
Para las pruebas, creo un enlace simbólico al plugin de IDA y luego envío una solicitud JSON-RPC POST directamente a http://localhost:13337/mcp. Después de habilitar los enlaces simbólicos, puedes ejecutar el siguiente comando:
uv run ida-pro-mcp --install
Genera el changelog de los commits directos a main:
git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"
idb_save(session_id, path=""): Guarda el IDB de una sesión en disco. Se reenvía como una herramienta de worker normal (con database=<id> inyectado): la misma firma en ambos backends.server_health(database=<id>) (reenviado). idb_list() informa de is_active mediante la sonda TCP/RPC del supervisor.