Metadatenoptimierungen
Die Metadatenoptimierungen von Babel Obfuscator sind eine Reihe von Techniken, die die Metadaten des verschleierten Codes verbessern. Die Metadaten enthalten Informationen über Typen, Member, Attribute und andere wesentliche Aspekte der Codebasis. Die Optimierungen sollen die Sicherheit des Codes erhöhen, seine Größe verringern und ihn widerstandsfähiger gegen Reverse Engineering machen.
Automatisches Versiegeln von Klassen
Das automatische Versiegeln von Klassen ist eine Optimierungstechnik von Babel Obfuscator. Sie soll die Ausführung des Codes beschleunigen, indem sie Klassen versiegelt, die in keiner Vererbungskette als Basisklasse dienen. Bei einer versiegelten Klasse kann der JIT-Compiler (Just-In-Time) effizienteren Code erzeugen, weil er virtuelle Methoden nicht virtuell aufruft. Damit entfällt der Aufwand für die Auflösung virtueller Methoden.
Befehlszeile
Das automatische Versiegeln von Klassen schalten Sie auf der Befehlszeile mit dem Schalter --seal ein. Er wendet die Optimierung auf alle nicht öffentlichen Typen der Ziel-Assembly an. Der folgende Befehl versiegelt zum Beispiel die Klassen der Assembly „myapp.exe“:
babel myapp.exe --sealSollen bestimmte Typen gezielt vom automatischen Versiegeln ausgenommen werden, lässt sich eine XML-Regel definieren. Mit einem Muster aus einem regulären Ausdruck schließen Sie bestimmte Typen vom Versiegeln aus. In der folgenden XML-Regel werden die Klassen im Namespace „Utilities“ nicht automatisch versiegelt:
<Rule name="seal classes" feature="optimizations" exclude="false">
<Pattern>Utilities.*</Pattern>
<Properties>
<ClassSealing>false</ClassSealing>
</Properties>
</Rule>Beachten Sie, dass das Attribut „exclude“ in diesem Beispiel den Wert „false“ hat, damit nicht alle Optimierungen ausgeschaltet werden. Mit dem gezielten Einsatz des automatischen Versiegelns stimmen Entwickler die Optimierung auf ihre Anforderungen ab und finden ein Gleichgewicht zwischen Leistungsgewinn und dem Erhalt bestimmter Verhaltensweisen von Klassen.
MSBuild-Aufgabe Babel
Um das automatische Versiegeln von Klassen mit der MSBuild-Aufgabe Babel einzuschalten, setzen Sie die Eigenschaft <SealClasses> in einem Element <PropertyGroup>:
<PropertyGroup>
<SealClasses>true</SealClasses>
</PropertyGroup>
<Babel SealClasses="$(SealClasses)" />In diesem Beispiel hat die Eigenschaft <SealClasses> den Wert true. Das automatische Versiegeln von Klassen ist damit bei der Verschleierung eingeschaltet.
Entfernung unerwünschter Attribute
Die Optimierung zur Entfernung von Attributen in Babel Obfuscator beseitigt unnötige Attribute aus dem vom Compiler generierten Code. Dieser Code enthält oft Attribute, die das Verhalten der Anwendung bei der Ausführung nicht beeinflussen. Babel kann solche Attribute an den definierten Symbolen erkennen und entfernen. Die verschleierte Codebasis wird dadurch knapper und effizienter.
Attribute wie CompilerGeneratedAttribute oder DebuggerDisplayAttribute, die für die Anwendung selbst nicht wesentlich sind, können zum Beispiel gefahrlos entfernt werden. Ohne diese unerwünschten Attribute wird das verschleierte Ziel kleiner, und vom Compiler generierter Code lässt sich nicht mehr von Benutzercode unterscheiden.
Befehlszeile
Um die Optimierung „Entfernung unerwünschter Attribute“ einzuschalten, verwenden Sie beim Ausführen von Babel auf der Befehlszeile den Schalter --cleanattrs.
babel myapp.exe --cleanattrsDie Liste der Attribute, die entfernt werden, steht in der Datei babel.exe.config. Der folgende Befehl zeigt die Attribute an, die zur Entfernung konfiguriert sind:
babel --help cleanattrsDie Ausgabe zeigt die unerwünschten Attribute mit ihren vollständigen Typnamen.
Babel nimmt außerdem einen regulären Ausdruck an, der auf die vollständigen Typnamen unerwünschter Attribute passt. Zum Beispiel:
babel myapp.exe --cleanattrs System.Diagnostics.*AttributeDieser Befehl entfernt alle benutzerdefinierten Attributtypen, die im Namespace System.Diagnostics definiert sind.
Der Konfigurationsabschnitt von babel.exe.config enthält unter dem Element „UnwantedAttributes“ eine vordefinierte Liste unerwünschter Attribute. Jeder Eintrag der Auflistung ist der qualifizierte Typname eines Attributs.
MSBuild-Aufgabe Babel
Um die Entfernung unerwünschter Attribute mit der MSBuild-Aufgabe Babel einzuschalten, setzen Sie die Eigenschaft <CleanAttributes> in einem Element <PropertyGroup>:
<PropertyGroup>
<CleanAttributes>System.Diagnostics.*Attribute;true</CleanAttributes>
</PropertyGroup>
<Babel CleanAttributes="$(CleanAttributes)" />In diesem Beispiel gibt die Eigenschaft <CleanAttributes> die Liste der regulären Ausdrücke an, die auf die vollständigen Typnamen der zu entfernenden Attribute passen. Das true am Ende ist der globale Schalter für diese Funktion.
XML-Regeln
Mit der Regeleigenschaft „UnwantedAttributes“ lässt sich die Entfernung von Attributen für alle Member, auf die ein regulärer Ausdruck passt, fein konfigurieren. Mit Regeln können Entwickler bestimmte Teile des Codes von der Entfernung unerwünschter Attribute ausnehmen.
Die folgende XML-Regel nimmt zum Beispiel den Namespace „Utilities“ von der Entfernung von Attributen aus:
<Rule name="unwanted attributes" feature="optimizations" exclude="false">
<Pattern>Utilities.*</Pattern>
<Properties>
<UnwantedAttributes>false</UnwantedAttributes>
</Properties>
</Rule>Mit der Optimierung „Entfernung unerwünschter Attribute“ optimiert Babel Obfuscator den verschleierten Code: Unnötige Attribute verschwinden, der Code wird kleiner, und in der verschleierten Assembly bleiben nur relevante und wesentliche Informationen.
Entfernung von System.Enum-Typen
Die Entfernung von Enumerationstypen ist eine Optimierung von Babel Obfuscator, die die in der Ziel-Assembly definierten System.Enum-Typen entfernt. Sie ersetzt die Felder dieser Enumerationstypen durch ihre Werte. Die Codebasis wird dadurch kompakter und der disassemblierte Code schwerer verständlich, weil statt der Feldnamen konstante Werte stehen.
Befehlszeile
Die Entfernung von Enumerationstypen schalten Sie beim Ausführen von Babel auf der Befehlszeile mit der Option --enumremoval ein. Zum Beispiel:
babel myapp.exe --enumremovalDieser Befehl schaltet die Optimierung ein, die System.Enum-Typen aus der verschleierten Assembly entfernt.
MSBuild-Aufgabe Babel
Um die Entfernung von Enumerationstypen mit der MSBuild-Aufgabe Babel einzuschalten, setzen Sie die Eigenschaft <EnumRemoval> in einem Element <PropertyGroup> auf true:
<PropertyGroup>
<EnumRemoval>true</EnumRemoval>
</PropertyGroup>
<Babel EnumRemoval="$(EnumRemoval)" />XML-Regeln
Babel stellt in den XML-Regeln die Regeleigenschaft EnumRemoval bereit, mit der Entwickler bestimmte Enumerationstypen gezielt ein- oder ausschließen. Definieren Sie dazu XML-Regeln, die das gewünschte Verhalten für bestimmte Muster oder Namespaces festlegen. Die folgende XML-Regel nimmt zum Beispiel den Namespace „Utilities“ von der Entfernung von Enumerationstypen aus:
<Rule name="enum removal" feature="optimizations" exclude="false">
<Pattern>Utilities.*</Pattern>
<Properties>
<EnumRemoval>false</EnumRemoval>
</Properties>
</Rule>Mit dieser Regel werden die Enumerationstypen im Namespace „Utilities“ bei der Optimierung nicht entfernt.
Die Entfernung von System.Enum-Typen hat mehrere Vorteile. Erstens spart sie Speicherplatz, weil die verschleierte Assembly kleiner wird. Zweitens ersetzt sie die Felder der Enumerationen durch ihre Werte und fügt dem disassemblierten Code so eine weitere Ebene der Verschleierung und Komplexität hinzu. Angreifern fällt es dadurch schwerer, die zugrunde liegende Logik und das Verhalten zu verstehen.
Mit der Entfernung von System.Enum-Typen in Babel Obfuscator erhöhen Entwickler die Sicherheit ihrer Codebasis und schützen deren Integrität. Zugleich optimieren sie Größe und Lesbarkeit der verschleierten Assembly.
Aufteilung von Eigenschaften und Ereignissen
Die Aufteilung von Eigenschaften und Ereignissen (Disgregate Removal) ist eine Optimierung von Babel Obfuscator, die die Informationen über Eigenschaften und Ereignisse aus den jeweiligen Metadatentabellen entfernt. Dabei werden die Methoden get_ und set_ der Eigenschaften sowie die Methoden add_ und remove_ der Ereignisse in gewöhnliche Methoden umgewandelt. Das verringert die Größe der Metadaten. Zusammen mit der Umbenennung verstärkt es außerdem die Verschleierung, weil sich die ursprüngliche Eigenschaft oder das ursprüngliche Ereignis schwerer rekonstruieren lässt.
Befehlszeile
Um die Entfernung der Metadaten von Eigenschaften und Ereignissen einzuschalten, verwenden Sie beim Ausführen von Babel auf der Befehlszeile die Option --disgregateremoval. Zum Beispiel:
babel.exe myapp.exe --disgregateremovalDieser Befehl schaltet die Optimierung ein, die die Metadaten von Eigenschaften und Ereignissen aus der verschleierten Assembly entfernt.
MSBuild-Aufgabe Babel
Um die Aufteilung von Eigenschaften und Ereignissen mit der MSBuild-Aufgabe Babel einzuschalten, setzen Sie die Eigenschaft <DisgregateRemoval> in einem Element <PropertyGroup> auf true:
<PropertyGroup>
<DisgregateRemoval>true</DisgregateRemoval>
</PropertyGroup>
<Babel DisgregateRemoval="$(DisgregateRemoval)" />XML-Regeln
Außerdem lässt sich die Aufteilung von Eigenschaften und Ereignissen mit XML-Regeln gezielt ein- oder ausschalten. Mit XML-Regeln legen Entwickler das gewünschte Verhalten für bestimmte Muster oder Namespaces fest. Die folgende XML-Regel schaltet die Aufteilung zum Beispiel für den Namespace „Utilities“ aus:
<Rule name="disgregate removal" feature="optimizations" exclude="false">
<Pattern>Utilities.*</Pattern>
<Properties>
<DisgregateRemoval>false</DisgregateRemoval>
</Properties>
</Rule>Mit dieser Regel werden die Eigenschaften und Ereignisse im Namespace „Utilities“ bei der Verschleierung nicht aufgeteilt.
Die Aufteilung von Eigenschaften und Ereignissen hat mehrere Vorteile. Erstens verkleinert sie die Metadatentabellen, sodass die verschleierte Assembly kompakter wird. Zweitens verbessert sie zusammen mit der Umbenennung die Verschleierung der Codebasis insgesamt. Angreifern fällt es dadurch schwerer, die ursprünglichen Eigenschaften und Ereignisse zu verstehen und zu rekonstruieren.
Mit der Aufteilung von Eigenschaften und Ereignissen in Babel Obfuscator erhöhen Entwickler Sicherheit und Schutz ihres Codes, optimieren die Größe der verschleierten Assembly und machen die Codestruktur komplexer. Reverse Engineering wird dadurch schwieriger.