Manual DeObfuscation
Manuelle Deobfuskationstechniken
Im Bereich der Software-Sicherheit ist der Prozess, obfuskierten Code verständlich zu machen, bekannt als Deobfuskation, entscheidend. Dieser Leitfaden behandelt verschiedene Strategien zur Deobfuskation, wobei der Schwerpunkt auf statischen Analysetechniken und der Erkennung von Obfuskationsmustern liegt. Darüber hinaus wird eine Übung zur praktischen Anwendung vorgestellt und weitere Ressourcen für Interessierte an fortgeschritteneren Themen vorgeschlagen.
Strategien für statische Deobfuskation
Beim Umgang mit obfuskiertem Code können je nach Art der Obfuskation mehrere Strategien angewendet werden:
DEX-Bytecode (Java): Ein effektiver Ansatz besteht darin, die Deobfuskationsmethoden der Anwendung zu identifizieren und diese Methoden dann in einer Java-Datei zu replizieren. Diese Datei wird ausgeführt, um die Obfuskation der Ziel-Elemente rückgängig zu machen.
Java und nativer Code: Eine weitere Methode besteht darin, den Deobfuskationsalgorithmus in eine Skriptsprache wie Python zu übersetzen. Diese Strategie hebt hervor, dass das Hauptziel nicht darin besteht, den Algorithmus vollständig zu verstehen, sondern ihn effektiv auszuführen.
Erkennung von Obfuskation
Die Erkennung von obfuskiertem Code ist der erste Schritt im Deobfuskationsprozess. Wichtige Indikatoren sind:
Das Fehlen oder die Verwirrung von Strings in Java und Android, was auf String-Obfuskation hindeuten kann.
Die Präsenz von Binärdateien im Assets-Verzeichnis oder Aufrufe an
DexClassLoader
, die auf das Entpacken von Code und dynamisches Laden hinweisen.Die Verwendung von nativen Bibliotheken zusammen mit nicht identifizierbaren JNI-Funktionen, was auf eine potenzielle Obfuskation von nativen Methoden hinweist.
Dynamische Analyse in der Deobfuskation
Durch die Ausführung des Codes in einer kontrollierten Umgebung ermöglicht die dynamische Analyse die Beobachtung, wie sich der obfuskierten Code in Echtzeit verhält. Diese Methode ist besonders effektiv, um die inneren Abläufe komplexer Obfuskationsmuster aufzudecken, die darauf ausgelegt sind, die wahre Absicht des Codes zu verbergen.
Anwendungen der dynamischen Analyse
Laufzeit-Dekodierung: Viele Obfuskationstechniken beinhalten die Verschlüsselung von Strings oder Code-Segmenten, die nur zur Laufzeit entschlüsselt werden. Durch dynamische Analyse können diese verschlüsselten Elemente zum Zeitpunkt der Entschlüsselung erfasst werden, wodurch ihre wahre Form sichtbar wird.
Identifizierung von Obfuskationstechniken: Durch die Überwachung des Verhaltens der Anwendung kann die dynamische Analyse helfen, spezifische Obfuskationstechniken zu identifizieren, die verwendet werden, wie z.B. Code-Virtualisierung, Packager oder dynamische Code-Generierung.
Aufdeckung versteckter Funktionalitäten: Obfuskierter Code kann versteckte Funktionalitäten enthalten, die durch statische Analyse allein nicht offensichtlich sind. Die dynamische Analyse ermöglicht die Beobachtung aller Code-Pfade, einschließlich der bedingt ausgeführten, um solche versteckten Funktionalitäten aufzudecken.
Referenzen und weiterführende Literatur
BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” [Video]
Dieser Vortrag behandelt das Reverse Engineering einer der komplexesten Anti-Analyse-nativen Bibliotheken, die ich in einer Android-Anwendung gesehen habe. Es behandelt hauptsächlich Obfuskationstechniken im nativen Code.
REcon 2019: “The Path to the Payload: Android Edition” [Video]
Dieser Vortrag diskutiert eine Reihe von Obfuskationstechniken, die ausschließlich im Java-Code verwendet wurden, um das Verhalten eines Android-Botnets zu verbergen.
Last updated