Projets d’obfuscation
Un projet d’obfuscation réunit les assemblies à protéger, leurs dépendances et les paramètres de chacun. Babel Desktop le présente sous forme de graphe sur un canevas et l’exécute avec le moteur de Babel Obfuscator.
Babel Desktop enregistre les projets sous forme de fichiers .babel, le format de projet MSBuild qu’utilise la tâche MSBuild. Vous pouvez générer avec MSBuild un projet enregistré dans l’application, et ouvrir dans l’application un projet .babel existant.
Créer un projet
Ajouter les assemblies
Cliquez sur Ajouter des assemblies dans l’écran d’accueil ou sur + Ajouter un assembly dans la barre d’outils du canevas (Ctrl+Shift+A, Cmd+Shift+A sous macOS), ou faites glisser des assemblies .NET du gestionnaire de fichiers vers le canevas. Chaque assembly devient une cible principale : un nœud du canevas que le moteur obfusque.
Relier les dépendances
Ajoutez les assemblies qui sont fusionnés dans une cible, incorporés à celle-ci ou référencés par elle, comme décrit dans Dépendances.
Configurer chaque cible
Sélectionnez un nœud et ouvrez le panneau des propriétés pour modifier ses paramètres et ses règles XML. Voir Paramètres de la cible.
Enregistrer et exécuter
Enregistrez le projet avec Fichier > Enregistrer (Ctrl+S, Cmd+S sous macOS), puis cliquez sur Exécuter le projet (Ctrl+Enter, Cmd+Enter sous macOS). Enregistrer écrit le fichier .babel ouvert et ne demande un nom de fichier que pour un nouveau projet. Pour enregistrer une copie sous un autre nom, utilisez Fichier > Enregistrer sous… (Ctrl+Shift+S, Cmd+Shift+S sous macOS).
Pour repartir de zéro, utilisez Projet : nouveau (Ctrl+N) ou le bouton Nouveau projet du canevas. Dans la palette de commandes, Projet : Ouvrir un récent… rouvre un projet récent, et la boîte de dialogue Ouvrir un projet s’ouvre sur le dossier du dernier projet ouvert. Si le projet en cours contient des modifications non enregistrées, Babel Desktop vous demande s’il faut les abandonner avant d’en créer ou d’en ouvrir un autre. Attendez d’abord la fin de la tâche en cours, s’il y en a une.
Le canevas du projet
Le canevas représente chaque assembly par un nœud. Pour vous déplacer, faites glisser l’arrière-plan, tournez la molette ou balayez avec deux doigts. Pour zoomer autour du pointeur, pincez ou maintenez Ctrl (Cmd sous macOS) pendant le défilement. Les boutons de zoom et Ajuster la vue cadrent le graphe. Faites glisser les nœuds pour les disposer, ou laissez Affichage > Disposer le graphe automatiquement (Ctrl+Shift+L, Cmd+Shift+L sous macOS) placer les cibles de gauche à droite dans l’ordre d’exécution, les dépendances de chaque cible étant empilées à sa gauche. La position des nœuds est enregistrée dans le fichier de projet.



