Externe Codedateien
Wird die Codeverschlüsselung auf eine Methode angewendet, kann Babel Obfuscator den verschlüsselten Code dieser Methode herauslösen und als eigene Binärdatei außerhalb der Ziel-Assembly speichern. Diese Binärdatei enthält den verschlüsselten MSIL-Code der Methode, und die BVM kann sie zur Laufzeit in den Speicher laden, wenn die Methode aufgerufen wird.
Da der verschlüsselte Code nicht in der ausführbaren Hauptdatei enthalten ist, kann er getrennt von der Anwendung bereitgestellt werden. Das ermöglicht verschiedene Szenarien, darunter funktionsbasierte Lizenzen, bei denen die externe Datei mit dem verschlüsselten Code zusammen mit der Lizenz bereitgestellt wird.
Um verschlüsselte Dateien für bestimmte Methoden zu erzeugen, müssen wir die verschlüsselten Methoden mit der Eigenschaft Source der Funktion „msil encryption“ kennzeichnen. Daran erkennt Babel, welche Methoden verschlüsselt und in eine eigene Datei ausgelagert werden. Die Eigenschaft Source ist eine der XML-Eigenschaften der Funktion „msil encryption“, neben Cache, MinInstructionCount und MaxInstructionCount (siehe XML-Regeln). Indem wir der Eigenschaft Source einen eindeutigen Namen geben, verknüpfen wir ihn mit allen Methoden, die die Regel erfasst, und erzeugen eine eigene Datei mit den verschlüsselten Daten dieser Methoden.
<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>Diese Regel für die Funktion msil encryption weist Babel Obfuscator an, alle Methoden der Klasse Algorithms zu verschlüsseln. Sie setzt außerdem die Eigenschaft Source auf „algorithms“, sodass Babel den verschlüsselten Bytecode in einer externen Datei namens „algorithms.eil“ speichert.
Wenn zur Laufzeit eine Methode der Klasse Algorithms aufgerufen wird, muss die BVM den verschlüsselten Bytecode aus der externen Datei algorithms.eil abrufen. Dazu sucht die BVM nach einer Methode mit der folgenden Signatur:
[Obfuscation(Feature="msil encryption get stream")]
internal static Stream GetSourceStream(string source) Diese Methode muss mit dem Attribut System.Reflection.ObfuscationAttribute und der Funktion „msil encryption get stream“ versehen sein. Sobald die BVM diese Methode findet, ruft sie sie mit dem Namen der verschlüsselten Datenquelle auf, die den verschlüsselten Methoden zugeordnet ist (hier „algorithms“). Die Methode GetSourceStream muss dann ein Stream-Objekt zurückgeben, das den verschlüsselten Bytecode der angeforderten Datenquelle enthält. Die BVM kann die angeforderte Methode anschließend entschlüsseln und ausführen.