Chained State Ultimate
Chained State (chain) ist die stärkste Kontrollflusstransformation in Babel Obfuscator. Wie der Algorithmus switch flacht sie eine Methode ab: Sie baut die Methode um einen Dispatcher herum neu auf, sodass ihre Blöcke nicht mehr in der Reihenfolge des Quellcodes ausgeführt werden. Sie wurde aber eigens dafür entwickelt, den automatisierten Tools zu widerstehen, die eine gewöhnliche Abflachung rückgängig machen können.
Warum Chained State
Die gewöhnliche Abflachung mit switch ist gegen einen menschlichen Leser wirksam, aber eine bekannte Klasse automatisierter Deobfuskatoren kann die ursprüngliche Methode oft rekonstruieren: Sie analysieren den Dispatcher statisch, ermitteln die Reihenfolge, in der die Blöcke ausgeführt werden sollten, und schreiben die Methode in eine Form zurück, die dem Quellcode nahekommt. Gegen diese Tools lässt sich eine einfache Abflachung in einem einzigen automatisierten Durchgang rückgängig machen.
Chained State schließt diese Lücke. Der Dispatcher ist so gebaut, dass sich die ursprüngliche Reihenfolge nicht allein durch statische Analyse ermitteln lässt: Ein Angreifer muss die Methode tatsächlich ausführen, um ihrem Ablauf zu folgen. In internen Tests gegen einen verbreiteten automatisierten Kontrollfluss-Deobfuskator wurde mit switch abgeflachter Code wieder zur ursprünglichen Methode zusammengesetzt, während derselbe Code, mit chain abgeflacht, unangetastet blieb. Das Ergebnis ist eine abgeflachte Methode, die sowohl dem manuellen Lesen als auch der automatisierten Wiederherstellung widersteht.
Chained State härtet die Abflachung und ersetzt sie nicht. Sie können den Algorithmus allein oder zusammen mit den anderen Kontrollflussalgorithmen einschalten.
Kompatibilität
Chained State erzeugt nur gewöhnlichen, verifizierbaren IL-Code und fügt weder Hilfstypen noch Reflexion noch Laufzeitabhängigkeiten hinzu. Deshalb läuft der Code unverändert auf der gesamten Bandbreite von .NET:
- .NET Framework 4.x bis .NET 10, .NET Core und Mono / Xamarin.
- Getrimmte Anwendungen (ILLink) und NativeAOT-Anwendungen: Es gibt keinen dynamischen Code, der bei der AOT-Kompilierung versagen könnte.
- .NET MAUI, einschließlich Android und iOS.
Weil die Transformation im Rahmen des verifizierbaren IL-Codes bleibt, zwingt sie die Assembly nicht in einen 32-Bit-Prozess und lässt sich gefahrlos mit dem Rest Ihrer Verschleierungskonfiguration kombinieren.
Leistung
Chained State verursacht die gleiche Art von Laufzeitkosten wie die Abflachung mit switch, denn eine abgeflachte Methode führt bei jedem Aufruf einen Dispatcher aus. In der Praxis weicht der Mehraufwand pro Aufruf nur um wenige Prozent vom gewöhnlichen switch ab. Behalten Sie den Algorithmus wie jede Abflachung den Methoden vor, die tatsächlich Ihr geistiges Eigentum schützen, und halten Sie ihn von häufig durchlaufenen, leistungskritischen Pfaden fern. Den vollständigen Vergleich und die Begrenzung über Regeln finden Sie unter Leistung und Tuning.
Chained State einschalten
Befehlszeile
babel myapp.exe --controlflow chain=onSie können den Algorithmus mit den anderen Algorithmen kombinieren, zum Beispiel:
babel myapp.exe --controlflow switch=on --controlflow case=on --controlflow chain=onMSBuild-Aufgabe Babel
<PropertyGroup>
<ControlFlowObfuscation>chain=true;true</ControlFlowObfuscation>
</PropertyGroup>
<Babel ControlFlowObfuscation="$(ControlFlowObfuscation)" />Babel Desktop
Schalten Sie in der Gruppe Kontrollfluss des Eigenschaftenbereichs die Kontrollflussverschleierung (ControlFlowObfuscation) ein und wählen Sie unter den Algorithmen chain aus.
Chained State ist ab der Ultimate-Edition verfügbar (sowie in Server und Data Center). Mit der Enterprise-Edition wendet die Engine den Algorithmus chain nicht an.