Une cible principale avec quatre assemblies fusionnés
Laissez le pointeur une demi-seconde sur un nœud, ou atteignez-le au clavier, pour ouvrir sa carte. La carte d’une cible principale indique son état, son ordre d’exécution, le nombre d’assemblies qu’elle fusionne, incorpore et référence, ses liens de mappage et le chemin du fichier d’entrée. Après une exécution, elle affiche aussi le score d’obfuscation.
Dépendances
Les points d’ancrage supérieur et inférieur d’un nœud relient les dépendances. Faites glisser du point d’ancrage inférieur de l’assembly source vers le point d’ancrage supérieur de la cible, ou cliquez sur les deux points l’un après l’autre. Une nouvelle dépendance reçoit l’un des trois types suivants :
| Type | Effet |
|---|---|
| Fusionner | L’assembly source est fusionné dans la cible et obfusqué avec elle, ce qui produit un seul assembly de sortie. Voir Fusion des assemblies. |
| Incorporer | L’assembly source est stocké comme ressource de la cible et chargé à l’exécution. Voir Incorporation des assemblies. |
| Référence | L’assembly source sert uniquement à résoudre les références de la cible. |
Babel Desktop choisit le type à votre place. Si la cible référence l’identité exacte de l’assembly source (nom, version, culture et jeton de clé publique), la nouvelle dépendance est de type Fusionner ; sinon, elle est de type Référence. Pour changer de type, cliquez sur la ligne de la dépendance, choisissez Fusionner, Incorporer ou Référence dans la fenêtre contextuelle, puis cliquez sur Appliquer. Dans la palette de commandes, la commande Assembly : ajouter une dépendance automatiquement… et les commandes Assembly : ajouter entrée de fusion…, Assembly : ajouter assembly incorporé… et Assembly : ajouter référence… ajoutent des dépendances à partir d’un sélecteur de fichiers.
Un assembly utilisé comme entrée de fusion reste sur le canevas, mais il n’est pas obfusqué séparément, puisqu’il est intégré à sa destination.
Ordre d’exécution et fichiers de mappage
Les points d’ancrage gauche et droit relient deux cibles pour que l’une s’exécute avant l’autre. Faites glisser du point d’ancrage droit de la première cible vers le point d’ancrage gauche de la seconde. Babel Desktop demande alors à quoi sert la connexion :
| Choix | Effet |
|---|---|
| Ordre d’exécution uniquement | Une arête de flux : la cible A s’exécute avant la cible B. Rien n’est transmis de A à B. |
| Transmettre le fichier de map | Un lien de mappage, tracé avec une étiquette MAP : A écrit son fichier de mappage XML des renommages et B le lit, si bien que B utilise les nouveaux noms des symboles publics de A. A s’exécute avant B. Voir Renommage entre assemblies. |
Un lien de mappage active Generate Map Out File pour la première cible et ajoute son fichier de mappage aux Map In Files de la seconde. Si la première cible ne définit ni chemin de sortie ni chemin de fichier de mappage, son fichier de mappage est écrit à un emplacement fixe à côté de son fichier d’entrée, par exemple BabelOut/Library2.dll.map.xml, de sorte que la seconde cible le trouve toujours. Les liens de mappage ne sont pas stockés à part : Babel Desktop les déduit de ces deux paramètres, et un projet écrit à la main ou avec Babel UI affiche donc lui aussi ses liens de mappage.
Chaque nœud affiche son étape, c’est-à-dire la position à laquelle il s’exécute dans son flux. Un flux est un groupe de cibles reliées entre elles par des arêtes de flux, des liens de mappage ou des dépendances de fusion, d’incorporation et de référence. Les cibles qui ne sont pas reliées entre elles forment des flux distincts. À l’intérieur d’un flux, les cibles s’exécutent dans l’ordre des étapes et, lorsque rien ne le détermine, dans l’ordre du projet. Les arêtes de flux sont enregistrées dans le projet comme des dépendances standard entre cibles MSBuild.
Babel Desktop rejette les liens d’une cible vers elle-même et les arêtes en double, et refuse toute connexion qui obligerait des cibles à s’attendre mutuellement. Si les cibles d’un projet ouvert depuis le disque attendent chacune le fichier de mappage de l’autre, le projet s’ouvre tout de même. Babel Desktop affiche une erreur qui nomme le cycle, par exemple Library1.dll → Library2.dll → Library1.dll, et le projet ne s’exécute pas tant que vous n’avez pas supprimé l’un des liens. Pour supprimer une arête ou un lien de mappage, cliquez dessus et appuyez sur Delete ou Backspace ; Esc annule une connexion en cours de tracé ou efface la sélection.
Remplacer une entrée
Pour faire pointer une cible vers une nouvelle génération de son assembly sans perdre ses paramètres, sélectionnez le nœud et exécutez Assembly : remplacer l’entrée et conserver les paramètres… depuis la palette de commandes. Assembly : retirer la cible sélectionnée retire une cible et ses arêtes.
Commandes de configuration
Trois commandes de la palette de commandes configurent un projet en une seule opération. Ajoutez d’abord les assemblies, puis exécutez la commande adaptée à l’application.



