
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 :
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")
diaphora-mcp/
├── diaphora_mcp_server.py # Point d'entrée principal
├── diaphora_mcp/
│ ├── diaphora_mcp_server.py # Enregistrement des outils MCP
│ ├── config.py # Configuration des chemins et détection automatique
│ ├── models.py # Constantes et modèles
│ ├── core/
│ │ ├── export.py # Export sans tête, pipeline par lots
│ │ ├── diff.py # Diffing et lecteur de résultats .diaphora
│ │ ├── analysis.py # Recherche, comparaison, explication de fonctions
│ │ ├── security.py # Correspondance de mots-clés, détection de correctifs
│ │ ├── ranking.py # Classement par importance
│ │ ├── graph.py # Graphe d'appels, arbres d'appels BFS, cause racine
│ │ ├── metadata.py # Préparation des métadonnées (noms, commentaires)
│ │ └── report.py # Génération de rapport de correctif global
│ └── utils/
│ ├── sqlite.py # Aides SQLite
│ ├── format.py # Diff de pseudocode, extraction de vecteurs de caractéristiques
│ └── log.py # Utilitaires de journalisation d'export
├── _diaphora_headless.py # Wrapper léger idat.exe -S
└── logs/ # Journaux d'export automatisés (créés dynamiquement)
| Outil | Description |
|---|---|
export_idb_to_diaphora | Exporte une base .i64/.idb au format SQLite en utilisant IDA sans tête |
batch_export_and_diff | Pipeline complet : exporter primaire → exporter secondaire → diff → résumé |
| Outil | Description |
|---|---|
diff_diaphora_dbs | Différencie deux bases SQLite Diaphora exportées |
get_diff_results | Lit un fichier de diff .diaphora avec filtrage |
get_diff_summary | Renvoie les statistiques de correspondance |
| Outil | Description |
|---|---|
detect_security_patches | Détecte les correctifs de sécurité probables (vérifications de limites, sécurité mémoire, anti-débogage, etc.) |
| Outil | Description |
|---|---|
rank_changes | Classe les fonctions modifiées par importance (score 0-100) |
| Outil | Description |
|---|---|
get_changed_callgraph | Compare les appels entrants et sortants d'une fonction |
compare_call_path | Parcourt le graphe d'appels depuis une fonction (comparaison de chemins d'appel BFS, jusqu'à N niveaux) |
find_patch_root | Détecte les fonctions racines provoquant des cascades d'appels |
| Outil | Description |
|---|---|
performance_report | Renvoie les statistiques agrégées de mémoire, cache et connexion |
| Outil | Description |
|---|---|
transfer_metadata | Prépare les noms, commentaires et prototypes pour un transfert en masse |
Le projet inclut une intégration intégrée avec les sessions actives de l'interface graphique IDA Pro, permettant des exports instantanés directement depuis les fenêtres IDA actives sans conflits de verrouillage de base de données.
plugins/ d'IDA Pro. Il démarrera un serveur XML-RPC en arrière-plan sur le port 28652 à chaque démarrage d'IDA.export_idb_to_diaphora, le serveur MCP vérifie le port 28652. Si une session est active, il exécute l'export directement dans l'interface graphique. Sinon, il revient automatiquement à l'exécution en arrière-plan sans tête via idat.exe.Pour des instructions détaillées sur la configuration du pont, voir GUI_INSTRUCTIONS.md.
Lors du traitement de projets extrêmement volumineux, Diaphora MCP applique des optimisations spécifiques :
100000 (sys.setrecursionlimit) pour éviter les plantages lors de grandes traversées de graphes d'appels.diaphora_config.py, définir COMMIT_AFTER_EACH_GUI_UPDATE = False réduit les écritures sur disque, accélérant l'export graphique de 2 à 3 fois.EXPORTING_USE_MICROCODE = False dans la configuration Diaphora) pour un export plus rapide lorsque le décompilateur n'est pas strictement nécessaire.Les outils comme analyze_diff_results, compare_functions et find_function_match renvoient un bloc ida_pro_mcp contenant les adresses et les chemins. Ces informations peuvent être transmises directement aux outils ida-pro-mcp :
┃ # 1. Diaphora trouve une fonction suspecte
┃ analyze_diff_results(results_path="diff.diaphora")
┃ → addr1="401000", db1="old.sqlite"
┃ # 2. IDA Pro MCP la décompile
┃ decompile_function(address="401000")
Pour voir Diaphora MCP en action, consultez les exemples suivants :
Si vous êtes un assistant de codage IA (comme Claude Code) utilisant ce protocole, gardez à l'esprit les règles de compatibilité suivantes :
Schémas d'export graphique vs sans tête :
ida_mcp.py) produit un schéma personnalisé contenant des tables comme calls, strings, structures, mais pas de table program.idat.exe) produit le schéma officiel Diaphora contenant la table program.diff_diaphora_dbs) nécessite le schéma officiel. Exportez toujours sans tête si vous prévoyez de comparer/différencier des bases.Bases verrouillées dans l'interface graphique :
Évitez les collisions de noms de bases :
<basename>.diaphora.sqlite.Les fixtures vérifiées sous IDA Pro 9.3 passent la suite de régression : 16 passed, 1 xpassed. Un export réel en conditions réelles et un diff Diaphora de deux DLL SQLite3 ont également été vérifiés. Les IDB volumineuses ou ouvertes dans l'interface graphique nécessitent toujours un verrou IDA libre, un DIAPHORA_OUTPUT_ROOT valide et un délai d'attente client MCP suffisamment grand.
MIT
| 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) |
| Outil | Description |
|---|
analyze_diff_results | Filtre les résultats à l'aide de mots-clés de sécurité et de filtres |
compare_functions | Comparaison côte à côte d'une fonction dans les deux bases |
find_function_match | Fait correspondre une fonction dans le second binaire avec des métriques de confiance |
explain_similarity | Décompose les facteurs de similarité (mnémoniques, CFG, constantes, prototype, hash) |
detect_behavior_change | Fournit un résumé en langage naturel des changements de logique de fonction |
summarize_patch | Produit un rapport de mise à jour complet |
search_export_db | Interroge les fonctions exportées par nom/instructions/complexité |
get_function_pseudocode | Récupère le pseudocode et les métadonnées d'une fonction |
get_export_info | Récupère les métadonnées générales de la base |
<basename>.sqlite pour les exports Diaphora, car cela entre en conflit avec la base de cache interne créée par le superviseur ida-pro-mcp.