Skip to Content
Nouvelle version 12 disponible 🎉
ObfuscatorRenommage des symboles

Renommage des symboles

Babel Obfuscator peut renommer les espaces de noms, les types, les méthodes, les propriétés, les événements et les champs, ce qui rend la rétro-ingénierie difficile. Par défaut, il utilise des caractères ASCII pour le renommage, mais vous pouvez opter pour Unicode afin d’obtenir des symboles encore moins lisibles.

Babel renomme automatiquement les symboles internes, mais pas ceux qui sont visibles par d’autres assemblies. Les symboles privés et internes sont donc renommés, tandis que les membres publics et protégés restent inchangés, sauf si des règles personnalisées imposent leur renommage.

Notez que le renommage des symboles publics peut rompre l’interface publique du composant, car du code externe peut dépendre des noms de ces symboles. Il est généralement recommandé de ne pas renommer les symboles visibles de l’extérieur et de concentrer l’obfuscation sur les détails d’implémentation internes.

Si un symbole n’est pas destiné à être utilisé à l’extérieur, déclarez-le comme interne : il ne sera ainsi pas visible en dehors de l’assembly et ne fera pas partie de l’interface publique.

En ramenant la visibilité des types publics à interne, vous pouvez augmenter le nombre total de membres obfusqués tout en préservant l’interface publique du composant.

Configurer le renommage des symboles

Vous pouvez configurer le renommage dans Babel Desktop, depuis la ligne de commande ou avec la tâche MSBuild.

Babel Desktop

Pour configurer le renommage dans Babel Desktop, ouvrez ou créez un projet, sélectionnez l’assembly sur le canevas du projet et définissez les options du groupe Renommage du panneau des propriétés. Ce groupe contient les options des types et des membres (ObfuscateTypes, ObfuscateMethods, ObfuscateProperties, ObfuscateEvents, ObfuscateFields, ObfuscateParameters), l’aplatissement des espaces de noms (FlattenNamespaces), les noms Unicode (UnicodeNormalization), la longueur et le préfixe des noms (NameLength, NamePrefix) et le renommage avec surcharge (OverloadedRenaming). Voir Projets d’obfuscation pour le fonctionnement des projets dans Babel Desktop.

Ligne de commande

Configurer le renommage de Babel Obfuscator depuis l’interface en ligne de commande (CLI) est une approche souple pour intégrer l’obfuscation à votre processus de build si vous utilisez des scripts CLI.

Pour configurer le renommage dans Babel Obfuscator, ouvrez l’invite de commandes sous Windows ou le terminal sous macOS ou Linux, placez-vous dans le dossier de votre projet et saisissez :

babel myapp.exe --types --methods --properties --events --fields --parameters

Remplacez ici myapp.exe par le nom de l’assembly généré que vous voulez obfusquer. Les options qui suivent indiquent les types de symboles à renommer.

Chaque option (--types, --methods, etc.) active le renommage pour la catégorie de symboles correspondante de votre assembly. Avec ces options, vous demandez à Babel Obfuscator de renommer les types, les méthodes, les propriétés, les événements, les champs et les paramètres. Pour exclure une catégorie du renommage, ajoutez le préfixe --no au type de symbole. Par exemple, pour désactiver le renommage des types, utilisez --notypes. Vous pouvez procéder ainsi pour n’importe quel type de symbole afin de choisir les éléments à obfusquer.

Pour afficher l’aide de la ligne de commande sur une option de renommage, saisissez la commande suivante

babel --help types

Cette commande affiche l’aide détaillée de l’option --types.

Tâche MSBuild Babel

La tâche MSBuild Babel intègre Babel Obfuscator à votre flux de build et vous donne un contrôle précis sur les paramètres d’obfuscation. Vous pouvez ainsi désigner exactement les éléments de votre code à obfusquer et adapter l’obfuscation à vos besoins.

