
Serveur MCP pour le diffing binaire automatisé.
Diaphora MCP est un serveur MCP (Model Context Protocol) pour le diffing binaire automatisé. Il connecte Diaphora (le moteur de diffing) et IDA Pro (le désassembleur) via le protocole MCP, permettant à des agents d'IA (comme Claude Code) d'effectuer des comparaisons de fichiers binaires, de trouver des correctifs de sécurité et d'analyser des changements.
.i64 / .idb analysées au format SQLite de Diaphora (via le mode headless idat.exe)idat.exe)git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
Le paquet essaie de trouver automatiquement IDA Pro et Diaphora dans les emplacements d'installation standard. S'ils ne sont pas trouvés, vous pouvez définir les variables d'environnement suivantes :
| Variable | Description | Exemple |
|---|---|---|
IDAT_PATH | Chemin complet vers idat.exe | C:\Program Files\IDA Pro 9.3\idat.exe |
DIAPHORA_DIR | Dossier contenant diaphora.py | C:\Program Files\IDA Pro 9.3\plugins\diaphora-3.4.1 |
DIAPHORA_OUTPUT_ROOT | Répertoire racine autorisé pour les nouveaux fichiers d'export | D:\\diaphora-outputs |
DIAPHORA_PYTHON | Interpréteur Python pour le diff | /usr/bin/python3 (par défaut sys.executable) |
Pour Claude Code, vous pouvez les spécifier dans ~/.claude.json (ou le fichier de configuration correspondant de votre 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
}
}
}
Remarque : Pour les très gros binaires (>100 Mo), assurez-vous que
timeoutest d'au moins 7200 (2 heures).
Codex utilise généralement deux serveurs MCP complémentaires :
diaphora-mcp — ce projet : export, diff Diaphora et analyse des résultats ;ida-pro-mcp — le serveur d'inspection IDA en amont pour idb_open, la décompilation et l'analyse au niveau des adresses.idalib-mcp est le backend sans tête de ida-pro-mcp, pas un serveur Diaphora distinct. Après l'avoir installé, redémarrez Codex :
uv run ida-pro-mcp --install codex --transport streamable-http --scope global --ida-rpc http://127.0.0.1:8745/mcp
Pour ce projet, une configuration stdio est suffisante :
[mcp_servers.diaphora-mcp]
command = "python"
args = ["D:\\path\\to\\diaphora-mcp\\diaphora_mcp_server.py"]
startup_timeout_sec = 120
IDA Pro doit d'abord analyser les binaires (en créant des fichiers .i64 ou .idb). Après cela :
┃ export_idb_to_diaphora(idb_path="old_version.i64")
┃ export_idb_to_diaphora(idb_path="new_version.i64")
Ou exécutez le pipeline complet en une seule commande :
┃ batch_export_and_diff(idb1="old.i64", idb2="new.i64")
Ne transmettez pas directement .i64 aux outils de résultats : c'est une base de données IDA, pas SQLite. Exportez-la d'abord.
┃ # 1. Pipeline complet : exporter deux .i64 → diff → rapport de synthèse
┃ batch_export_and_diff(idb1="v1.0.i64", idb2="v1.1.i64")
┃ # 2. Si les bases sont déjà exportées
┃ diff_diaphora_dbs(db1="v1.0.sqlite", db2="v1.1.sqlite")
┃ # 3. Analyse de sécurité des résultats du diff
┃ analyze_diff_results(results_path="v1.0_vs_v1.1.diaphora")
┃ # 4. Classement par importance des modifications
┃ rank_changes(results_path="v1.0_vs_v1.1.diaphora", top_n=20)
┃ # 5. Trouver les causes racines des modifications
┃ find_patch_root(results_path="v1.0_vs_v1.1.diaphora")
┃ # 6. Détecter les correctifs de sécurité probables
┃ detect_security_patches(results_path="v1.0_vs_v1.1.diaphora")
┃ # 7. Générer un rapport complet
┃ summarize_patch(results_path="v1.0_vs_v1.1.diaphora")
Voir examples/basic-session.md pour une transcription complète étape par étape d'une session réelle Diaphora MCP — de l'export de deux bases IDB à la comparaison de fonctions individuelles. Également disponible en russe.
Voici un aperçu de ce que renvoie le serveur :
Entrée — comparer deux DLL SQLite3 (2015 vs 2023) :
{"idb1_path": "old.i64", "idb2_path": "new.i64", "use_decompiler": false}
Sortie — résumé après export + diff :
{
"best_matches": 60,
"partial_matches": 993,
"multimatches": 52,
"unmatched_primary": 2647
}
La session parcourt 6 appels d'outils MCP, montrant le JSON exact d'entrée/sortie pour chaque étape, avec le raisonnement de l'agent.
┃ # Obtenir les informations d'export de la base
┃ get_export_info(db_path="app.sqlite")
┃ # Rechercher des fonctions
┃ search_export_db(db_path="app.sqlite", name_pattern="%crypt%", min_instructions=50)
┃ # Récupérer le pseudocode
┃ get_function_pseudocode(db_path="app.sqlite", address="401000")