Dynamische Analyse von Android Apps
Ralph Meier
Schwachstellen mit Disassemblieren und Dekompilieren finden
Reverse Engineering ist der umgekehrte Vorgang zur normalen Entwicklung eines Produkts, sprich der Prozess beginnt mit einem fertigen Produkt und man baut es in seine Einzelteile zurück. Dabei muss das Produkt nicht zwingend vollendet sein. Reverse Engineering ist nicht nur auf Software beschränkt, sondern auch im Hardwarebereich anwendbar.
Beim Auseinandernehmen eines fertigen Produkts kommt schnell der Gedanke an Kopieren beziehungsweise Imitieren eines Produkts auf. Dies ist sicher ein valider Punkt, es gibt aber eine Vielzahl weiterer Gründe für den Einsatz von Reverse Engineering.
Das Analysieren eines eigenen Produktes macht zum Beispiel Sinn, wenn viele Knowhow-Träger das Unternehmen verlassen haben und die vorhandene Dokumentation unvollständig ist. Daher will man mit Hilfe von Reverse Engineering verlorengegangenes Wissen wieder gewinnen und sogenanntes Redocumentation und Design Recovery betreiben.
Im Hardware-Bereich können durch die Hilfe von Reverse Engineering Alternativen zu verbauten Chips in älteren Produkten oder Designs gefunden werden, um der derzeitigen Chip Knappheit ein wenig auszuweichen. Damit lässt sich teilweise auch Obsoleszenz vorbeugen, wenn ein Chiphersteller pleiteging oder benötigte Bauteile nicht mehr produziert werden.
Mit Interfacing ist gemeint, durch den Einsatz von Reverse Engineering Kompatibilität zu fremden Systemen aufzubauen. Dabei findet man heraus, wie das Drittsystem funktioniert und wie es am besten angesprochen wird. Daraus lässt sich mit genügend Erkenntnis eine Schnittstelle zwischen dem eigenen und dem Dritt-System erstellen.
In der Security Analyse werden Software und Hardware auseinandergenommen, um mögliche Angriffspunkte und Schwachstellen zu ermitteln. Diese werden dann den Hersteller gemeldet, um zukünftiges Ausnutzen davon zu vermeiden. Bei Blackbox Tests wird oft Reverse Engineering verwendet, um das Verständnis des Testobjekts erweitern zu können.
Reverse Engineering wird zudem beim Analysieren von Malware eingesetzt. Unter anderem um herauszufinden, wie der Schlüssel einer Ransomware erstellt wird, um verschlüsselte Daten so schnell wie möglich wiederherstellen zu können. Oder auch um herauszufinden, welches Hacker Kollektiv hinter einem Angriff steckt.
Beim Rückübersetzen von Software oder generell kompilierten Programmiercode gibt es zwei verschiedene Arten. Zum einen Disassemblieren, wobei Code in Maschinensprache in von Menschen lesbaren Assembly-Code umgewandelt wird. Zum anderen Dekompilieren, hier gelingt die Rückumwandlung von Bytecode in die ursprüngliche Programmiersprache.
Disassemblieren wird bei Softwareartefakten eingesetzt, welche in Form von binärer oder hexadezimalen Maschinensprache vorliegen. Diese entsteht durch die Kompilierung von Hochsprachen wie C oder C++. Beim Kompilierungsprozess werden viele Optimierungsmassnahmen vom eingesetzten Compiler für die Zielplattform durchgeführt. Das daraus resultierende Programm wird dadurch schneller, jedoch gehen Metainformationen vom ursprünglichen Programmiercode, wie zum Beispiel Bezeichnungen von Variablen und Funktionen, verloren. Deshalb ist eine Rückumwandlung in die ursprüngliche Programmiersprache nicht möglich, stattdessen kann Maschinencode in Assembly umgewandelt werden. Somit können die einzelnen Operationen und Speicherzugriffe nachvollzogen werden. Für das Disassemblieren werden professionelle Tools eingesetzt, welche den Pfad der Ausführung nachvollziehen und Sprünge innerhalb des Codes in verständlicher Form darstellen können.
Bei interpretierten Programmiersprachen wie Java oder C# wird der Programmcode nicht in Maschinencode, sondern in Bytecode kompiliert. Der Bytecode wiederum wird zur Laufzeit von einer virtuellen Maschine, zum Beispiel der Java Virtual Machine, interpretiert und auf dem Zielsystem ausgeführt. Der Bytecode ist teilweise bereits optimiert, enthält aber noch Metainformationen, was die Rückumwandlung in die ursprüngliche Programmiersprache ermöglicht. Je nachdem wie die Kompilierung erfolgte, kann der Bytecode vollständig zurückübersetzt werden.
Das Ergebnis von Disassemblieren oder Dekompilieren wird hauptsächlich durch die Konfiguration des Compilers sowie weiteren Tools, wie der Einsatz eines Obfuscator-Tools, beeinflusst. Obfuscator-Tools setzen unterschiedlichste Techniken ein, um Reverse Engineering zu erschweren. Es gibt sie für sämtliche Programmiersprachen und viele sind als Open Source zum Beispiel auf Github zu finden. Ein Obfuscator-Tool wird vor dem Kompilieren auf den Programmiercode angewendet. Sie setzten unter anderem auf das Umbenennen von Variablen- und Methodennamen zu zufällig generierten Zeichenabfolgen, bauen zusätzliche Iterationen, Verschachtelungen und Abfragen mit ein. Teilweise werden eingesetzte Variableninhalte verschlüsselt abgelegt und gängige Programmierentwurfsmuster in komplexe unverständliche Abfolgen umgebaut, um Decompilers zu verwirren und so ein inkorrektes Ergebnis zu erzeugen. Code und Metainformationen, welche nicht zum Kompilieren benötigt werden, werden entfernt, um zukünftigen Angreifern so wenig Informationen wie möglich zu überlassen. Die Aufzählung der Techniken ist bei weitem nicht vollständig, oft werden auch eigene Kreationen oder Variationen zur Verschleierung des Quellcodes eingesetzt.
Ein Obfuscator-Tool wird eingesetzt, wenn Entwickler den Zugang zum Quellcode des eigenen Produkts, ihr geistiges Eigentum, verunmöglichen oder erschweren wollen. Bei der Entwicklung von Malware werden oft Obfuscator-Tools verwendet, verschiedene Zeichencodierungen und auch Verschlüsselung auf den Quellcode angewendet, um den Fähigkeitslevel der Malware Analysten und den Zeitaufwand der Analyse zu erhöhen. Zudem kommen oftmals noch Anti-Debugging Techniken zum Einsatz, welche in diesem Artikel jedoch nicht weiter beleuchtet werden.
Durch den Einsatz oben beschriebener Verschleierungstechniken, verhindern die Entwickler von Schadsoftware ebenfalls die Erkennung ihrer Malware durch automatische Analysen von Anti-Virenlösungen.
Reverse Engineering ist eine der wichtigsten Techniken in der Analyse von Malware und allgemein eine sehr hilfreiche Tätigkeit beim Entdecken von Schwachstellen in unterschiedlichen Produkten. Zudem ist Reverse Engineering auch in anderen unterschiedlichen Bereichen wertvoll und sollte daher nicht in Vergessenheit geraten. Disassemblieren und Dekompilieren können hilfreich sein bei Blackbox Tests von Software, um weiterführende Informationen und mögliche Angriffspunkte identifizieren zu können. Obfuscator-Tools erschweren das Reverse Engineering und es gibt sie beinahe wie Sand am Meer.
Unsere Spezialisten kontaktieren Sie gern!
Ralph Meier
Ralph Meier
Ralph Meier
Ralph Meier
Unsere Spezialisten kontaktieren Sie gern!