
diaphora-mcp v1.0.6
Server MCP per il diffing binario automatico.
Diaphora MCP
Diaphora MCP è un server MCP (Model Context Protocol) per il diffing automatico di binari. Collega Diaphora (il motore di diffing) e IDA Pro (il disassemblatore) tramite il protocollo MCP, consentendo ad agenti AI (come Claude Code) di eseguire confronti di file binari, trovare patch di sicurezza e analizzare le modifiche.
Caratteristiche
- Export: Converte i database
.i64/.idbanalizzati nel formato SQLite di Diaphora (tramiteidat.exein modalità headless) - Diffing: Confronta due database esportati, filtra i risultati per tipo di corrispondenza e rapporto
- Analisi delle vulnerabilità: Cerca modifiche rilevanti per la sicurezza utilizzando corrispondenza di parole chiave e euristiche
- Rilevamento delle patch: Rileva automaticamente nuovi controlli di bounds, controlli di null, gestione degli errori e modifiche crittografiche
- Classificazione: Classifica le funzioni modificate per importanza in base a CFG, salti di complessità e indicatori di sicurezza
- Grafo delle chiamate: Confronta i percorsi di chiamata (BFS, fino a N livelli) e rileva le modifiche alla causa principale nelle cascate di chiamate
- Trasferimento dei metadati: Prepara nomi, commenti e prototipi per il trasferimento tra database
- Integrazione IDA Pro MCP: Tutti gli strumenti restituiscono indirizzi e percorsi di database pronti per essere passati direttamente agli strumenti IDA Pro MCP
Installazione
1. Dipendenze
- Python 3.10+
- IDA Pro 8.x / 9.x (per esportazioni headless tramite
idat.exe) - Plugin Diaphora installato in IDA
- Claude Code (o qualsiasi altro client conforme a MCP)
2. Installazione del pacchetto
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
3. Configurazione dei percorsi
Il pacchetto tenta di trovare automaticamente IDA Pro e Diaphora nelle posizioni di installazione standard. Se non vengono trovati, è possibile impostare le seguenti variabili d'ambiente:
| Variabile | Descrizione | Esempio |
|---|---|---|
IDAT_PATH | Percorso completo per idat.exe | C:\Program Files\IDA Pro 9.3\idat.exe |
DIAPHORA_DIR | Cartella contenente diaphora.py | C:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1 |
DIAPHORA_OUTPUT_ROOT | Directory root consentita per i nuovi file di export | D:\\diaphora-outputs |
DIAPHORA_PYTHON | Interprete Python per il diff | /usr/bin/python3 (default a sys.executable) |
Per Claude Code, è possibile specificarle in ~/.claude.json (o nel file di configurazione corrispondente del proprio client 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: Per binari molto grandi (>100 MB), assicurarsi che
timeoutsia almeno 7200 (2 ore).
3.1. Codex e headless IDA MCP
Codex utilizza tipicamente due server MCP complementari:
diaphora-mcp— questo progetto: esportazione, diff Diaphora e analisi dei risultati;ida-pro-mcp— il server di ispezione IDA upstream peridb_open, decompilazione e analisi a livello di indirizzo.
idalib-mcp è il backend headless di ida-pro-mcp, non un server Diaphora separato. Dopo averlo installato, riavvia Codex:
uv run ida-pro-mcp --install codex --transport streamable-http --scope global --ida-rpc http://127.0.0.1:8745/mcp
Per questo progetto, una configurazione stdio è sufficiente:
[mcp_servers.diaphora-mcp]
command = "python"
args = ["D:\\path\\to\\diaphora-mcp\\diaphora_mcp_server.py"]
startup_timeout_sec = 120
4. Preparazione dei database per il diffing
IDA Pro deve prima analizzare i binari (creando file .i64 o .idb). Dopodiché:
┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")
Oppure esegui l'intero pipeline in un unico comando:
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
Non passare .i64 direttamente agli strumenti dei risultati: è un database IDA, non SQLite. Esportalo prima.
Avvio rapido
┃ # 1. Full pipeline: export two .i64 → diff → summary report
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
┃ # 2. If databases are already exported
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
┃ # 3. Security analysis of diff results
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
┃ # 4. Importance ranking of changes
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
┃ # 5. Find root-cause changes
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
┃ # 6. Detect probable security patches
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. Generate full report
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
Esempio (trascrizione di sessione live)
Vedi examples/basic-session.md per una trascrizione completa passo-passo di una sessione reale di Diaphora MCP — dall'esportazione di due database IDB al confronto di funzioni individuali. Disponibile anche in russo.
Ecco un'anteprima di ciò che il server restituisce:
Input — confronta due DLL SQLite3 (2015 vs 2023):
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
Output — riepilogo dopo export + diff:
{
"best_matches": 60,
"partial_matches": 993,
"multimatches": 52,
"unmatched_primary": 2647
}
La sessione esamina 6 chiamate a strumenti MCP, mostrando l'esatto JSON in/out per ogni passaggio, insieme al ragionamento dell'agente.
Investigazione di un singolo database
┃ # Get database export info
┃ get_export_info(db_path="app.sqlite")
┃ # Search for functions
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
┃ # Retrieve pseudocode
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")
Struttura del progetto
diaphora-mcp/
├── diaphora_mcp_server.py # Main entrypoint
├── diaphora_mcp/
│ ├── diaphora_mcp_server.py # MCP tool registration
│ ├── config.py # Path configuration and auto-detection
│ ├── models.py # Constants and models
│ ├── core/
│ │ ├── export.py # Headless export, batch pipeline
│ │ ├── diff.py # Diffing and .diaphora results reader
│ │ ├── analysis.py # Function search, compare, explain
│ │ ├── security.py # Keyword matching, patch detection
│ │ ├── ranking.py # Importance ranking
│ │ ├── graph.py # Callgraph, BFS call trees, root cause
│ │ ├── metadata.py # Metadata preparation (names, comments)
│ │ └── report.py # Overall patch report generation
│ └── utils/
│ ├── sqlite.py # SQLite helpers
│ ├── format.py # Pseudocode diff, feature vector extraction
│ └── log.py # Export logging utilities
├── _diaphora_headless.py # idat.exe -S thin wrapper
└── logs/ # Automated export logs (created dynamically)