<PropertyGroup> <ObfuscateTypes>true</ObfuscateTypes> <ObfuscateMethods>true</ObfuscateMethods> <ObfuscateProperties>true</ObfuscateProperties> <ObfuscateEvents>true</ObfuscateEvents> <ObfuscateFields>true</ObfuscateFields> <ObfuscateParameters>true</ObfuscateParameters> </PropertyGroup> <Babel ObfuscateTypes="$(ObfuscateTypes)" ObfuscateMethods="$(ObfuscateMethods)" ObfuscateProperties="$(ObfuscateProperties)" ObfuscateEvents="$(ObfuscateEvents)" ObfuscateFields="$(ObfuscateFields)" ObfuscateParameters="$(ObfuscateParameters)" />

Préfixe de nom

Babel Obfuscator permet d’appliquer un préfixe à chaque nom de symbole généré. Vous pouvez indiquer le préfixe à appliquer à une catégorie de symboles donnée : types, méthodes, propriétés, événements, champs ou paramètres. Le préfixe s’indique avec l’option --nameprefix ou --prefix, suivie de la chaîne voulue. Vous pouvez aussi préciser la catégorie de symboles à laquelle le préfixe s’applique, avec la syntaxe —prefix [kind]=[prefix]

Babel accepte le préfixe $name, qui est remplacé par le nom d’origine du symbole lors du renommage. Cela peut être utile pour le débogage ou pour repérer les problèmes que le renommage pourrait causer.

Ligne de commande

babel myapp.exe --prefix xy_ --prefix types=tp_ --prefix fields=m_

Pour en savoir plus sur l’option de préfixe de nom, saisissez :

babel --help prefix

Tâche MSBuild Babel

<PropertyGroup> <NamePrefix>xy_;types=tp_;fields=m_</NamePrefix> </PropertyGroup> <Babel NamePrefix="$(NamePrefix)" />

Longueur des noms

Dans Babel Obfuscator, vous pouvez indiquer la longueur minimale des noms obfusqués générés avec l’option --namelength, suivie de la longueur voulue. Cela peut être utile si vous voulez que les noms obfusqués aient une certaine longueur. Vous pouvez aussi préciser la catégorie de symboles à laquelle la longueur s’applique, avec la syntaxe —namelength [kind]=[value]

Ligne de commande

babel myapp.exe --namelength 3 --namelength types=8

Pour en savoir plus sur l’option de longueur des noms, saisissez :

babel --help namelength

Tâche MSBuild Babel

<PropertyGroup> <NameLength>3;types=8</NameLength> </PropertyGroup> <Babel NameLength="$(NameLength)" />

Jeu de caractères Unicode

Babel permet d’indiquer le jeu de caractères Unicode à utiliser pour générer les noms obfusqués. Vous pouvez fournir une liste, séparée par des virgules, de caractères Unicode ou de plages de caractères, exprimés sous forme hexadécimale, décimale ou de caractère.

Ligne de commande

babel myapp.exe --unicode 10,13,a-z,0x4E00-0x4FFF

Pour désactiver le renommage Unicode, saisissez :

babel myapp.exe --nounicode

Tâche MSBuild Babel

<PropertyGroup> <UnicodeNormalization>10,13,a-z,0x4E00-0x4FFF</UnicodeNormalization> </PropertyGroup> <Babel UnicodeNormalization="$(UnicodeNormalization)" />

Aplatir les espaces de noms

Lorsque l’aplatissement des espaces de noms est activé, Babel supprime de l’assembly obfusqué toutes les informations d’espace de noms et déplace tous les types renommés dans l’espace de noms global. Il devient alors plus difficile pour un attaquant de comprendre l’organisation du code et de repérer des types ou des membres précis dans l’assembly.

Vous pouvez aussi indiquer le nom de l’espace de noms que Babel utilisera comme conteneur global de tous les types renommés.

Notez que, dans Babel, seuls les types renommés voient le nom de leur espace de noms modifié selon les paramètres d’aplatissement.

