
diaphora-mcp v1.0.5
Serveur MCP pour le diffing binaire automatisé.
Diaphora MCP
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.
Fonctionnalités
- Export : Convertit les bases de données
.i64/.idbanalysées au format SQLite de Diaphora (via le mode headlessidat.exe) - Diffing : Compare deux bases exportées, filtre les résultats par type de correspondance et ratio
- Analyse de vulnérabilité : Recherche les changements liés à la sécurité à l'aide de mots-clés et d'heuristiques
- Détection de correctifs : Détecte automatiquement les nouvelles vérifications de limites, les vérifications nulles, la gestion des erreurs et les changements cryptographiques
- Classement : Classe les fonctions modifiées par ordre d'importance en fonction du CFG, des sauts de complexité et des indicateurs de sécurité
- Graphe d'appels : Compare les chemins d'appel (BFS, jusqu'à N niveaux) et détecte les causes racines dans les cascades d'appels
- Transfert de métadonnées : Prépare les noms, commentaires et prototypes pour le transfert entre bases de données
- Intégration IDA Pro MCP : Tous les outils renvoient des adresses et des chemins de base prêts à être transmis directement aux outils IDA Pro MCP
Installation
1. Dépendances
- Python 3.10+
- IDA Pro 8.x / 9.x (pour les exports headless via
idat.exe) - Plugin Diaphora installé dans IDA
- Claude Code (ou tout autre client compatible MCP)
2. Installation du paquet
git clone https://github.com/xTeardx/diaphora-mcp.git
cd diaphora-mcp
pip install -e .
3. Configuration des chemins
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).
3.1. Codex et IDA MCP sans tête
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 pouridb_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
4. Préparation des bases de données pour le diffing
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.
Démarrage rapide
┃ # 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")
Exemple (transcription de session en direct)
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.
Investigation d'une seule base de données
┃ # 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")
Structure du projet
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)
Référence des outils MCP (21 outils)
Export
| 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é |
Diff
| 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 |
Analyse
| 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 |
Sécurité
| 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.) |
Classement
| Outil | Description |
|---|---|
rank_changes | Classe les fonctions modifiées par importance (score 0-100) |
Graphe d'appels
| 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 |
Performance
| Outil | Description |
|---|---|
performance_report | Renvoie les statistiques agrégées de mémoire, cache et connexion |
Métadonnées
| Outil | Description |
|---|---|
transfer_metadata | Prépare les noms, commentaires et prototypes pour un transfert en masse |
Intégration avec l'interface graphique IDA Pro (pont XML-RPC)
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.
- Démarrage automatique : Copiez diaphora_gui_listener.py dans votre répertoire
plugins/d'IDA Pro. Il démarrera un serveur XML-RPC en arrière-plan sur le port28652à chaque démarrage d'IDA. - Export intelligent : Lors de l'appel à
export_idb_to_diaphora, le serveur MCP vérifie le port28652. 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 viaidat.exe.
Pour des instructions détaillées sur la configuration du pont, voir GUI_INSTRUCTIONS.md.
Gestion des bases de données gigantesques (100k+ fonctions)
Lors du traitement de projets extrêmement volumineux, Diaphora MCP applique des optimisations spécifiques :
- Limite de récursion : La limite de récursion Python est automatiquement relevée à
100000(sys.setrecursionlimit) pour éviter les plantages lors de grandes traversées de graphes d'appels. - Optimisations des transactions SQLite : Dans votre
diaphora_config.py, définirCOMMIT_AFTER_EACH_GUI_UPDATE = Falseréduit les écritures sur disque, accélérant l'export graphique de 2 à 3 fois. - Microcode Hex-Rays : Désactivez l'export du microcode (
EXPORTING_USE_MICROCODE = Falsedans la configuration Diaphora) pour un export plus rapide lorsque le décompilateur n'est pas strictement nécessaire.
Intégration IDA Pro MCP
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")
Exemples
Pour voir Diaphora MCP en action, consultez les exemples suivants :
- Transcription de session de base : Une présentation pas à pas d'une session MCP réelle avec les entrées/sorties JSON exactes pour chaque appel d'outil — de l'export à la comparaison de fonctions. Également disponible en russe.
Instructions pour les agents IA (Important)
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 :
- L'export via une session graphique active (plugin
ida_mcp.py) produit un schéma personnalisé contenant des tables commecalls,strings,structures, mais pas de tableprogram. - L'export sans tête (via
idat.exe) produit le schéma officiel Diaphora contenant la tableprogram. - Crucial : Le moteur de diff (
diff_diaphora_dbs) nécessite le schéma officiel. Exportez toujours sans tête si vous prévoyez de comparer/différencier des bases.
- L'export via une session graphique active (plugin
-
Bases verrouillées dans l'interface graphique :
- Une base de données actuellement ouverte dans l'interface graphique IDA Pro est verrouillée. Tenter de l'exporter sans tête échouera.
- Si vous devez différencier la base actuellement ouverte, demandez à l'utilisateur de la fermer dans l'interface graphique (ou d'ouvrir une base factice) pour libérer le verrou du fichier, puis déclenchez un export sans tête.
-
Évitez les collisions de noms de bases :
- Les bases d'export Diaphora sont nommées par défaut
<basename>.diaphora.sqlite. - N'utilisez jamais
<basename>.sqlitepour les exports Diaphora, car cela entre en conflit avec la base de cache interne créée par le superviseurida-pro-mcp.
- Les bases d'export Diaphora sont nommées par défaut
Statut de vérification et limitations
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.
Licence
MIT