Les commandes de configuration dans la palette de commandes
| Commande | Effet |
|---|---|
| Obfuscation : configurer la fusion dans l’assembly principal | Fusionne toutes les autres cibles dans l’assembly principal, de sorte que le projet produit un seul fichier de sortie. L’assembly principal est le seul .exe du projet, ou la première cible s’il n’y en a aucun ou s’il y en a plusieurs. Un assembly que le moteur ne peut pas fusionner est laissé tel quel. |
| Obfuscation : configurer l’obfuscation publique (tous les assemblies) | Prépare un ensemble d’assemblies distribués ensemble pour que leurs symboles publics soient renommés. Chaque cible reçoit une règle XML nommée obfuscate public et écrit son fichier de mappage, et une cible qui dépend d’une autre lit le fichier de mappage de celle-ci au moyen d’un lien de mappage. |
| Obfuscation : définir le niveau… | Applique l’un des trois niveaux de protection à la cible sélectionnée. |
Les niveaux définissent les options suivantes et laissent les autres inchangées :
| Niveau | Protection |
|---|---|
| Léger | Renommage des types, méthodes, champs, propriétés et événements. Le flux de contrôle, les fonctions de chiffrement et les protections anti-analyse sont désactivés. |
| Équilibré | Renommage, obfuscation du flux de contrôle avec l’algorithme goto, chiffrement des chaînes et blocage d’ILDASM. |
| Maximal | Renommage, obfuscation du flux de contrôle avec goto, switch, case, if et l’état chaîné, chiffrement des chaînes avec l’algorithme stream, chiffrement des valeurs, chiffrement MSIL, détection de falsification, protection contre le débogage et blocage d’ILDASM. Si la licence n’inclut pas l’algorithme stream, le chiffrement des chaînes par défaut est utilisé. |
Les deux commandes de configuration ignorent les cibles de type paquet (.apk, .appx et .xap). Aucune des trois ne s’exécute tant qu’une tâche est en cours ou qu’une modification attend d’être appliquée. Elles modifient le projet ouvert sans l’enregistrer, ce qui vous permet de vérifier d’abord le résultat sur le canevas et dans le panneau des propriétés. Appliquer un niveau inférieur après un niveau supérieur désactive de nouveau les protections supplémentaires.
Paramètres de la cible
Pour ouvrir le panneau des propriétés, sélectionnez un nœud et cliquez sur le bouton Propriétés en haut à droite du canevas, ou appuyez sur Enter lorsqu’un nœud est sélectionné. L’onglet Paramètres répertorie toutes les options Babel Obfuscator de la cible sélectionnée, regroupées en Renommage, Flux de contrôle, Chiffrement du code, Optimisation, Signature et protection, Fichiers et dépendances, Output & diagnostics et Advanced. Saisissez du texte dans Rechercher un paramètre pour filtrer la liste.



Le panneau des propriétés de la cible sélectionnée
Les paramètres portent les noms d’options de la tâche MSBuild ; leur effet est décrit dans la référence de la tâche Babel et dans les pages consacrées à chaque protection. Chaque option dispose d’un contrôle adapté à son type : cases à cocher pour les options à deux états, listes pour les algorithmes, sélecteurs de fichiers et de dossiers pour les chemins, éditeurs pour les filtres et les tables de propriétés.



Paramètres de chiffrement du code : chiffrement des chaînes, chiffrement MSIL et chiffrement des valeurs
Les options composites, comme Control Flow Obfuscation, affichent un contrôle par propriété. L’image suivante montre les options du flux de contrôle. La dernière, chain, active l’algorithme d’état chaîné de l’édition Ultimate.



Les propriétés de Control Flow Obfuscation
Les mots de passe, par exemple celui d’une clé de signature ou d’un fichier de mappage, ne sont conservés que pour la session en cours. Ils ne sont jamais écrits dans le fichier de projet, et vous devez les saisir à nouveau après un redémarrage. Lorsque le moteur a besoin d’un mot de passe pendant une exécution, Babel Desktop vous le demande.
Babel Desktop préserve les parties d’un fichier .babel qu’il ne modifie pas, comme les commentaires, les propriétés personnalisées et les tâches MSBuild personnalisées. Il n’évalue ni les imports, ni les conditions, ni les tâches personnalisées de MSBuild : un projet qui en dépend doit être généré avec MSBuild.
Fichiers de mappage
Le groupe Fichiers map du panneau des propriétés réunit les paramètres de mappage de la cible sélectionnée :
- Écrit sa map de renommage active ou désactive le fichier de mappage de la cible. Le chemin affiché en dessous indique où le fichier est écrit, par défaut à côté de l’assembly obfusqué ; Modifier… permet de choisir un autre fichier.
- Maps d’autres cibles répertorie les liens de mappage qui aboutissent à cette cible. Cliquez sur le nom d’une cible pour la sélectionner.
- Autres fichiers de map répertorie les fichiers de mappage que cette cible lit et qu’aucune cible du projet n’écrit, par exemple celui d’une bibliothèque obfusquée lors d’un build précédent. Ajouter un fichier de map… en ajoute un et Retirer l’enlève.
Règles XML
L’onglet Règles XML permet de modifier les règles d’obfuscation XML intégrées de la cible sélectionnée. L’éditeur applique la coloration syntaxique au XML, et Valider le vérifie par rapport au schéma des règles Babel en indiquant la ligne et la colonne de chaque erreur. Ouvrir le XML charge un fichier de règles dans l’éditeur, Enregistrer le fichier XML écrit le contenu de l’éditeur dans un fichier et Appliquer à l’assembly enregistre les règles dans la cible. Les règles incluses sont enregistrées dans le fichier de projet.



