Skip to Content
Neue Version 12 verfügbar 🎉
ObfuscatorCodeverschlüsselungLizenzgebundene Codeverschlüsselung

Lizenzgebundene Codeverschlüsselung

Die lizenzgebundene Codeverschlüsselung ist eine Variante des unter Passwortgeschützter Code beschriebenen Verfahrens. Das Passwort, das eine verschlüsselte Methode freischaltet, ist dabei keine feste Konstante, die im Build hinterlegt ist, sondern ein Wert, der zur Laufzeit aus der Lizenz des Kunden gelesen wird.

Die geschützte Methode wird weiterhin in der verschleierten Assembly ausgeliefert, ihr Code bleibt aber verschlüsselt, bis eine gültige Lizenz das richtige Passwort liefert. Eine sensible oder Premium-Funktion läuft damit nur für Benutzer, deren Lizenz sie freigibt, während der Rest der Anwendung für alle anderen normal weiterarbeitet.

Nach diesem Muster schützt Babel Obfuscator intern seine eigenen lizenzierten Funktionen. Es setzt auf der gewöhnlichen Codeverschlüsselung auf, die Sie bereits kennen: Es gibt nichts Neues zu installieren, Sie schreiben nur eine Regel und einen kleinen Hook.

Funktionsweise

  1. Den zu schützenden Code kennzeichnen. Eine XML-Regel (oder das Attribut Obfuscation) wählt die zu verschlüsselnden Methoden oder Typen aus und weist ihnen einen Quellnamen und ein Passwort zu. Der verschlüsselte Code bleibt dabei in der Assembly (Internal = true).
  2. Einen Get-Password-Hook bereitstellen. Eine mit [Obfuscation(Feature = "msil encryption get password")] gekennzeichnete Methode erhält den Quellnamen und gibt das Passwort dieser Quelle zurück, indem sie ein Feld der geladenen Lizenz liest.
  3. Ausführen. Wenn die geschützte Methode zum ersten Mal aufgerufen wird, ruft die Babel Virtual Machine (BVM) den Hook auf, um das Passwort der Quelle zu erhalten. Enthält die Lizenz das erwartete Feld, wird die Methode entschlüsselt und ausgeführt. Fehlt das Feld oder ist der Wert falsch, schlägt die Entschlüsselung fehl, und die Methode kann nicht laufen. Die Funktion ist damit faktisch gesperrt.

Lizenzgebunden sind nur die Methoden, die von einer Regel mit einem <Source> erfasst werden. Methoden, die mit einfachem --msilencryption (ohne Quelle) verschlüsselt sind, werden aus der Assembly selbst entschlüsselt und laufen auch ohne Lizenz. Die nicht lizenzierte Anwendung funktioniert also weiter, nur die an die Lizenz gebundenen Funktionen bleiben gesperrt.

Code verschlüsseln

Fügen Sie eine Regel hinzu, die den sensiblen Code verschlüsselt und an eine benannte Quelle und ein Passwort bindet:

<Rule name="encrypt premium" feature="msil encryption" exclude="false"> <Target>Methods</Target> <Pattern>ACME.Premium::*</Pattern> <Properties> <Source>premium</Source> <Password>Xa9!k2$LpQ7r</Password> <Internal>true</Internal> </Properties> <Description>Encrypt the premium feature, unlocked by the license.</Description> </Rule>

Dasselbe lässt sich direkt im Code mit dem Attribut Obfuscation ausdrücken:

[Obfuscation(Feature = "msil encryption:internal=true;source=premium;password=Xa9!k2$LpQ7r", Exclude = false)] internal class Premium { public string Run() => "premium result"; }

Das <Password>, das Sie beim Build festlegen, muss mit dem Wert übereinstimmen, den der Get-Password-Hook zur Laufzeit für diese Quelle zurückgibt. In einem lizenzgebundenen Entwurf liest der Hook diesen Wert aus der Lizenz. Speichern Sie deshalb denselben Wert in dem Lizenzfeld, das Sie für Ihre Kunden ausstellen.

Passwort aus der Lizenz lesen

Deklarieren Sie einen einzigen Hook, der einem Quellnamen das in der Lizenz gespeicherte Passwort zuordnet. Das folgende Beispiel sucht mit Babel Licensing eine lizenzierte Funktion und gibt deren Wert zurück:

[Obfuscation(Feature = "msil encryption get password")] internal static string GetSourcePassword(string source) { var license = LicenseManager.Instance.License; var feature = license.Features.FirstOrDefault(f => f.Name == source); if (feature == null) throw new ApplicationException($"feature '{source}' is not licensed"); return Encoding.UTF8.GetString(feature.Data); }

Zur Laufzeit ruft die BVM GetSourcePassword("premium") auf. Der Hook gibt das Passwort zurück, das in der Lizenz des Kunden gespeichert ist, und die Premium-Methode wird entschlüsselt und ausgeführt.

Der Hook muss für den Code erreichbar sein, den Babel einfügt. Deklarieren Sie ihn deshalb als public oder internal. Wenn Sie ihn private oder protected lassen, erweitert Babel ihn bei der Verschleierung automatisch auf internal (er wird nie öffentlich gemacht), damit der eingefügte Code ihn aufrufen kann.

Eine vollständige, lauffähige Implementierung, einschließlich der Klasse LicenseManager und des Ausstellens von Lizenzen je Edition, finden Sie im Beispiel Funktionsbasierte Lizenzen.

Funktioniert mit jeder Art der Lizenzauslieferung

Da der Hook einfach aus dem geladenen Lizenzobjekt liest, ist die lizenzgebundene Codeverschlüsselung unabhängig davon, wie die Lizenz die Anwendung erreicht. Sie funktioniert unverändert mit allen Auslieferungsarten von Babel Licensing:

  • Lizenzdatei: eine signierte Lizenzdatei, die mit dem Client ausgeliefert oder auf ihn heruntergeladen wird.
  • Floating-Lizenz: Plätze, die von einem Babel Licensing Service ausgeliehen werden.
  • Lizenzaktivierung: eine Lizenz, die aktiviert und an den Rechner gebunden wird.

Für welche Lizenzierungsart Sie sich auch entscheiden: Sobald Ihr Lizenzierungscode die Lizenz validiert und geladen hat, kann der Get-Password-Hook das benötigte Feld lesen, und die geschützte Funktion wird freigeschaltet.

Möchten Sie den verschlüsselten Code ganz aus der Hauptassembly heraushalten? Kombinieren Sie dieses Muster mit dem unter Externe Codedateien beschriebenen Verfahren, um die verschlüsselte Methode zusammen mit der Lizenz bereitzustellen.

Last updated on