
Server MCP per il diffing binario automatico.
Confronta due binari analizzati con IDA dal tuo assistente AI. Diaphora MCP esporta i database IDA salvati, esegue Diaphora e consente all'AI di ispezionare le funzioni corrispondenti e i loro call graph.
L'interfaccia predefinita dispone di 10 strumenti incentrati sul confronto. Diaphora fornisce le corrispondenze; l'AI legge il codice effettivo e spiega le modifiche.
Avvio rapido · Esempi · Strumenti · Risoluzione dei problemi
old.i64 + new.i64 → headless export → SQLite exports + diff results
↓
summary → matched code → call graph
idat.exe/idat64 e un plugin Diaphora installato..i64/.idb.IDA e Diaphora vengono installati separatamente. La validazione dello schema di diff attualmente è mirata a Diaphora 3.4.1; altri schemi potrebbero richiedere aggiornamenti di compatibilità. L'interprete Python utilizzato per il diff deve avere installate le dipendenze standalone di Diaphora.
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
New-Item -ItemType Directory -Force C:\diaphora-outputs | Out-Null
Aggiungi questa voce alla configurazione MCP del tuo client. Sostituisci i percorsi del repository, di IDA e di Diaphora con i tuoi percorsi di installazione. Usa l'eseguibile Python dell'ambiente in cui hai installato questo progetto.
{
"mcpServers": {
"diaphora": {
"command": "C:/src/diaphora-mcp/.venv/Scripts/python.exe",
"args": ["C:/src/diaphora-mcp/diaphora_mcp_server.py"],
"env": {
"IDAT_PATH": "C:/Program Files/IDA Professional 9.3/idat.exe",
"DIAPHORA_DIR": "C:/Program Files/IDA Professional 9.3/plugins/diaphora",
"DIAPHORA_OUTPUT_ROOT": "C:/diaphora-outputs"
}
}
}
}
Il client avvia il server tramite stdio; non c'è alcun servizio web separato da avviare. Riavvia il server MCP dopo aver modificato il suo codice o l'ambiente. Una connessione riuscita espone i 10 strumenti elencati di seguito.
Use Diaphora to compare C:/analysis/old.i64 (old) against
C:/analysis/new.i64 (new). Save output under C:/diaphora-outputs/run-001.
Export headlessly with assembly detail, keep the exports, show a summary,
then inspect partial matches and explain the code changes in the interesting
functions. Use the result mapping when comparing functions and call graphs.
Scegli ogni volta una directory di esecuzione nuova. I target generati esistenti non vengono mai sovrascritti.
I seguenti blocchi JSON sono argomenti degli strumenti MCP, non comandi shell. Il tuo assistente può chiamare direttamente gli strumenti indicati. I percorsi e 0x401000 sono esempi; usa i percorsi e gli indirizzi restituiti dalla tua esecuzione.
Strumento: batch_export_and_diff. Il vecchio è sempre il primo input, il nuovo il secondo.
{
"idb1_path": "C:/analysis/old.i64",
"idb2_path": "C:/analysis/new.i64",
"output_dir": "C:/diaphora-outputs/run-001",
"export_mode": "headless",
"use_decompiler": false,
"summaries_only": false,
"cleanup": false,
"limit": 100,
"unmatched_limit": 50
}
Questo mantiene il dettaglio dell'assembly senza richiedere Hex-Rays. Seleziona il profilo di esportazione di cui hai bisogno:
| Dettaglio | use_decompiler | summaries_only | Uso |
|---|---|---|---|
| Riepiloghi delle corrispondenze | false | true | Prima passata veloce; nessun codice dettagliato |
| Assembly | false | false | Confronta il disassembly senza un decompilatore |
| Assembly + pseudocodice | true | false | Revisione del codice con un decompilatore Hex-Rays compatibile; più lento |
Prendi sempre i percorsi di output dalla risposta:
OLD_SQLITE = steps.export1.output
NEW_SQLITE = steps.export2.output
RESULTS = steps.diff.output
Per questo esempio, i file generati sono old.diaphora.sqlite, new.diaphora.sqlite e old_vs_new.diaphora sotto run-001. Nomi di base degli input uguali producono nomi di esportazione distinti old_/new_. Mantieni cleanup=false per l'ispezione successiva delle funzioni.
Strumento: get_diff_summary.
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
Strumento: get_diff_results. Questa pagina inizia con le corrispondenze parziali a rapporto più basso.
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora",
"match_type": "partial",
"min_ratio": 0.0,
"limit": 50,
"offset": 0,
"unmatched_limit": 50,
"unmatched_offset": 0,
"sort_by": "ratio",
"sort_order": "asc"
}
partial seleziona una categoria di corrispondenza di Diaphora, non garantisce un cambiamento comportamentale. Usa match_type="all" per tutte le categorie supportate. La risposta include i conteggi per categoria, il totale filtrato, le corrispondenze, le righe non corrispondenti, next_offset e next_unmatched_offset.
Per continuare, copia gli offset successivi restituiti nella chiamata successiva, mantenendo gli stessi filtri e l'ordinamento. Ad esempio, se sono 50 e 50, usa offset=50 e unmatched_offset=50. Un offset successivo null significa che quella lista è terminata; smetti di avanzarla. Le due liste procedono in modo indipendente. Le dimensioni di pagina devono essere positive e sono limitate a 5000. Usa sort_order="desc" per ispezionare prima le corrispondenze più forti.
Strumento: compare_functions.
{
"db1_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"db2_path": "C:/diaphora-outputs/run-001/new.diaphora.sqlite",
"address": "0x401000",
"match_results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
La risposta contiene function_old, function_new, assembly/pseudocodice disponibili, differenze misurate e prove di identità. Puoi usare name invece di address. Se vengono forniti entrambi i selettori, l'indirizzo ha la precedenza; omettilo quando selezioni per nome.
Strumento: get_changed_callgraph accetta gli stessi argomenti di cui sopra. Traduce gli indirizzi corrispondenti di chiamanti/chiamati prima di segnalare le modifiche, e separa i vicini non risolti dalle differenze di edge confermate.
Preferisci indirizzi con prefisso 0x per rendere esplicito l'input esadecimale. Fornisci match_results_path quando disponibile: gestisce il rebasing e le funzioni rinominate. Indirizzi uguali da soli non stabiliscono l'identità. Le corrispondenze ambigue o mancanti rimangono non risolte anziché essere chiamate eliminazioni. Se hai verificato manualmente una coppia, puoi fornire esplicitamente address2 o name2.
Strumento: search_export_db. name_pattern usa SQL LIKE: % corrisponde a qualsiasi sequenza.
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"name_pattern": "%parse%",
"min_instructions": 20,
"limit": 20
}
Strumento: get_function_pseudocode restituisce lo pseudocodice disponibile e l'assembly, nonostante il nome.