
Servidor MCP para diffing binario automatizado.
Diaphora MCP es un servidor MCP (Model Context Protocol) para el diffing automatizado de binarios. Conecta Diaphora (el motor de diffing) e IDA Pro (el desensamblador) mediante el protocolo MCP, permitiendo que agentes de IA (como Claude Code) realicen comparaciones de archivos binarios, encuentren parches de seguridad y analicen cambios.
.i64 / .idb analizadas al formato SQLite de Diaphora (mediante el modo sin interfaz de idat.exe)idat.exe)git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
El paquete intenta encontrar automáticamente IDA Pro y Diaphora en las ubicaciones de instalación estándar. Si no los encuentra, puede configurar las siguientes variables de entorno:
Para Claude Code, puede especificarlas en ~/.claude.json (o el archivo de configuración correspondiente de su cliente MCP):
{
"mcpServers": {
"diaphora": {
"command": "python",
"args": ["path/to/repo/diaphora_mcp_server.py"],
"env": {
"IDAT_PATH": "C:\\Program Files\\IDA Pro 9.3\\idat.exe",
"DIAPHORA_DIR": "C:\\Program Files\\IDA Pro 9.3\\plugins\\diaphora-3.4.1"
},
"timeout": 7200
}
}
}
Nota: Para binarios muy grandes (>100 MB), asegúrese de que el
timeoutsea al menos 7200 (2 horas).
Codex normalmente usa dos servidores MCP complementarios:
diaphora-mcp — este proyecto: exportación, diff con Diaphora y análisis de resultados;ida-pro-mcp — el servidor de inspección IDA upstream para idb_open, descompilación y análisis a nivel de dirección.idalib-mcp es el backend sin interfaz de ida-pro-mcp, no un servidor Diaphora separado. Después de instalarlo, reinicie Codex:
uv run ida-pro-mcp --install codex --transport streamable-http --scope global --ida-rpc http://127.0.0.1:8745/mcp
Para este proyecto, una configuración stdio es suficiente:
[mcp_servers.diaphora-mcp]
command = "python"
args = ["D:\\path\\to\\diaphora-mcp\\diaphora_mcp_server.py"]
startup_timeout_sec = 120
IDA Pro debe analizar primero los binarios (creando archivos .i64 o .idb). Después de eso:
┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")
O ejecute el pipeline completo en un solo comando:
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
No pase .i64 directamente a las herramientas de resultados: es una base de datos de IDA, no SQLite. Expórtela primero.
┃ # 1. Pipeline completo: exportar dos .i64 → diff → informe resumen
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
┃ # 2. Si las bases de datos ya están exportadas
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
┃ # 3. Análisis de seguridad de los resultados del diff
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
┃ # 4. Clasificación por importancia de los cambios
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
┃ # 5. Encontrar cambios de causa raíz
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
┃ # 6. Detectar probables parches de seguridad
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. Generar informe completo
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
Consulte examples/basic-session.md para una transcripción completa paso a paso de una sesión real de Diaphora MCP, desde la exportación de dos bases de datos IDB hasta la comparación de funciones individuales. También disponible en ruso.
Aquí hay un adelanto de lo que devuelve el servidor:
Entrada — comparar dos DLLs de SQLite3 (2015 vs 2023):
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
Salida — resumen después de exportar + diff:
{
"best_matches": 60,
"partial_matches": 993,
"multimatches": 52,
"unmatched_primary": 2647
}
La sesión recorre 6 llamadas a herramientas MCP, mostrando el JSON exacto de entrada/salida para cada paso, junto con el razonamiento del agente.
┃ # Obtener información de exportación de la base de datos
┃ get_export_info(db_path="app.sqlite")
┃ # Buscar funciones
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
┃ # Recuperar pseudocódigo
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")
diaphora-mcp/
├── diaphora_mcp_server.py # Punto de entrada principal
├── diaphora_mcp/
│ ├── diaphora_mcp_server.py # Registro de herramientas MCP
│ ├── config.py # Configuración de rutas y detección automática
│ ├── models.py # Constantes y modelos
│ ├── core/
│ │ ├── export.py # Exportación sin interfaz, pipeline por lotes
│ │ ├── diff.py # Diffing y lector de resultados .diaphora
│ │ ├── analysis.py # Búsqueda de funciones, comparación, explicación
│ │ ├── security.py # Coincidencia de palabras clave, detección de parches
│ │ ├── ranking.py # Clasificación por importancia
│ │ ├── graph.py # Grafo de llamadas, árboles BFS, causa raíz
│ │ ├── metadata.py # Preparación de metadatos (nombres, comentarios)
│ │ └── report.py # Generación de informe general de parches
│ └── utils/
│ ├── sqlite.py # Ayudantes SQLite
│ ├── format.py # Diff de pseudocódigo, extracción de vectores de características
│ └── log.py # Utilidades de registro de exportación
├── _diaphora_headless.py # Wrapper delgado para idat.exe -S
└── logs/ # Registros de exportación automatizada (creados dinámicamente)
| Herramienta | Descripción |
|---|---|
export_idb_to_diaphora | Exporta una base de datos .i64/.idb al formato SQLite usando IDA sin interfaz |
batch_export_and_diff | Pipeline completo: exportar primario → exportar secundario → diff → resumen |
| Herramienta | Descripción |
|---|---|
diff_diaphora_dbs | Compara dos bases de datos SQLite exportadas con Diaphora |
get_diff_results | Lee un archivo de diff .diaphora con filtrado |
get_diff_summary | Devuelve estadísticas de coincidencias |
| Herramienta | Descripción |
|---|---|
detect_security_patches | Detecta probables correcciones de seguridad (comprobaciones de límites, seguridad de memoria, anti-debug, etc.) |
| Herramienta | Descripción |
|---|---|
rank_changes | Clasifica las funciones cambiadas por importancia (puntuación 0-100) |
| Herramienta | Descripción |
|---|---|
get_changed_callgraph | Compara las llamadas entrantes y salientes de una función |
compare_call_path | Recorre el grafo de llamadas desde una función (comparación de rutas BFS, hasta N niveles) |
find_patch_root | Detecta funciones de causa raíz que provocan cascadas de llamadas |
| Herramienta | Descripción |
|---|---|
performance_report | Devuelve estadísticas agregadas de memoria, caché y conexión |
| Herramienta | Descripción |
|---|---|
transfer_metadata | Prepara nombres, comentarios y prototipos para transferencia masiva |
El proyecto incluye integración incorporada con sesiones activas de la GUI de IDA Pro, permitiendo exportaciones instantáneas directamente desde ventanas de IDA activas sin conflictos de bloqueo de base de datos.
plugins/ de IDA Pro. Iniciará un servidor XML-RPC en segundo plano en el puerto 28652 cada vez que IDA se inicie.export_idb_to_diaphora, el servidor MCP verifica el puerto 28652. Si hay una sesión activa, ejecuta la exportación directamente en la GUI. De lo contrario, vuelve automáticamente a la ejecución en segundo plano sin interfaz mediante idat.exe.Para instrucciones detalladas sobre la configuración del puente, consulte GUI_INSTRUCTIONS.md.
Al procesar proyectos extremadamente grandes, Diaphora MCP aplica optimizaciones específicas:
100000 (sys.setrecursionlimit) para evitar fallos durante recorridos grandes del grafo de llamadas.diaphora_config.py, establecer COMMIT_AFTER_EACH_GUI_UPDATE = False reduce las escrituras en disco, acelerando la exportación desde la GUI entre 2 y 3 veces.EXPORTING_USE_MICROCODE = False en la configuración de Diaphora) para una exportación más rápida cuando el descompilador no sea estrictamente necesario.Herramientas como analyze_diff_results, compare_functions y find_function_match devuelven un bloque ida_pro_mcp que contiene direcciones y rutas. Esta información se puede pasar directamente a las herramientas de ida-pro-mcp:
┃ # 1. Diaphora encuentra una función sospechosa
┃ analyze_diff_results(results_path="diff.diaphora")
┃ → addr1="401000", db1="old.sqlite"
┃ # 2. IDA Pro MCP la descompila
┃ decompile_function(address="401000")
Para ver Diaphora MCP en acción, consulte los siguientes ejemplos:
Si usted es un asistente de codificación de IA (como Claude Code) que usa este protocolo, tenga en cuenta las siguientes reglas de compatibilidad:
Esquemas de exportación GUI vs. sin interfaz:
ida_mcp.py) produce un esquema personalizado que contiene tablas como calls, strings, structures, pero no tiene tabla program.idat.exe) produce el esquema oficial de Diaphora que contiene la tabla program.diff_diaphora_dbs) requiere el esquema oficial. Exporte siempre sin interfaz si tiene la intención de comparar/hacer diff de bases de datos.Bases de datos bloqueadas en la GUI:
Evite colisiones de nombres de bases de datos:
<basename>.diaphora.sqlite.Los fixtures verificados de IDA Pro 9.3 pasan el conjunto de regresión: 16 passed, 1 xpassed. También se verificaron una exportación real por etapas y un diff Diaphora de dos DLLs de SQLite3. Las IDBs grandes o abiertas en la GUI aún requieren un bloqueo libre de IDA, un DIAPHORA_OUTPUT_ROOT válido y un tiempo de espera del cliente MCP suficientemente grande.
MIT
| Variable | Descripción | Ejemplo |
|---|
IDAT_PATH | Ruta completa a idat.exe | C:\Program Files\IDA Pro 9.3\idat.exe |
DIAPHORA_DIR | Carpeta que contiene diaphora.py | C:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1 |
DIAPHORA_OUTPUT_ROOT | Directorio raíz permitido para nuevos archivos de exportación | D:\\diaphora-outputs |
DIAPHORA_PYTHON | Intérprete de Python para el diff | /usr/bin/python3 (por defecto usa sys.executable) |
| Herramienta | Descripción |
|---|
analyze_diff_results | Examina los resultados usando palabras clave de seguridad y filtros |
compare_functions | Comparación lado a lado de una función en ambas bases de datos |
find_function_match | Empareja una función en el segundo binario con métricas de confianza |
explain_similarity | Desglosa los factores de similitud (mnemónicos, CFG, constantes, prototipo, hash) |
detect_behavior_change | Proporciona un resumen en lenguaje natural de los cambios en la lógica de una función |
summarize_patch | Produce un informe de actualización completo |
search_export_db | Consulta funciones exportadas por nombre/instrucciones/complejidad |
get_function_pseudocode | Obtiene pseudocódigo y metadatos de una función |
get_export_info | Recupera metadatos generales de la base de datos |
<basename>.sqlite para exportaciones de Diaphora, ya que esto entra en conflicto con la base de datos de caché interna creada por el supervisor ida-pro-mcp.