Les règles XML intégrées d’une cible
Plugins du moteur
Les plugins Babel Obfuscator se définissent pour chaque cible avec Plugins du moteur : configurer les chemins des DLL. Plugins du moteur : découvrir les noms d’arguments lit les noms d’arguments que déclare un plugin, ce qui vous permet de renseigner ses arguments. Comme les plugins sont du code .NET qui s’exécute dans le moteur, n’utilisez que des plugins auxquels vous faites confiance.
Exécuter le projet
Cliquez sur Exécuter le projet en haut à droite du canevas, appuyez sur Ctrl+Enter (Cmd+Enter sous macOS) ou choisissez Exécution > Lancer l’obfuscation. Sauf si une cible définit son propre chemin de sortie, l’assembly obfusqué est écrit dans un dossier BabelOut à côté de chaque assembly d’entrée. Avant de démarrer l’exécution, Babel Desktop vérifie où la sortie sera écrite. Il n’écrase jamais un assembly d’entrée, un fichier de clé ou un plugin, et demande confirmation avant de remplacer des fichiers de sortie existants.
Le panneau Activité affiche la phase en cours, un indicateur de progression et le journal du moteur. L’onglet Journal répertorie tous les messages que le moteur écrit au niveau Verbose Level de la cible, et les avertissements et les erreurs sont également regroupés dans l’onglet Problèmes. Chaque nœud de cible indique son état sur le canevas. Annuler l’exécution arrête l’exécution. Les cibles s’exécutent l’une après l’autre ; lorsqu’une cible échoue, les suivantes ne s’exécutent pas.



Une exécution terminée dans le panneau Activité
Après une exécution, les boutons situés en haut du panneau Activité ouvrent le dossier de sortie et lancent l’application obfusquée. Fichier > Afficher la sortie dans le dossier et Exécution > Lancer l’application obfusquée (Ctrl+F5, Cmd+F5 sous macOS) font la même chose. Babel Desktop lance directement un exécutable Windows, et lance une application .NET par l’intermédiaire de dotnet lorsque son fichier .runtimeconfig.json est disponible. Il ne propose pas de lancer une bibliothèque.
Score d’obfuscation
Une fois l’exécution terminée, la carte de chaque cible affiche un score d’obfuscation de 0 à 100, qui permet de vérifier rapidement que l’exécution a appliqué les protections attendues. Laissez le pointeur sur la cible pour ouvrir la carte.



