Passwortgeschützter Code
In manchen Fällen ist es vorzuziehen, den verschlüsselten Code in der verschleierten Assembly zu belassen, statt ihn in externen Dateien zu speichern. Der Zugriff auf den verschlüsselten Code ist dann durch ein Passwort geschützt. Das verringert die Menge an Informationen, die zum Wiederherstellen der Methode nötig ist, erheblich und erhält dasselbe Sicherheitsniveau. Ohne das Passwort kann die Babel Virtual Machine (BVM) die ursprüngliche Methode nicht wiederherstellen, und der verschlüsselte Code ist nutzlos. Dieser Ansatz verbindet Sicherheit und Leistung, weil der verschlüsselte Code in der Assembly liegt und bei Bedarf schnell zugänglich ist.
Um festzulegen, welcher Code mit einem Passwort verschlüsselt wird, brauchen wir eine XML-Regel, die die zu verschlüsselnde Methode oder den zu verschlüsselnden Typ, den Namen der Quelle und das verwendete Passwort angibt. Hier ein Beispiel für eine solche Regel:
<Rule name="encrypt algorithms" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Algorithms::*</Pattern>
<Properties>
<Source>algorithms</Source>
<Password>mySecretPassword</Password>
<Internal>true</Internal>
</Properties>
<Description>Encrypt code in the Algorithms class using a password.</Description>
</Rule>Beachten Sie, dass die Regel die Eigenschaft Internal mit dem Wert true enthält. Sie weist Babel an, den verschlüsselten Code in der verschleierten Assembly statt in einer externen Datei zu speichern.
Da der verschlüsselte Code in der verschleierten Assembly liegt, muss die Methode GetSourceStream zum Abrufen des verschlüsselten Datenstroms nicht definiert werden. Stattdessen deklarieren wir eine andere Methode, die die BVM aufruft, um das Passwort abzurufen, das zum Entschlüsseln und Ausführen der Methode nötig ist.
[Obfuscation(Feature="msil encryption get password")]
internal static string GetSourcePassword(string source) Zur Laufzeit ruft die BVM GetSourcePassword mit dem Namen der verschlüsselten Datenquelle auf, die den verschlüsselten Methoden zugeordnet ist (hier „algorithms“). Die Methode GetSourcePassword muss das Passwort zurückgeben, mit dem der Bytecode der angeforderten Datenquelle entschlüsselt wird. Die BVM kann die angeforderte Methode anschließend ausführen.
Statt ein festes Passwort zurückzugeben, kann der Hook einen Wert zurückgeben, der aus der Lizenz des Kunden gelesen wird, sodass eine geschützte Funktion nur für lizenzierte Benutzer freigeschaltet wird. Siehe Lizenzgebundene Codeverschlüsselung.