Ligne de commande

babel myapp.exe --flatns babel myapp.exe --flatns glbns

Pour désactiver l’aplatissement des espaces de noms, saisissez :

babel myapp.exe --noflatns

Tâche MSBuild Babel

<PropertyGroup> <FlattenNamespaces>true</FlattenNamespaces> </PropertyGroup> <Babel FlattenNamespaces="$(FlattenNamespaces)" />

Renommage avec surcharge

Le renommage avec surcharge est une technique par laquelle Babel donne le même nom à des méthodes de signatures différentes, dans la mesure où les règles de conception du .NET Framework le permettent. Le code devient ainsi plus difficile à comprendre et à soumettre à la rétro-ingénierie pour un attaquant. De plus, Babel renomme les surcharges même lorsque seul le type de retour de la méthode diffère, ce qui rend impossible la décompilation complète du code vers des langages de haut niveau comme C# et VB.NET, puisque ces langages n’autorisent pas la surcharge sur le type de retour.

Ligne de commande

babel myapp.exe --overloaded

Pour désactiver le renommage avec surcharge, saisissez :

babel myapp.exe --nooverloaded

Tâche MSBuild Babel

<PropertyGroup> <OverloadedRenaming>true</OverloadedRenaming> </PropertyGroup> <Babel OverloadedRenaming="$(OverloadedRenaming)" />

Fonctions virtuelles

Babel peut obfusquer les fonctions virtuelles en les renommant d’une manière qui préserve leur caractère virtuel. La disposition d’origine de la table des fonctions virtuelles (vtable) est donc conservée, même après l’obfuscation. C’est important pour que le programme continue de fonctionner correctement, car les fonctions virtuelles sont un élément essentiel de nombreux programmes orientés objet. En obfusquant les fonctions virtuelles, Babel rend le comportement du programme plus difficile à comprendre pour les attaquants, et ses vulnérabilités plus difficiles à exploiter.

Ligne de commande

babel myapp.exe --virtuals

Pour désactiver l’obfuscation des fonctions virtuelles, saisissez :

babel myapp.exe --novirtuals

Tâche MSBuild Babel

<PropertyGroup> <VirtualFunctions>true</VirtualFunctions> </PropertyGroup> <Babel VirtualFunctions="$(VirtualFunctions)" />

Renommer les variables locales

Les métadonnées .NET ne stockent pas explicitement les noms des variables locales. Les décompilateurs les déduisent de différents éléments. Par exemple, lorsque le type d’une variable est indiqué explicitement, comme dans

var list1 = new List<string>();

le décompilateur peut déterminer que la variable s’appelle « list1 » à partir de l’instruction d’affectation.

Les noms des variables locales peuvent aussi être chargés depuis le fichier PDB (Program Database) de l’assembly. Le fichier PDB contient des informations de débogage supplémentaires, dont les noms des variables, que les décompilateurs peuvent utiliser pour reconstituer les noms d’origine.

Pour limiter l’exposition des noms des variables locales, Babel Obfuscator permet d’activer la génération de proxys dynamiques pour les types externes.

babel myapp.exe --proxy external

Cette fonctionnalité encapsule les types d’origine, comme List<string>, dans des types proxy renommés, ce qui masque les types des variables.

Il est essentiel que le décompilateur utilisé ne charge pas le fichier PDB, qui lui permettrait de reconstituer les noms d’origine des variables. Si le chargement du PDB est désactivé ou si le fichier PDB est supprimé, le décompilateur n’a qu’un accès limité aux informations de débogage.

Pour une protection complète du code des méthodes, il est recommandé d’activer le chiffrement du code chaque fois que c’est possible. Le chiffrement du code transforme le code des méthodes en une forme chiffrée, bien plus difficile à comprendre ou à modifier par rétro-ingénierie, même si les noms d’origine des variables ont pu être retrouvés.

Last updated on