
MCP Server für automatisiertes binäres Diffing.
Vergleiche zwei von IDA analysierte Binärdateien aus deinem KI-Assistenten heraus. Diaphora MCP exportiert die gespeicherten IDA-Datenbanken, führt Diaphora aus und ermöglicht der KI, entsprechende Funktionen und ihre Aufrufgraphen zu untersuchen.
Die Standardoberfläche bietet 10 Tools, die auf den Vergleich ausgerichtet sind. Diaphora liefert Übereinstimmungen; die KI liest den tatsächlichen Code und erklärt die Änderungen.
Schnellstart · Beispiele · Tools · Fehlerbehebung
old.i64 + new.i64 → headless export → SQLite exports + diff results
↓
summary → matched code → call graph
idat.exe/idat64 und ein installiertes Diaphora-Plugin..i64/.idb-Datenbanken gespeichert.IDA und Diaphora werden separat installiert. Die Diff-Schema-Validierung zielt derzeit auf Diaphora 3.4.1 ab; andere Schemata benötigen möglicherweise Kompatibilitätsaktualisierungen. Der für den Diff verwendete Python-Interpreter muss über die eigenständigen Abhängigkeiten von Diaphora verfügen.
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
Füge diesen Eintrag zur MCP-Konfiguration deines Clients hinzu. Ersetze die Repository-, IDA- und Diaphora-Pfade durch deine Installationspfade. Verwende die Python-Executable aus der Umgebung, in der du dieses Projekt installiert hast.
{
"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"
}
}
}
}
Der Client startet den Server über stdio; es gibt keinen separaten Webdienst zum Starten. Starte den MCP-Server neu, nachdem du seinen Code oder seine Umgebung geändert hast. Eine erfolgreiche Verbindung stellt die unten aufgeführten 10 Tools bereit.
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.
Wähle jedes Mal ein frisches Ausführungsverzeichnis. Vorhandene generierte Ziele werden niemals überschrieben.
Die folgenden JSON-Blöcke sind MCP-Tool-Argumente, keine Shell-Befehle. Dein Assistent kann die genannten Tools direkt aufrufen. Pfade und 0x401000 sind Beispiele; verwende die Pfade und Adressen, die von deinem eigenen Lauf zurückgegeben wurden.
Tool: batch_export_and_diff. Alt ist immer die erste Eingabe, neu die zweite.
{
"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
}
Dies behält Assembly-Details bei, ohne Hex-Rays zu erfordern. Wähle das benötigte Exportprofil:
| Detail | use_decompiler | summaries_only | Verwendung |
|---|---|---|---|
| Übereinstimmungszusammenfassungen | false | true | Schneller erster Durchlauf; kein detaillierter Code |
| Assembly | false | false | Disassembly ohne Decompiler vergleichen |
| Assembly + Pseudocode | true | false | Code-Review mit einem kompatiblen Hex-Rays-Decompiler; langsamer |
Entnimm die Ausgabepfade immer der Antwort:
OLD_SQLITE = steps.export1.output
NEW_SQLITE = steps.export2.output
RESULTS = steps.diff.output
Für dieses Beispiel sind die generierten Dateien old.diaphora.sqlite, new.diaphora.sqlite und old_vs_new.diaphora unter run-001. Gleiche Basisnamen der Eingaben erzeugen unterschiedliche Exportnamen old_/new_. Behalte cleanup=false für die spätere Funktionsuntersuchung bei.
Tool: get_diff_summary.
{
"results_path": "C:/diaphora-outputs/run-001/old_vs_new.diaphora"
}
Tool: get_diff_results. Diese Seite beginnt mit partiellen Übereinstimmungen mit niedrigerem Verhältnis.
{
"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 wählt eine Diaphora-Übereinstimmungskategorie aus, keine Garantie für eine Verhaltensänderung. Verwende match_type="all" für alle unterstützten Kategorien. Die Antwort enthält Kategoriezählungen, die gefilterte Gesamtzahl, Übereinstimmungen, nicht zugeordnete Zeilen, next_offset und next_unmatched_offset.
Um fortzufahren, kopiere die zurückgegebenen nächsten Offsets in den nächsten Aufruf und behalte dieselben Filter und dieselbe Sortierung bei. Wenn sie beispielsweise 50 und 50 sind, verwende offset=50 und unmatched_offset=50. Ein null-nächster-Offset bedeutet, dass diese Liste abgeschlossen ist; höre auf, sie weiterzuschieben. Die beiden Listen schreiten unabhängig voran. Seitengrößen müssen positiv sein und sind auf 5000 begrenzt. Verwende sort_order="desc", um die stärksten Übereinstimmungen zuerst zu untersuchen.
Tool: 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"
}
Die Antwort enthält function_old, function_new, verfügbares Assembly/Pseudocode, gemessene Unterschiede und Identitätsnachweise. Du kannst name anstelle von address verwenden. Wenn beide Selektoren angegeben werden, hat die Adresse Vorrang; lasse sie weg, wenn du nach Namen auswählst.
Tool: get_changed_callgraph akzeptiert dieselben Argumente wie oben. Es übersetzt entsprechende Aufrufer-/Aufgerufenen-Adressen, bevor Änderungen gemeldet werden, und trennt unaufgelöste Nachbarn von bestätigten Kantenunterschieden.
Bevorzuge 0x-präfixierte Adressen, um hexadezimale Eingaben explizit zu machen. Gib match_results_path an, wenn verfügbar: Es behandelt Rebasing und umbenannte Funktionen. Gleiche Adressen allein begründen keine Identität. Mehrdeutige oder fehlende Übereinstimmungen bleiben unaufgelöst, statt als Löschungen bezeichnet zu werden. Wenn du ein Paar manuell verifiziert hast, kannst du address2 oder name2 explizit angeben.
Tool: search_export_db. name_pattern verwendet SQL LIKE: % entspricht einer beliebigen Sequenz.
{
"db_path": "C:/diaphora-outputs/run-001/old.diaphora.sqlite",
"name_pattern": "%parse%",
"min_instructions": 20,
"limit": 20
}