Skip to Content
Nouvelle version 12 disponible 🎉
ObfuscatorPackage NuGetDéfense en profondeur

Défense en profondeur : toutes les couches dans un seul build

Une protection solide ne repose pas sur une astuce unique : elle repose sur des couches. Cet exemple active toutes les protections du package NuGet Babel Obfuscator sur un petit assembly, pour que vous puissiez voir la configuration Ultimate complète dans un seul fichier de projet et l’adapter à votre propre application.

Pour utiliser cet exemple, vous avez besoin d’une licence de site pour Babel Obfuscator (édition Ultimate, Server ou Data Center). Le code source est disponible sur GitHub :

git clone https://github.com/babelfornet/defense-in-depth-nuget-example.git

L’application est un petit contrôle d’accès aux fonctionnalités (src/LicenseGate/FeatureGate.cs) qui contient exactement le genre d’éléments que protège chaque couche (des chaînes, des coefficients numériques, un tableau et une logique de branchement) :

internal static class FeatureGate { private static readonly int[] Weights = { 3, 7, 11, 13, 17, 19, 23, 29, 31, 37 }; private static readonly string Pepper = "d3f3ns3-1n-d3pth-pepper"; public static GateReport Evaluate(string edition, int tokens, double budget) { bool allowed = edition is "PRO" or "ENTERPRISE" && tokens > 0 && budget >= 100.0; double score = 0.0; for (int i = 0; i < Weights.Length; i++) score += Weights[i] * (tokens + 1) * 0.5; return new GateReport(edition, allowed, Math.Round(score / budget, 4), Digest(edition, tokens)); } // Digest … }

Le projet console LicenseGate empile les couches en Release :

<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <!-- Rename & restructure --> <FlattenNamespaces>true</FlattenNamespaces> <OverloadedRenaming>true</OverloadedRenaming> <VirtualFunctions>true</VirtualFunctions> <!-- Hide data --> <StringEncryption>stream</StringEncryption> <ValueEncryption>int32=true;int64=true;single=true;double=true;array=true;true</ValueEncryption> <ResourceEncryption>true</ResourceEncryption> <!-- Obscure logic --> <ControlFlowObfuscation>if=true;switch=true;case=true;chain=true;true</ControlFlowObfuscation> <ControlFlowIterations>3</ControlFlowIterations> <DynamicProxy>external=true;true</DynamicProxy> <!-- Detect & deter runtime attacks --> <TamperingDetection>true</TamperingDetection> <DebuggingProtection>true</DebuggingProtection> <SuppressIldasm>true</SuppressIldasm> <!-- Strip metadata --> <CleanAttributes>true</CleanAttributes> <SealClasses>true</SealClasses> <BabelWarningsAsErrors>W00000</BabelWarningsAsErrors> </PropertyGroup>

Chaque propriété ajoute une couche : le renommage et l’aplatissement des espaces de noms masquent l’intention ; le chiffrement des chaînes, des valeurs et des ressources masque les données ; le flux de contrôle et le proxy dynamique masquent la logique ; la détection de falsification et la protection contre le débogage dissuadent les attaques à l’exécution ; et le nettoyage des métadonnées retire ce dont l’application en cours d’exécution n’a pas besoin. Comme le package est une dépendance utilisée uniquement à la génération (PrivateAssets=all), rien de tout cela ne se retrouve dans le graphe de dépendances de l’application, et les étapes ultérieures du SDK travaillent sur l’assembly déjà protégé.

Générer l’exemple en Release applique tout ce qui précède sans modifier la sortie du programme ; ouvrez le résultat dans un décompilateur et comparez-le au build Debug pour voir la différence. Cet exemple reprend les recommandations de Renforcer la sécurité du code : partez de cette configuration et retirez les couches dont vous n’avez pas besoin.

Last updated on