Règles XML
Outre les options indiquées sur la ligne de commande ou dans la tâche MSBuild Babel, Babel Obfuscator peut être contrôlé et configuré par des règles définies dans des fichiers XML externes. Ces règles XML offrent un contrôle fin de l’obfuscation et permettent de viser des assemblies, des types, des méthodes et d’autres éléments de code précis.
Fichiers de règles
Les fichiers de règles de Babel sont des documents XML qui contiennent les informations de configuration servant à personnaliser et à contrôler l’obfuscation. Ils vous permettent de définir précisément quelles fonctionnalités d’obfuscation s’appliquent à quelles parties de votre code, et donc de contrôler finement la protection de vos assemblies.
<Rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Rule name="rule 1" feature="default" exclude="false">
</Rule>
<Rule name="rule 2" feature="control flow" exclude="true">
</Rule>
</Rules>L’élément Rules peut définir un attribut targetAssembly qui limite à un assembly donné la portée des règles qu’il contient. Si l’attribut targetAssembly n’est pas indiqué, les règles s’appliquent à tous les assemblies traités. Exemple :
<Rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
targetAssembly="ACME.Data">Dans le fichier de règles XML, les règles sont traitées l’une après l’autre, de haut en bas, dans l’ordre où elles apparaissent. Ce traitement séquentiel vous permet de remplacer une règle existante par des règles plus spécifiques placées après elle, ce qui donne une structure de règles souple et hiérarchique.
Élément Rules
L’élément Rules est le conteneur racine qui définit un ensemble de règles à appliquer à l’assembly cible. Il peut contenir plusieurs éléments enfants Rule, chacun décrivant un comportement d’obfuscation différent.
| Attribut | Description |
|---|---|
| targetAssembly | Indique le nom complet de l’assembly auquel les règles s’appliquent. S’il n’est pas défini, les règles s’appliquent à tous les assemblies qui participent à l’obfuscation. |
Élément Rule
L’élément Rule définit une règle d’obfuscation Babel qui peut viser une ou plusieurs fonctionnalités de Babel Obfuscator. Chaque règle indique quels éléments de code sont concernés et comment les fonctionnalités d’obfuscation leur sont appliquées.
| Attribut | Description |
|---|---|
| name | Nom convivial et descriptif de la règle, qui aide à en identifier le rôle |
| feature | Nom de la fonctionnalité de l’obfuscateur visée par la règle, ou liste de noms de fonctionnalités séparés par des virgules. Plusieurs fonctionnalités peuvent être indiquées pour appliquer la même règle à différents aspects de l’obfuscation |
| exclude | Valeur booléenne indiquant si la règle empêche l’exécution de la ou des fonctionnalités indiquées. Utilisez « true » pour exclure des symboles de l’obfuscation, ou « false » pour les inclure explicitement |
| applyToMembers | Valeur booléenne indiquant si la règle s’applique à tous les membres d’un symbole qui répond aux critères de la règle. Lorsqu’elle est activée, la règle se propage aux membres imbriqués |
| locked | Valeur booléenne indiquant si la règle est immuable et ne peut pas être remplacée par les règles suivantes dans l’ordre de traitement |
L’attribut feature définit la fonctionnalité de l’obfuscateur sur laquelle la règle agit. Les attributs name et exclude sont obligatoires, tandis que l’attribut feature est facultatif. S’il n’est pas indiqué, la fonctionnalité prend la valeur « default », qui désigne la fonctionnalité de renommage.
Les fonctionnalités de l’obfuscateur sont des chaînes prédéfinies qui correspondent chacune à une capacité d’obfuscation. Tous les noms de fonctionnalités pris en charge figurent dans les tableaux ci-dessous.
Tableau des fonctionnalités
Les fonctionnalités suivantes peuvent viser tous les types de symboles définis dans un assembly, notamment les types, les méthodes, les propriétés, les champs et les événements :
| Fonctionnalité | Description |
|---|---|
| all | Vise toutes les fonctionnalités d’obfuscation disponibles |
| default | La fonctionnalité par défaut désigne l’obfuscation par renommage des symboles |
| agent | Vise l’agent d’obfuscation |
| cleanup attributes | Supprime les attributs indésirables des métadonnées de l’assembly |
| control flow | Applique l’obfuscation du flux de contrôle pour rendre la logique du code plus difficile à comprendre |
| dead code | Active l’optimisation par suppression du code mort |
| dynamic proxy | Remplace les appels de méthode directs par des appels par proxy dynamique |
| embed | Incorpore les assemblies dépendants dans l’assembly cible |
| merge | Fusionne plusieurs assemblies en un seul |
| msil encryption | Chiffre les corps de méthode à l’aide du chiffrement du code MSIL (Microsoft Intermediate Language) |
| renaming | Obfusque les noms des membres (types, méthodes, propriétés, champs, événements) |
| renaming blob | Renomme les littéraux de chaîne qui correspondent à des symboles renommés, afin de préserver le fonctionnement du code |
| resource encryption | Chiffre les ressources incorporées de l’assembly |
| string encryption | Chiffre les littéraux de chaîne en ligne dans le code |
| value encryption | Chiffre les valeurs constantes en ligne et les initialisations de tableaux |
| inline | Développe en ligne les appels de méthode pour rendre la structure du code moins visible |
| instrumentation | Active l’instrumentation du code à des fins de surveillance et d’analyse |
| optimizations | Applique diverses optimisations des métadonnées et du code |
| xaml | Gère le renommage des symboles référencés dans les ressources XAML ou BAML |
Les fonctionnalités d’obfuscation suivantes sont propres aux méthodes et ne peuvent s’appliquer qu’à des symboles de méthode :
| Fonctionnalité | Description |
|---|---|
| msil encryption get stream | Déclare la méthode qui fournit le flux source du code chiffré pour le déchiffrement MSIL |
| string encryption encrypt method | Définit la méthode personnalisée qui chiffre les littéraux de chaîne |
| string encryption decrypt method | Définit la méthode personnalisée qui déchiffre les littéraux de chaîne à l’exécution |
| instrumentation on entry method | Définit la méthode à appeler à l’entrée d’une méthode instrumentée |
| instrumentation on exit method | Définit la méthode à appeler à la sortie d’une méthode instrumentée |
| instrumentation on exception method | Définit la méthode à appeler lorsqu’une exception se produit dans une méthode instrumentée |
| module initializer | Désigne une méthode que le runtime exécute automatiquement à l’initialisation du module |
Tout élément Rule peut contenir des éléments enfants tels que Access, Target, Pattern, HasAttribute, Properties et Description. L’élément Pattern est obligatoire, tous les autres sont facultatifs. Ces éléments enfants ajoutent à la règle des possibilités de filtrage et de configuration. Exemple :
<Rule name="DataWriter" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>SQLUtils.DataWriter::*</Pattern>
<Properties>
<Cache>true</Cache>
<MinInstructionCount>6</MinInstructionCount>
</Properties>
<Description>Encrypt all methods of the DataWriter class.</Description>
</Rule>Voici la liste complète des éléments enfants possibles de Rule :
| Élément |
|---|
| Access |
| Targets |
| Pattern |
| HasAttribute |
| HasBase |
| Implements |
| Namespace |
| Properties |
| Description |
Élément Access
Limite la portée de la règle aux symboles dotés des modificateurs de visibilité indiqués. Les valeurs possibles sont All ou toute combinaison de Public, Protected, Internal, Private, FamilyAndAssembly et FamilyOrAssembly. Si cet élément est absent, la valeur par défaut All est utilisée : la règle s’applique alors aux symboles de toute visibilité.
| Accès | Description |
|---|---|
| Public | Accessible depuis n’importe quel type de n’importe quel assembly. |
| Protected | Accessible depuis le type du membre et depuis tous les types dérivés qui en héritent (accès dit Family). |
| Internal | Accessible uniquement dans l’assembly où le type est défini (accès dit Assembly). |
| Private | Accessible uniquement depuis le type du membre ou depuis un type imbriqué dans ce type. |
| FamilyOrAssembly | Accessible depuis les types qui remplissent les conditions de l’accès Family ou de l’accès Assembly (protected internal en C#). |
| FamilyAndAssembly | Accessible uniquement depuis les types qui remplissent à la fois les conditions de l’accès Family et celles de l’accès Assembly (private protected en C#). |
Élément Targets
Limite la portée de la règle à certains types de symboles de code. Les valeurs acceptées sont All ou toute combinaison de Classes, Delegates, Structures, Interfaces, Enums, Events, Methods, Properties, Fields, StaticFields et Resources. Si cet élément est absent, la valeur par défaut All est retenue et la règle s’applique à tous les types de symboles.
Élément Pattern
Dans la définition d’une règle XML de Babel Obfuscator, l’élément Pattern sert à identifier les symboles de l’assembly soumis à l’obfuscation. Il accepte un nom complet de symbole, une expression avec caractères génériques ou une expression régulière, ce qui en fait un mécanisme de filtrage souple pour viser des éléments de code précis.
Expressions avec caractères génériques : pour des critères de sélection plus simples, l’élément Pattern peut contenir des caractères génériques. Le caractère « ? » représente un caractère quelconque, tandis que « * » représente zéro, un ou plusieurs caractères. Vous obtenez ainsi des critères de sélection larges mais maîtrisés, qui permettent de viser facilement des groupes de symboles apparentés sans écrire de motifs complexes.
Expressions régulières : pour un filtrage plus complexe et plus précis, l’élément Pattern accepte les expressions régulières. Dans ce cas, l’attribut isRegEx doit être défini sur « true » pour indiquer que le motif doit être interprété comme une expression régulière et non comme une chaîne littérale ou un motif avec caractères génériques. Il est conseillé de placer l’expression régulière dans une section CDATA pour que le XML soit analysé correctement et que les caractères spéciaux soient bien interprétés. Par exemple :
<Pattern isRegEx="true"><![CDATA[^Properties.*]]></Pattern> Format du nom complet
Dans le motif d’une règle XML de Babel Obfuscator, le format du nom complet d’un symbole dépend du type de symbole visé. Cette distinction garantit une obfuscation précise et efficace pour les différents types de symboles, tout en restant claire et cohérente.
Types (classes, structures, énumérations, interfaces) : le format habituel est NamespaceName.TypeName, une notation directe pour les déclarations de type simples.
Types imbriqués : pour les types imbriqués (types définis à l’intérieur d’autres types), le format utilise une barre oblique comme séparateur : NamespaceName.TypeName/NestedTypeName. Cette notation distingue clairement les types imbriqués de leurs types parents et conserve la relation hiérarchique.
Types génériques : la notation des types génériques commence par NamespaceName.TypeName, suivi des arguments de type générique entre chevrons :
NamespaceName.TypeName<GenericArgumentList>
GenericArgumentList : cet élément n’est pas un motif indépendant, il fait partie intégrante du motif des types génériques. Il définit la liste des arguments de type générique, séparés par des virgules, chacun étant indiqué avec son espace de noms complet et son nom de type :
NamespaceName.TypeName1,NamespaceName.TypeName2,...,NamespaceName.TypeNameN
Méthodes : le format habituel des méthodes comprend l’espace de noms, le nom du type, le nom de la méthode, la liste des paramètres et, éventuellement, le type de retour :
NamespaceName.TypeName::MethodName(ParameterList):ReturnType
La présence de ReturnType dans le motif est facultative, et il peut être omis dans la plupart des cas.
Propriétés : le format des propriétés suit cette structure :
NamespaceName.TypeName::PropertyName:PropertyType
En général, le type de la propriété n’a pas besoin de figurer dans le motif et peut être omis.
Événements : le format des événements s’écrit ainsi :
NamespaceName.TypeName::EventName:EventHandlerType
Ce format comprend à la fois le nom de l’événement et le type de gestionnaire qui lui est associé.
Champs : les champs suivent le format :
NamespaceName.TypeName::FieldName:FieldType
Comme pour les propriétés, le type du champ est en général facultatif et n’est pas nécessaire dans la plupart des motifs.
ParameterList : cet élément ne concerne que le motif des méthodes. Il donne les noms de type complets des paramètres, séparés par des virgules :
NamespaceName.TypeName1,NamespaceName.TypeName2,...,NamespaceName.TypeNameN
Ces motifs servent à indiquer précisément quelles parties du code Babel Obfuscator doit viser. La syntaxe exacte peut varier légèrement selon le contexte et les besoins de votre stratégie d’obfuscation. Des motifs exacts garantissent que les règles d’obfuscation ne touchent que les symboles voulus.
Élément HasAttribute
Indique une liste de noms complets de types d’attributs personnalisés, séparés par des virgules. Si le symbole cible porte au moins l’un de ces attributs, la règle lui est appliquée. Cet élément permet de filtrer selon les attributs pour cibler précisément la règle.
Cet élément accepte l’attribut facultatif onEnclosingType. Défini sur « true », il indique que l’attribut personnalisé doit être recherché sur le type englobant du symbole cible et non sur le symbole lui-même :
<HasAttribute onEnclosingType="true">System.SerializableAttribute</HasAttribute>Cette configuration correspond aux symboles, tels que les méthodes, les propriétés, les champs et les événements, qui appartiennent à un type portant l’attribut SerializableAttribute.
Élément HasBase
Indique une liste de noms complets de types de base, séparés par des virgules. La règle correspond à un symbole de type si le type cible dérive de l’un de ces types de base. Cet élément permet de filtrer selon l’héritage pour appliquer la règle.
Cet élément accepte l’attribut facultatif onEnclosingType. Défini sur « true », il indique que Babel doit effectuer la recherche dans la hiérarchie du type englobant des symboles cibles, ce qui vous permet d’appliquer des règles selon la structure d’héritage des types conteneurs.
Élément Namespace
Limite la règle aux symboles d’un espace de noms donné. La règle est ainsi filtrée au niveau de l’espace de noms.
<Namespace>ACME.Data</Namespace>La règle s’applique à tous les symboles définis dans l’espace de noms ACME.Data et dans ses sous-espaces de noms.
Élément Properties
L’élément Properties définit une collection d’éléments XML enfants qui personnalisent le comportement de la fonctionnalité visée par la règle. Chaque fonctionnalité d’obfuscation prend en charge des propriétés propres, qui en contrôlent le fonctionnement et ajustent la manière dont elle traite les symboles correspondants.
<Rule name="DataWriter" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Data.DataWriter::*</Pattern>
<Properties>
<Cache>true</Cache>
<MinInstructionCount>6</MinInstructionCount>
</Properties>
<Description>Encrypts code in the DataWriter class.</Description>
</Rule>Cette règle configure la fonctionnalité msil encryption en définissant les propriétés Cache et MinInstructionCount pour toutes les méthodes de la classe DataWriter.
Voici la liste complète des éléments de propriété pris en charge par chaque fonctionnalité d’obfuscation :
agent
| Propriété | Type | Description |
|---|---|---|
| TaskNameList | Chaîne | Liste des noms des tâches de l’agent auxquelles la règle s’applique, séparés par des virgules. |
cleanup attributes
| Propriété | Type | Description |
|---|---|---|
| Attributes | Chaîne | Liste de noms qualifiés de types d’attributs ou d’expressions régulières, séparés par des virgules, correspondant aux membres à inclure dans la recherche. |
| IncludeMembers | Chaîne | Liste de noms qualifiés de symboles ou d’expressions régulières, séparés par des virgules, correspondant aux membres à inclure dans la recherche. |
| ExcludeMembers | Chaîne | Liste de noms qualifiés de symboles ou d’expressions régulières, séparés par des virgules, correspondant aux membres à exclure de la recherche. |
control flow
| Propriété | Type | Description |
|---|---|---|
| ILIterations | Entier | Indique le nombre d’itérations à appliquer pendant l’obfuscation du flux de contrôle ; des valeurs plus élevées produisent des structures de code plus complexes. |
| EmitInvalidOpcodes | Booléen | Lorsqu’elle est activée, ajoute des codes d’opération non valides dans le flux de la méthode pour dérouter les désassembleurs et les décompilateurs. |
| ChangeIfStatement | Booléen | Lorsqu’elle est activée, transforme et obfusque les instructions conditionnelles if pour rendre la logique plus difficile à suivre. |
| AddSwitchStatement | Booléen | Lorsqu’elle est activée, enrichit le flux de contrôle en insérant des instructions switch dans le flux de la méthode, ce qui crée des chemins d’exécution plus complexes. |
| ScrambleControlFlow | Booléen | Lorsqu’elle est activée, produit du « code spaghetti » en insérant des branchements et des instructions de saut sans utilité, qui masquent fortement le flux de contrôle d’origine. |
| MaxSwitchTargets | Entier | Définit le nombre maximal de cibles case autorisées dans l’obfuscation du flux de contrôle par switch, ce qui détermine la complexité des instructions switch générées. |
| HideCaseConstantExpressions | Booléen | Lorsqu’elle est activée, masque les valeurs constantes calculées dans l’obfuscation du flux de contrôle par switch en utilisant des expressions calculées à la place des valeurs littérales. |
| RandomCall | Booléen | Lorsqu’elle est activée, ajoute des instructions d’appel de méthode aléatoires pour compliquer davantage l’analyse (disponible uniquement lorsque le flux de contrôle par switch est activé). |
| AddMethodToken (*) | Booléen | Lorsqu’elle est activée, enrichit le flux de contrôle en ajoutant des instructions de chargement de jeton dans le flux de la méthode, ce qui le rend plus complexe. |
| StackUnderflow (*) | Booléen | Lorsqu’elle est activée, insère des instructions qui provoquent un dépassement négatif de la pile d’évaluation, ce qui complique l’analyse statique. |
(*) Ces options génèrent de l’IL non vérifiable. Si votre assembly doit s’exécuter dans un environnement de confiance partielle ou passer la validation PEVerify, ne les activez pas.
renaming
| Propriété | Type | Description |
|---|---|---|
| DisableOverloading | Booléen | Lorsqu’elle est activée, désactive le renommage avec surcharge : les méthodes de signatures différentes reçoivent des noms obfusqués différents au lieu de partager le même nom. |
| DisableUnicode | Booléen | Lorsqu’elle est activée, empêche l’utilisation de caractères Unicode dans les noms obfusqués, qui sont alors limités aux caractères ASCII. |
| Internalize | Booléen | Lorsqu’elle est activée, fait passer de public à internal la visibilité de tous les types publics correspondant à la règle, ce qui réduit la surface d’API de l’assembly. |
| NameLength | Entier | Indique la longueur voulue pour les noms des symboles renommés, ce qui vous permet de choisir des identifiants obfusqués plus ou moins longs. |
| NamePrefix | Chaîne | Définit un préfixe ajouté au début de tous les symboles renommés, utile pour repérer ou classer les noms obfusqués. |
string encryption
| Propriété | Type | Description |
|---|---|---|
| MinInstructionCount | Entier | Définit le nombre minimal d’instructions qu’une méthode doit contenir pour que la règle s’applique. Les méthodes qui en contiennent moins sont exclues. |
| MaxInstructionCount | Entier | Définit le nombre maximal d’instructions qu’une méthode peut contenir pour que la règle s’applique. Les méthodes qui en contiennent davantage sont exclues. |
merge
| Propriété | Type | Description |
|---|---|---|
| CopyAttributes | Chaîne | Liste de noms complets de types d’attributs personnalisés ou d’expressions régulières, séparés par des virgules, qui filtre les attributs à copier de l’assembly source vers l’assembly cible pendant la fusion. |
| NoCopyAttributes | Chaîne | Liste de noms complets de types d’attributs personnalisés ou d’expressions régulières, séparés par des virgules, qui filtre les attributs à NE PAS copier vers l’assembly cible pendant la fusion. |
| Internalize | Booléen | Lorsqu’elle est activée, fait passer de public à internal la visibilité de tous les types fusionnés correspondant à la règle, ce qui les masque aux assemblies externes. |
| MergeAction | Default/Discard/Redirect | Indique l’action de fusion à effectuer pour le type sélectionné. Default effectue une fusion normale, Discard exclut le type de la fusion et Redirect redirige les références vers un autre type de l’assembly cible (indiqué par la propriété RedirectTo). |
| RedirectTo | Chaîne | Contient le nom complet du type de l’assembly cible qui remplace le type source lorsque l’action de fusion Redirect est indiquée. |
msil encryption
| Propriété | Type | Description |
|---|---|---|
| Cache | Booléen | Lorsqu’elle est activée, met en cache en mémoire la méthode déchiffrée, de sorte que la compilation JIT n’a lieu qu’au premier accès, ce qui améliore les performances des accès suivants. |
| Internal | Booléen | Lorsqu’elle est activée, stocke le code MSIL chiffré dans l’assembly cible lui-même ; lorsqu’elle est désactivée, le stocke dans un fichier externe. |
| Password | Chaîne | Indique le mot de passe utilisé pour chiffrer le code de la méthode, ce qui ajoute une couche de protection. |
| Source | Chaîne | Définit un nom d’identifiant de source pour le code chiffré, utile pour organiser plusieurs sources de chiffrement. |
| MinInstructionCount | Entier | Définit le nombre minimal d’instructions qu’une méthode doit contenir pour que la règle s’applique. |
| MaxInstructionCount | Entier | Définit le nombre maximal d’instructions qu’une méthode peut contenir pour que la règle s’applique. |
optimizations
| Propriété | Type | Description |
|---|---|---|
| ClassSealing | Booléen | Lorsqu’elle est activée, applique l’optimisation de scellement des classes en marquant comme scellées (final) les classes qui n’ont pas de types dérivés, ce qui améliore les performances. |
| ConstRemoval | Booléen | Lorsqu’elle est activée, supprime les métadonnées des champs constants et remplace les références par les valeurs littérales directement dans le code. |
| DisgregateRemoval | Booléen | Lorsqu’elle est activée, supprime les métadonnées des propriétés et des événements, ce qui réduit le volume des métadonnées de l’assembly. |
| EnumRemoval | Booléen | Lorsqu’elle est activée, supprime les définitions de types enum et les remplace par leurs types entiers sous-jacents. |
| UnwantedAttributes | Booléen | Lorsqu’elle est activée, supprime les attributs personnalisés indésirables susceptibles de révéler des détails d’implémentation ou des informations de débogage. |
Élément Description
Fournit un texte qui décrit le rôle et le comportement de la règle. Cette description apparaît dans le journal d’obfuscation, ce qui aide à comprendre l’effet de chaque règle lorsque vous examinez le déroulement de l’obfuscation.
Configurer les règles
Vous pouvez transmettre des fichiers de règles à Babel Obfuscator depuis la ligne de commande, la tâche MSBuild Babel ou Babel Desktop. Choisissez la méthode adaptée à votre build.
Ligne de commande
babel myapp.exe --rules babelRules.xmlL’option --rules peut être indiquée plusieurs fois sur la ligne de commande pour ajouter d’autres fichiers de règles XML. Vous pouvez ainsi répartir les règles dans des fichiers distincts et les combiner selon vos besoins.
Tâche MSBuild Babel
<ItemGroup>
<RuleFile Include="babelRules.xml" />
</ItemGroup>
<Babel RulesFiles="@(RuleFile)" />L’option RulesFiles de Babel Obfuscator accepte une liste de fichiers de règles XML, que vous pouvez définir avec l’élément ItemGroup dans votre fichier de projet MSBuild. Vous pouvez ainsi indiquer plusieurs fichiers de règles et les gérer facilement dans la structure du projet. Chaque fichier de règles du groupe d’éléments est traité comme une entrée distincte de Babel Obfuscator et peut définir des règles et des paramètres d’obfuscation différents pour différentes parties de votre base de code.
Outre les fichiers de règles XML externes, vous pouvez placer la définition des règles XML directement dans le fichier de projet à l’aide de l’attribut XmlRules de la tâche Babel, comme ci-dessous :
<PropertyGroup>
<XmlRules>
<Rules targetAssembly="Acme, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f66185f16ea61c16">
<Rule name="rule1" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>Acme.Engine*</Pattern>
<Description>Enable MSIL Code Encryption in Acme Engine</Description>
</Rule>
</Rules>
<Rules targetAssembly="Acme.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f66185f16ea61c16">
<Rule name="rule2" feature="control flow" exclude="true">
<Target>Methods</Target>
<Pattern>Acme.Entities.*</Pattern>
<Description>Disable Control Flow Obfuscation for EF classes</Description>
</Rule>
</Rules>
</XmlRules>
</PropertyGroup>
<Babel XmlRules="$(XmlRules)" />Lorsque Babel Obfuscator traite plusieurs assemblies cibles dans un projet, l’attribut targetAssembly des règles XML vous permet d’indiquer à quel assembly cible un ensemble de règles s’applique. Cet attribut désigne un assembly par son nom complet, avec la version, la culture et le jeton de clé publique. Si l’attribut targetAssembly est omis, les règles s’appliquent à tous les assemblies cibles définis dans le projet.
Babel Desktop
Pour utiliser des fichiers de règles XML externes, sélectionnez l’assembly cible sur le canevas du projet et ajoutez les fichiers à RulesFiles, dans le groupe Fichiers et dépendances du panneau des propriétés.
Pour écrire des règles XML intégrées, ouvrez la vue Règles XML de l’assembly sélectionné (l’onglet Règles XML du panneau des propriétés, ou Paramètres > Assembly sélectionné > Règles XML). L’éditeur valide les règles par rapport au schéma XML de Babel et signale les erreurs avec leur ligne et leur colonne ; il peut aussi ouvrir et enregistrer des documents de règles sous forme de fichiers XML.
Les règles intégrées sont stockées dans le fichier de projet, dans la propriété XmlRules de la tâche Babel, comme dans l’exemple MSBuild ci-dessus. Elles sont donc enregistrées et versionnées avec la configuration du projet. Voir Projets d’obfuscation pour savoir comment utiliser les projets dans Babel Desktop.