Skip to Content
Nouvelle version 12 disponible 🎉
ObfuscatorRenommage entre assembliesPublier une application .NET

Publier une application .NET

Cet exemple montre comment utiliser la tâche Babel pour configurer le renommage entre assemblies pendant le processus de build d’une application .NET. Plus précisément, l’interface publique du package MathNet.Numerics est obfusquée afin de montrer comment publier une application obfusquée qui utilise un assembly obfusqué. Notez que le package NuGet Babel.Obfuscator est nécessaire pour suivre cet exemple, et qu’une licence Ultimate ou Server est requise pour l’utiliser. L’exemple montre comment configurer le renommage entre assemblies pour améliorer le rendement de l’obfuscation de l’application et rendre la rétro-ingénierie plus difficile.

Le code source complet de l’exemple est disponible sur GitHub et peut être téléchargé avec la commande suivante :

git clone https://github.com/babelfornet/cross-assembly-reference-example.git

Le code de l’exemple est une application console .NET simple qui effectue quelques opérations statistiques de base avec la bibliothèque MathNet.Numerics.

Pour commencer à configurer le renommage entre assemblies, il faut d’abord référencer le package NuGet Babel Obfuscator, à l’aide du gestionnaire de packages NuGet de Visual Studio ou en ajoutant l’instruction MSBuild suivante au fichier de projet :

<PackageReference Include="Babel.Obfuscator" Version="10.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>

L’assembly cible Math.dll est alors obfusqué sans que le renommage entre assemblies soit activé.

Une fois le package ajouté, la tâche Babel permet de configurer le renommage entre assemblies pendant le processus de build, en renommant l’interface publique de MathNet.Numerics, la bibliothèque du package NuGet référencé.

<!-- Obfuscate the public interface of MathNet.Numerics reference --> <Target Name="BeforeObfuscate"> <PropertyGroup> <MathNetNumerics Condition="'%(filename)' == 'MathNet.Numerics'">@(ReferencePathWithRefAssemblies->'%(fullpath)')</MathNetNumerics> <MathNetRules> <Rules> <Rule name="rename public" feature="renaming" exclude="false"> <Access>Public</Access> <Pattern>*</Pattern> </Rule> </Rules> </MathNetRules> </PropertyGroup> <Message Text="MathNet.Numerics: $(MathNetNumerics)" Importance="high" /> <Babel InputFile="$(MathNetNumerics)" OutputFile="$(TargetDir)MathNet.Numerics.dll" FlattenNamespaces="true" XmlRules="$(MathNetRules)" GenerateMapOutFile="true" /> </Target>

Il faut en particulier obtenir le chemin complet des composants référencés à partir de la liste des références utilisées pour générer l’application.

<MathNetNumerics Condition="'%(filename)' == 'MathNet.Numerics'">@(ReferencePathWithRefAssemblies->'%(fullpath)')</MathNetNumerics>

Ce chemin est l’entrée de la tâche Babel, accompagnée de la règle XML qui configure Babel pour renommer l’interface publique du composant. Il faut aussi générer le fichier de mappage qui servira à l’obfuscation de l’assembly cible, en définissant la propriété GenerateMapOutFile="true".

Notez que la cible est nommée BeforeObfuscate : c’est un point d’entrée défini par le package NuGet Babel Obfuscator, qui permet d’effectuer des tâches supplémentaires avant l’obfuscation de l’assembly cible.

Pour activer le renommage entre assemblies pour l’assembly cible Math.dll, il faut ajouter le fichier de mappage XML généré pour la bibliothèque référencée MathNet.Numerics.dll à la tâche d’obfuscation de l’assembly cible. Cela se fait au moyen des propriétés définies pour le package NuGet Babel Obfuscator, décrites dans Référence du package.

<!-- Target assembly obfuscation settings --> <ItemGroup> <MapInFile Include="$(TargetDir)MathNet.Numerics.dll.map.xml" /> </ItemGroup> <PropertyGroup> <StringEncryption>true</StringEncryption> <ValueEncryption>array=true;true;</ValueEncryption> <ControlFlowObfuscation>goto=on;if=on;switch=on;case=on;call=on</ControlFlowObfuscation> <CopyOutputSymbolsToPublishDirectory>false</CopyOutputSymbolsToPublishDirectory> </PropertyGroup>

Pour empêcher les attaquants d’extraire des informations supplémentaires utiles à l’analyse du code obfusqué, la publication des fichiers PDB a été désactivée avec le paramètre suivant :

CopyOutputSymbolsToPublishDirectory=false.

Les fichiers PDB contiennent des informations de débogage, telles que les noms des fichiers de code source et les numéros de ligne, qui peuvent aider les attaquants à comprendre le code obfusqué.

À la génération du projet, l’application obfusquée avec le renommage entre assemblies est produite dans le répertoire cible. Pour créer le paquet déployable, il faut remplacer la référence au fichier MathNet.Numerics.dll du package NuGet par le chemin de la version obfusquée. Cette étape est indispensable pour que Visual Studio empaquette les bons assemblies obfusqués.

<!-- Replace the deployed MathNet.Numerics.dll assembly reference with the obfuscated one --> <Target Name="UpdateFilesToPublish" AfterTargets="ComputeFilesToPublish"> <ItemGroup> <ResolvedFileToPublish Remove="$(MathNetNumerics)" /> <ResolvedFileToPublish Include="$(TargetDir)MathNet.Numerics.dll"> <RelativePath>MathNet.Numerics.dll</RelativePath> </ResolvedFileToPublish> </ItemGroup> </Target>

Le fragment XML MSBuild ci-dessus est une cible nommée UpdateFilesToPublish, exécutée après la cible ComputeFilesToPublish. Elle sert à remplacer, dans le paquet de déploiement, la référence à l’assembly MathNet.Numerics.dll d’origine du package NuGet par la référence à l’assembly obfusqué.

La cible définit d’abord un groupe d’éléments qui retire la référence d’origine au fichier MathNet.Numerics.dll au moyen de l’attribut « Remove », en référençant la propriété qui contient le chemin du fichier d’origine.

Elle ajoute ensuite la version obfusquée du fichier MathNet.Numerics.dll au groupe d’éléments au moyen de l’attribut « Include », en référençant le chemin du fichier obfusqué dans le répertoire cible. L’élément « RelativePath » indique le chemin relatif du fichier par rapport à la racine du répertoire de déploiement.

Lorsque la cible s’exécute, elle retire la référence au fichier d’origine et ajoute la référence au fichier obfusqué dans le paquet de déploiement, de sorte que l’assembly obfusqué est déployé à la place de l’original.

Pour publier l’application entièrement obfusquée, accédez au dossier du projet et exécutez la commande suivante :

dotnet publish

Dans l’ensemble, cet exemple sert de point de départ aux développeurs qui veulent intégrer l’obfuscation Babel à leur pipeline de build .NET et protéger leur code par l’obfuscation entre assemblies. Il donne en outre quelques conseils sur la façon de modifier le paquet de déploiement pour y inclure les assemblies obfusqués.

Last updated on