Codeoptimierungen
Codeoptimierungen sind eine Reihe von Techniken, mit denen Babel Obfuscator während der Verschleierung Effizienz und Leistung des Codes verbessert. Sie verfeinern den erzeugten Code, damit er schneller läuft und nach dem Dekompilieren schwerer zu verstehen ist. Dieser Abschnitt stellt die Codeoptimierungen von Babel vor und zeigt, wie sie sich auf die Lesbarkeit des Codes und die Ausführungsgeschwindigkeit auswirken.
Inline-Erweiterung
Die Inline-Erweiterung ist eine Optimierungstechnik, mit der Babel Obfuscator Methodenaufrufe durch die Anweisungen ersetzt, die der Methodenrumpf enthält. Damit entfällt der Aufwand des Funktionsaufrufs, und die Leistung steigt.
Um die Inline-Erweiterung einzuschalten, müssen Sie die Methoden angeben, die inline erweitert werden sollen. Dafür gibt es zwei Wege.
Erstens können Sie das Attribut System.Reflection.ObfuscationAttribute direkt auf die Methode anwenden, die inline erweitert werden soll. Das Attribut muss den Parameter Feature = "inline" enthalten. Er gibt an, dass die Methode inline erweitert wird.
[Obfuscation(Feature = "inline", Exclude = false)]
public void Info(string message)
{
// Method body
}Am Attributparameter Feature = "inline" erkennt Babel, dass die Methode bei der Verschleierung inline erweitert werden soll.
Zweitens können Sie in Ihrer Konfigurationsdatei eine Verschleierungsregel definieren, die die Methode oder den Typ enthält, die inline erweitert werden sollen:
<Rule name="inline1" feature="optimizations" exclude="false">
<Pattern>AcmeDataMining.Logger::Info(String) : Void</Pattern>
<Properties>
<Inline>True</Inline>
</Properties>
</Rule>In diesem Beispiel legt die Regel fest, dass die Methode Info des Typs AcmeDataMining.Logger inline erweitert wird, wie die Eigenschaft <Inline>True</Inline> angibt.
Um die Inline-Erweiterung dann auszulösen, schalten Sie InlineExpansion in der Gruppe „Optimierung“ von Babel Desktop ein oder verwenden Sie den Schalter --inlineexpansion, wenn Sie Babel über die Befehlszeile ausführen:
babel myapp.exe --inlineexpansionMSBuild-Aufgabe Babel
Um die Inline-Erweiterung in Babel Obfuscator mit der MSBuild-Aufgabe Babel einzuschalten, setzen Sie die Eigenschaft <InlineExpansion> im Abschnitt <PropertyGroup> Ihrer MSBuild-Projektdatei.
Das folgende Beispiel schaltet die Inline-Erweiterung mit der Eigenschaft <InlineExpansion> ein:
<PropertyGroup>
<InlineExpansion>true</InlineExpansion>
</PropertyGroup>
<Babel InlineExpansion="$(InlineExpansion)" />Im Codeausschnitt oben definiert das Element <PropertyGroup> die Eigenschaft <InlineExpansion> und setzt ihren Wert auf true. Damit ist die Inline-Erweiterung für die Verschleierung eingeschaltet.
In den Statistiken der Optimierung sehen Sie die Anzahl der inline erweiterten Methoden und die Anzahl der Erweiterungen, die in der Optimierungsphase stattgefunden haben.
Optimization phase, elapsed time 00.270s
Inlined methods (expanded): 266 (736)Ist die Inline-Erweiterung eingeschaltet, erkennt Babel Obfuscator die markierten Methoden und ersetzt ihre Aufrufe durch die Anweisungen, die ihre Rümpfe enthalten. Diese Optimierung beseitigt den Aufwand des Methodenaufrufs. Das verbessert die Leistung und kann den Code verkleinern.
Entfernung von Konstantenfeldern
Babel Obfuscator verwendet eine Codeoptimierung, die Entfernung von Konstantenfeldern (Const Fields Removal). Dabei werden Referenzen auf Deklarationen von Konstantenfeldern direkt durch die entsprechenden Werte ersetzt. So verschwinden die Konstantenfelder aus dem Code, und mit ihnen alle Informationen, die Einzelheiten über den zugrunde liegenden Algorithmus oder die Logik verraten könnten.
Das Ersetzen der Referenzen auf Konstantenfelder durch ihre Werte dient vor allem zwei Zwecken. Erstens verkleinert es den Code, weil keine ausdrücklichen Felddeklarationen mehr nötig sind. Das wiederum verbessert Effizienz und Leistung der verschleierten Anwendung insgesamt.
Zweitens, und das ist wichtiger, schützt die Entfernung von Konstantenfeldern den Code vor Reverse Engineering. Indem Babel die Referenzen durch die tatsächlichen Werte ersetzt, beseitigt es jede Spur der ursprünglichen Feldnamen. Angreifern fällt es dadurch schwerer, die Logik zu durchschauen oder Rückschlüsse auf die Funktionsweise der Anwendung zu ziehen.
Befehlszeile
Um die Entfernung von Konstantenfeldern auf der Befehlszeile (CLI) von Babel Obfuscator einzuschalten, verwenden Sie den Schalter --constremoval. Mit diesem Schalter im Befehl führt Babel die Optimierung aus und entfernt die Konstantenfelder aus dem Code.
Das folgende Beispiel schaltet die Entfernung von Konstantenfeldern über die CLI ein:
babel myapp.exe --constremovalMSBuild-Aufgabe Babel
Um die Entfernung von Konstantenfeldern in Babel Obfuscator mit MSBuild einzuschalten, verwenden Sie die Eigenschaft <ConstRemoval>. Mit dem Wert true weisen Sie Babel an, die Optimierung auszuführen und die Konstantenfelder bei der Verschleierung aus dem Code zu entfernen.
Das folgende Beispiel schaltet die Entfernung von Konstantenfeldern in MSBuild ein:
<PropertyGroup>
<ConstRemoval>true</ConstRemoval>
</PropertyGroup>
<Babel ConstRemoval="$(ConstRemoval)" />Im Codeausschnitt oben definiert das Element <PropertyGroup> die Eigenschaft <ConstRemoval> und setzt ihren Wert auf true. Damit ist die Entfernung von Konstantenfeldern eingeschaltet. Anschließend wird die Aufgabe <Babel> aufgerufen und erhält die Eigenschaft ConstRemoval als Argument, sodass Babel die Konstantenfelder entfernt.
XML-Regeln
Um die Entfernung von Konstantenfeldern in Babel Obfuscator mit XML-Regeln zu konfigurieren, geben Sie die Eigenschaft <ConstRemoval> im Element <Rule> und in dessen Unterelement <Properties> an. So schalten Sie die Entfernung von Konstantenfeldern für bestimmte Typen oder Member Ihrer Codebasis gezielt ein oder aus.
Das folgende Beispiel zeigt eine XML-Konfiguration für die Entfernung von Konstanten:
<Rule name="const removal" feature="optimizations" exclude="false">
<Pattern>Utilities.*</Pattern>
<Properties>
<ConstRemoval>false</ConstRemoval>
</Properties>
</Rule>Das Attribut exclude hat den Wert false. Die Regel wird also auf die Member angewendet, die der Ausdruck des Musters erfasst.
Im Element <Properties> ist die Eigenschaft <ConstRemoval> auf true gesetzt. Die Entfernung von Konstantenfeldern ist damit für die Typen oder Member ausgeschaltet, die das Muster erfasst.
Mit XML-Regeln steuern Sie die Entfernung von Konstantenfeldern in Babel Obfuscator im Detail. Sie können für verschiedene Teile Ihrer Codebasis unterschiedliche Regeln angeben und die Verschleierung so an Ihre Anforderungen und an den gewünschten Grad der Optimierung anpassen.