Le score d’obfuscation d’une cible qui fusionne quatre assemblies
Le score additionne les points de cinq couches de protection. Chaque barre indique les points obtenus par une couche par rapport à son maximum, si bien qu’un score faible vous montre quelle couche manque.
| Couche | Points | Obtenus par |
|---|---|---|
| Renommage | 30 | La part des symboles éligibles qui ont été renommés |
| Flux de contrôle | 25 | La part des méthodes qui ont été brouillées. Les méthodes sans branchement ne sont pas modifiées, et la moitié des méthodes suffit pour obtenir tous les points |
| Chiffrement des chaînes | 15 | Les chaînes chiffrées |
| Protection du code | 15 | Le chiffrement MSIL (7), les appels par proxy dynamique (4) et le chiffrement des valeurs (4) |
| Anti-analyse | 15 | La détection de falsification, la protection contre le débogage et le blocage d’ILDASM, 5 points chacun |
Le score est noté Faible en dessous de 35, Moyen à partir de 35, Bon à partir de 60 et Solide à partir de 80. Il est calculé à partir des statistiques de la dernière exécution terminée du projet. Les assemblies fusionnés dans une cible comptent dans le score de celle-ci et n’ont pas de score propre. Une cible qui n’a pas encore été exécutée n’affiche aucun score.
Le score comptabilise les protections appliquées par une exécution et ne dit rien du temps pendant lequel le résultat résiste à un outil donné. Un score plus bas peut être le bon : une bibliothèque dotée d’une API publique conserve ses noms publics et obtient donc moins de points de renommage.
Exécuter les flux en parallèle
Un projet qui comporte plusieurs flux indépendants, par exemple des bibliothèques qui ne se référencent pas entre elles, peut les obfusquer en même temps. Activez Exécuter en parallèle les flux indépendants dans Paramètres > Obfuscation et choisissez le nombre de flux exécutés simultanément, de 2 à 4. L’option est désactivée par défaut.
Chaque flux s’exécute dans son propre processus du moteur et, à l’intérieur d’un flux, les cibles s’exécutent toujours dans l’ordre. Babel Desktop vérifie l’ensemble du projet avant le démarrage du premier flux, comme pour une exécution simple. Pendant l’exécution des flux :
- L’indicateur de progression compte les cibles terminées par rapport aux cibles prévues, et chaque ligne du journal commence par le nom de son assembly, par exemple
[Library1.dll]. - Une cible qui échoue arrête son propre flux. Les autres flux se poursuivent, et l’exécution est signalée comme ayant échoué.
- Annuler l’exécution arrête tous les flux.
- Lorsque plusieurs cibles ont besoin d’un mot de passe de certificat, Babel Desktop les demande un par un en nommant l’assembly concerné.
Comme chaque processus du moteur met quelques secondes à démarrer, l’exécution en parallèle fait gagner du temps avec de gros assemblies. Un petit projet peut se terminer plus vite en traitant une cible après l’autre. Avec une licence flottante, Babel Desktop exécute un seul flux à la fois.
Dans la palette de commandes, Outils : avertissements de la tâche répertorie les avertissements de l’exécution en cours, et Outils : référence des avertissements ouvre le catalogue des codes d’avertissement du moteur, avec leur description et une fonction de recherche.



La référence des avertissements du moteur
Résultats d’exécution
Après une exécution, le bouton Résultats d’exécution de la barre d’outils du canevas ouvre les statistiques de protection. Choisissez une exécution dans l’historique, un assembly obfusqué et un rapport :
| Rapport | Contenu |
|---|---|
| Renommage | Le nombre de types, méthodes, champs, propriétés et événements renommés et leur nombre total, avec un graphique de couverture |
| Flux de contrôle | Les méthodes brouillées, les instructions de branchement insérées et les itérations, avec une carte arborescente (treemap) par espace de noms et par type et, lorsque les statistiques complètes sont collectées, la complexité cyclomatique avant et après la transformation |
| Chiffrement des chaînes | L’algorithme de chiffrement et les chaînes chiffrées par méthode |
| Chiffrement du code | Les méthodes chiffrées par espace de noms et par type |
| Proxy dynamique | Les appels passant par un proxy et les types de délégués, par méthode cible |
| Optimisations | Les compteurs de suppression du code mort et d’optimisation |
| Temps d’exécution | La durée de chaque phase du moteur |
Vous pouvez effectuer des recherches dans les tableaux et les trier, et descendre dans les cartes arborescentes de l’espace de noms au type. Afficher la sortie, Afficher le journal du moteur et Afficher les données statistiques ouvrent le dossier de sortie, le journal complet du moteur et le fichier de statistiques brutes de l’exécution. Babel Desktop conserve les résultats des 30 dernières exécutions.



Les statistiques de renommage



Les statistiques du flux de contrôle
Les fichiers de statistiques contiennent les noms d’origine des symboles et les valeurs des chaînes. Comme les fichiers de mappage XML, tenez-les à l’écart de l’application distribuée.
Décoder les traces de pile
Pour retrouver, à l’aide de ses fichiers de mappage XML, les noms d’origine dans les traces de pile obfusquées d’une application protégée, utilisez le Décodeur de pile.