Renforcer la sécurité du code
Bonnes pratiques pour renforcer la sécurité du code.
Babel Obfuscator offre une protection solide de votre code. Explorer toutes les subtilités de l’obfuscation peut prendre du temps ; cette page réunit donc une série de conseils qui vous aideront à obtenir une obfuscation optimale avec un minimum d’effort. En suivant ces recommandations, vous renforcez nettement la sécurité de votre code sans vous perdre dans les détails.
Une protection solide repose sur la défense en profondeur : aucune transformation n’est censée arrêter un attaquant à elle seule. Le renommage masque l’intention, le chiffrement masque les données, le flux de contrôle et les proxys dynamiques masquent la logique, et les contrôles à l’exécution dissuadent la falsification et le débogage. Combinez plusieurs couches afin que, si l’une est contournée, les autres restent en place. Les conseils ci-dessous sont regroupés selon ce que chaque couche protège.
Renommer et restructurer vos symboles
Envisager d’internaliser les types en C# ou de les marquer Friend en VB
Déclarer les types comme internal ou Friend (dans la terminologie VB) garantit qu’ils ne sont pas visibles des assemblies externes et qu’ils peuvent être renommés sans risque pendant l’obfuscation. Cette mesure met efficacement votre code à l’abri des regards indiscrets.
Babel Obfuscator permet de renommer les types publics ou les symboles visibles de l’extérieur de l’assembly à l’aide de règles XML. Ce choix doit toutefois être examiné avec soin, car si le symbole est utilisé par des assemblies externes, l’application ne fonctionnera plus. Ainsi, alors qu’internaliser les types ou les marquer Friend est un moyen simple de renforcer la sécurité, forcer le renommage des symboles publics exige une réflexion et des tests approfondis.
Renforcer le renommage
Au-delà du renommage des symboles par défaut, quelques options rendent les métadonnées renommées nettement plus difficiles à lire :
- Le renommage avec surcharge réutilise un même nom obfusqué pour de nombreux membres sans rapport entre eux, de sorte que les métadonnées ne correspondent plus un à un à vos membres.
- L’aplatissement des espaces de noms supprime la hiérarchie de vos espaces de noms et efface les indices structurels sur lesquels s’appuie un décompilateur.
- Le renommage des membres virtuels renomme les membres virtuels et les membres d’interface de façon cohérente dans toute la hiérarchie de types.
Babel CLI
babel.exe myapp.dll --overloaded --flatns --virtualmembersFusionner les dépendances chaque fois que possible
Babel Obfuscator vous permet de fusionner les assemblies référencés dans l’assembly cible. En internalisant tous les types fusionnés, vous augmentez le nombre de symboles renommés, ce qui rend votre code plus difficile à comprendre pour d’éventuels attaquants.
Masquer les données constantes
Utiliser l’algorithme HASH pour le chiffrement des chaînes
L’algorithme de chiffrement des chaînes HASH offre une protection solide tout en réduisant la taille de l’assembly obfusqué sur le disque. Vous pouvez activer cette fonctionnalité avec la commande suivante :
Babel CLI
babel.exe myapp.exe --stringencryption hashTâche MSBuild Babel
<PropertyGroup>
<StringEncryption>hash</StringEncryption>
</PropertyGroup>Chiffrer les valeurs en ligne et les tableaux
Les constantes numériques et les tableaux en ligne contiennent souvent des données sensibles : seuils, clés, nombres magiques, tables de correspondance. Le chiffrement des valeurs et des tableaux retire ces littéraux de l’IL et les déchiffre à l’exécution, de sorte qu’un décompilateur ne voit plus les nombres réels ni le contenu des tableaux.
Babel CLI
babel.exe myapp.exe --values int32=on --values int64=on --values single=on --values double=on --values array=onChiffrer les ressources managées
Le chiffrement des ressources masque les ressources incorporées dans votre assembly tout en les compressant, ce qui ajoute une couche de protection. Évaluez soigneusement l’incidence sur les performances avant d’activer cette fonctionnalité.
Dissimuler la logique du programme
Activer l’obfuscation du flux de contrôle
L’obfuscation du flux de contrôle complexifie les instructions if, insère des branchements inutiles et introduit de multiples instructions switch sans modifier le comportement de la méthode. L’activation d’algorithmes de flux de contrôle précis tels que goto, if, switch, case et call assure le meilleur brouillage du code. Les paramètres recommandés suivants vous aideront à obtenir une obfuscation du flux de contrôle efficace :
Babel CLI
babel.exe myapp.exe --controlflow goto=on --controlflow if=on --controlflow switch=on --controlflow case=on --controlflow call=onTâche MSBuild Babel
<PropertyGroup>
<ControlFlowObfuscation>goto=true;if=true;switch=true;case=true;call=true;true</ControlFlowObfuscation>
<ControlFlowIterations>3</ControlFlowIterations>
</PropertyGroup>Avec les paramètres d’obfuscation du flux de contrôle ci-dessus, vous obtenez une obfuscation solide et efficace de votre code. Les différents algorithmes (goto, if, switch, case et call) contribuent à rendre le flux de contrôle plus tortueux et plus difficile à analyser, ce qui renforce la sécurité de votre application.
Utiliser la génération de proxys dynamiques pour les appels de méthodes externes
Le proxy dynamique masque efficacement les appels aux méthodes externes et internes. Activer la génération de proxys dynamiques pour les appels externes suffit souvent à atteindre un niveau d’obfuscation élevé.
babel.exe myapp.exe --proxy externalChiffrer le code
Le chiffrement du code offre une protection solide aux méthodes qui traitent des données sensibles, comme la vérification d’une clé de licence. Tenez toutefois compte de son incidence sur les performances, car le chiffrement du code peut ralentir l’application : appliquez-le de façon sélective aux méthodes qui en ont besoin.
Grâce à l’intégration du Babel Licensing Service, vous pouvez utiliser des licences d’activation ou des licences flottantes pour mettre en place des licences basées sur des fonctionnalités. Vous pouvez ainsi remettre les clés de chiffrement de façon sécurisée par l’intermédiaire du service de licences et déverrouiller des fonctionnalités précises de votre application pour les utilisateurs autorisés.
En associant le Babel Licensing Service au chiffrement du code, vous garantissez que seuls les utilisateurs disposant d’une licence ont accès aux portions de code chiffrées. La clé de chiffrement est remise de façon sécurisée par le service de licences, ce qui empêche toute utilisation non autorisée et préserve l’intégrité des fonctionnalités de votre application.
Détecter et dissuader les attaques à l’exécution
Activer la protection contre la falsification
La protection contre la falsification détecte toute modification non autorisée de votre assembly. Choisissez des actions appropriées, comme arrêter l’exécution ou signaler une erreur à l’utilisateur, pour dissuader les attaquants. Privilégier des actions silencieuses rend le mécanisme de protection contre la falsification plus difficile à contourner.
babel.exe myapp.exe --tamperingdetectionActiver la protection contre le débogage
La protection contre le débogage détecte l’exécution de votre application sous un débogueur ou un profileur, les outils qu’un attaquant utilise pour observer les secrets au moment où ils sont déchiffrés à l’exécution. Associée aux couches de chiffrement ci-dessus, elle comble la lacune que laisse l’analyse statique.
babel.exe myapp.exe --antidebuggingBloquer les outils de désassemblage et de réflexion
Deux options légères rendent plus difficile une inspection superficielle : --ildasm marque l’assembly pour que le désassembleur MSIL (ildasm.exe) refuse de l’ouvrir, et --reflection empêche les outils fondés sur la réflexion de lister les métadonnées de l’assembly.
babel.exe myapp.exe --ildasm --reflectionRetirer ce que vous n’avez pas besoin de livrer
Chaque élément de métadonnées que vous laissez en place est un indice. Supprimez ce dont l’application en cours d’exécution n’a pas besoin :
- Nettoyer les attributs :
--cleanattrssupprime les attributs personnalisés qui ne servaient qu’au compilateur ou à vos outils. - Supprimer le code mort :
--deadcodeélimine les méthodes et les membres inaccessibles. - Supprimer les énumérations :
--enumremovalremplace les types enum par leurs constantes sous-jacentes. - Sceller les classes internes :
--sealscelle les types internes dont aucun type n’hérite. - Ne pas livrer les symboles de débogage : déployez sans le fichier
.pdb(évitez--debug) afin que les numéros de ligne et les noms des variables locales ne soient pas accessibles à un attaquant.
Une configuration de base recommandée
La commande suivante combine les couches ci-dessus en une configuration solide et polyvalente. Ajoutez --msilencryption pour les méthodes sensibles qui le justifient.
babel.exe myapp.dll `
--overloaded --flatns --virtualmembers `
--stringencryption hash `
--values int32=on --values int64=on --values single=on --values double=on --values array=on `
--controlflow if=on --controlflow switch=on --controlflow case=on --controlflow chain=on `
--proxy external `
--resourceencryption `
--tamperingdetection --antidebugging --ildasm `
--cleanattrs --sealLes propriétés équivalentes de la tâche MSBuild :
<PropertyGroup>
<OverloadedRenaming>true</OverloadedRenaming>
<FlattenNamespaces>true</FlattenNamespaces>
<VirtualFunctions>true</VirtualFunctions>
<StringEncryption>hash</StringEncryption>
<ValueEncryption>int32=true;int64=true;single=true;double=true;array=true;true</ValueEncryption>
<ControlFlowObfuscation>if=true;switch=true;case=true;chain=true;true</ControlFlowObfuscation>
<DynamicProxy>external=true;true</DynamicProxy>
<ResourceEncryption>true</ResourceEncryption>
<TamperingDetection>true</TamperingDetection>
<DebuggingProtection>true</DebuggingProtection>
<SuppressIldasm>true</SuppressIldasm>
<CleanAttributes>true</CleanAttributes>
<SealClasses>true</SealClasses>
</PropertyGroup>Conserver un fichier de mappage pour l’assistance
Une obfuscation agressive rend illisibles les traces de pile en production. Conservez le fichier de mappage d’obfuscation produit à chaque build afin de pouvoir décoder les traces de pile et retrouver les noms d’origine lorsque vous diagnostiquez les problèmes de vos clients, sans affaiblir l’assembly livré.
Testez l’application obfusquée : il est essentiel de tester minutieusement votre application obfusquée pour repérer et corriger les éventuels problèmes introduits par l’obfuscation. Les tests garantissent la stabilité et le bon fonctionnement de votre code. Si vous déployez sur des hôtes en mode FIPS, consultez aussi Conformité FIPS, car plusieurs couches de chiffrement déchiffrent à l’exécution au moyen du fournisseur cryptographique de la plateforme.
Suivre ces conseils d’obfuscation vous permet de tirer pleinement parti de Babel Obfuscator et de renforcer la sécurité de votre code. Pour des informations plus détaillées et des indications complètes, consultez le guide de l’utilisateur de Babel Obfuscator.