PHS Dotfuscryptor – Details
Der PHS Dotfuscryptor bietet eine umfassende .NET Assembly Protection und -Packaging Suite. Um seine Vorzüge gegenüber anderen Verfahren und Produkten besser verstehen zu können, ist es notwendig, zunächst den .NET Framework Compilation- und Reflection-Vorgang sowie die Technik des Obfuscatings genauer zu betrachten.
.NET Compilation
Anders als bei nativen Applikationen, wird Programmcode, der in einer der .NET Sprachen wie C# oder VB.NET verfasst ist, beim Compilieren von einem der .NET Compiler zunächst nicht direkt in Maschinencode, sondern in den Common Intermediate Language Code (CIL Code) übersetzt. Zusammen mit den Metadaten, die Informationen über die im CIL Code definierten Klassen, Methoden und Datenfelder enthalten, wird dieser zu einem .NET Assembly zusammengesetzt. Erst beim Programmstart auf dem Zielsystem werden die im Assembly enthaltenen Metadaten und der CIL Code zusammen vom Just-In-Time Compiler (JIT Compiler) des .NET Frameworks in auf der Zielplattform ausführbaren nativen Applikationscode (Opcodes) umgewandelt.
Reflection
Der .NET CIL Code stellt dabei gewissermaßen den gemeinsamen Nenner aller .NET Sprachen dar. Dementsprechend kann CIL Code jederzeit wieder in eine der .NET Sprachen rückübersetzt werden. Mit den im .NET Assembly enthaltenen Metadaten stehen zusätzliche Informationen zur Verfügung, die diese Rückübersetzung weiter vereinfachen und eindeutiger, vor allem aber automatisierbar, machen. Im Gegensatz zu nativen Applikationen, für deren Disassemblierung und Bearbeitung einiges an Erfahrung erforderlich ist, können .NET Assemblies damit sehr leicht auch von Laien in ihre Einzelteile zerlegt, bearbeitet und wieder in lauffähige, modifizierte .NET Assemblies zusammengesetzt werden. Ein effektiver Schutz der eigenen .NET Software vor Spionage (Schutz geistigen Eigentums) oder Manipulation (Kopierschutz, einfache Umsetzung von verschiedenen Editions wie Trialversionen) wird damit beinahe unmöglich.
Obfuscation
Eine mögliche und weit verbreitete Gegenmaßnahme stellt das Obfuscating dar, welches von unterschiedlichen Herstellern in Form von verschiedenen Softwareprodukten angeboten wird. Beim Obfuscating wird das .NET Assembly nach dem Compilieren von einem Programm, dem sogenannten Obfuscator, nachbearbeitet. Diese Nachbearbeitung verfolgt das Ziel, die Interna des Programms so zu verschleiern, dass ein möglicher Angreifer von der Manipulation des Assemblies oder dem wiederherstellen des Originalquellcodes abgehalten wird. Zu diesem Zweck werden vom Obfuscator sowohl an den Metadaten als auch am CIL Code Veränderungen vorgenommen.
Diese Veränderungen reichen von (vermeintlich) harmlosen Eingriffen wie dem Umbenennen von Variablen und Klassen auf kryptische, nicht druckbare Namen bis hin zu äußerst tiefgreifenden Maßnahmen wie der „ergebnisäquivalenten Manipulation“ der Programmlogik. Direkt aus dieser Art der Vorgehensweise resultieren auf Basis des Designs des .NET Frameworks zahlreiche Nachteile des klassischen Obfuscatings. Neben einigen anderen sind diese hauptsächlich:
- Gravierende und nachhaltige Veränderung der Codebasis
- Plaintext-String-Literale und andere Ressourcen, die sensible Daten beinhalten können, bleiben oft unberührt
- Einschränkungen in der Verwendbarkeit von mächtigen Konzepten wie Reflection
- Sehr großes Vertrauen in den Anbieter notwendig
- Verwendung muss bereits Entwicklungsprozess im berücksichtigt werden
- Nachträgliche Verwendung bzw. Nachrüstung oft schwierig
PHS Dotfuscryptor
Im Gegensatz zu diesem nahe dem Security-Through-Obscurity anzusiedelnden Prinzip, verfolgt der PHS Dotfuscryptor einen gänzlich anderen Ansatz und weicht so den oben angeführten Einschränkungen und Nachteilen aus. Genauer gesagt baut der PHS Dotfuscryptor zum Schutz der .NET Assemblies auf starke Kryptographie und lässt sowohl die Metadaten als auch den eigentlichen CIL Code an sich absolut unverändert. Der PHS Dotfuscryptor geht aber noch einen Schritt weiter. Als native Windows Anwendung starten mit dem PHS Dotfuscryptor geschützte .NET Anwendungen komplett ohne .NET Runtime Umgebung und fahren diese erst on-demand hoch.
Dementsprechend sind weder die Metadaten noch der CIL Code des geschützten Assemblies von außen für einen Reflector zugänglich. Zur Laufzeit werden diese jedoch exakt wie im ursprünglichen Assembly enthalten dem JIT Compiler zugeführt und das Ergebnis zur Ausführung gebracht. Im Vergleich zum Schutz durch Obfuscation ergeben sich daher folgende Vorteile:
- Keine Veränderung der Codebasis (keine Veränderung der Programmlogik)
- Impliziter Schutz von Plaintext-String-Literalen und eingebetteten Ressourcen
- Reflection uneingeschränkt möglich (kein Name Mangling)
- Unabhängig vom Entwicklungsprozess
- Auch für bestehende Assemblies jederzeit bedenkenlos nachrüstbar
Zusätzlich dazu bietet der PHS Dotfuscryptor noch weitere Funktionen, wie etwa einen Assembly-Packaging- oder einen Debugger-Schutz-Mechanismus. Während es ersterer ermöglicht, zusäztlich vom Startup-Assembly benötigte Referenzen direkt in das finale Executable einzubetten und ebenfalls vor Disassemblierung zu schützen, bietet letzterer die Möglichkeit, die Applikation gegen Manipulationen durch externe Debugger zu sichern.
Übersicht ← | → Features |