Fichiers de code externes
Lorsque le chiffrement du code est appliqué à une méthode, Babel Obfuscator peut extraire le code chiffré de cette méthode et le stocker dans un fichier binaire distinct, en dehors de l’assembly cible. Ce fichier binaire contient le code MSIL chiffré de la méthode, et la BVM peut le charger en mémoire à l’exécution lorsque la méthode est appelée.
Comme le code chiffré ne se trouve pas dans l’exécutable principal, il peut être déployé séparément de l’application. Cela ouvre plusieurs scénarios, dont la création de licences basées sur des fonctionnalités, où le fichier externe contenant le code chiffré est déployé avec la licence.
Pour générer des fichiers chiffrés pour des méthodes précises, il faut marquer les méthodes chiffrées avec la propriété Source de la fonctionnalité « msil encryption ». Babel sait ainsi quelles méthodes chiffrer et extraire dans un fichier distinct. La propriété Source est l’une des propriétés XML de la fonctionnalité « msil encryption », avec Cache, MinInstructionCount et MaxInstructionCount (voir Règles XML). En donnant un nom unique à la propriété Source, vous l’associez à toutes les méthodes capturées par la règle et générez un fichier distinct contenant les données chiffrées de ces méthodes.
<Rule name="encrypt algorithms" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Algorithms::*</Pattern>
<Properties>
<Source>algorithms</Source>
</Properties>
<Description>Encrypt code in Algorithms class.</Description>
</Rule>Cette règle de la fonctionnalité msil encryption indique à Babel Obfuscator de chiffrer toutes les méthodes de la classe Algorithms. Elle règle aussi la propriété Source sur « algorithms », de sorte que Babel stocke le bytecode chiffré dans un fichier externe nommé « algorithms.eil ».
Lorsqu’une méthode de la classe Algorithms est appelée à l’exécution, la BVM doit récupérer le bytecode chiffré stocké dans le fichier externe algorithms.eil. Pour cela, elle recherche une méthode ayant la signature suivante :
[Obfuscation(Feature="msil encryption get stream")]
internal static Stream GetSourceStream(string source) Cette méthode doit être décorée avec l’attribut System.Reflection.ObfuscationAttribute et la fonctionnalité « msil encryption get stream ». Une fois cette méthode trouvée, la BVM l’appelle avec le nom de la source de données chiffrée associée aux méthodes chiffrées (ici, « algorithms »). La méthode GetSourceStream doit alors renvoyer un objet Stream contenant le bytecode chiffré de la source de données demandée. La BVM peut ensuite déchiffrer et exécuter la méthode demandée.