Reverse Engineering - Einstieg in die Welt des Disassemblierens und Dekompilierens

Reverse Engineering

Einstieg in die Welt des Disassemblierens und Dekompilierens

Ralph Meier
von Ralph Meier
am 02. Dezember 2021
Lesezeit: 7 Minuten

Keypoints

Schwachstellen mit Disassemblieren und Dekompilieren finden

  • Reverse Engineering ist ein wichtiger Bestandteil der Malware Analyse
  • Mit Reverse Engineering fehlende Dokumentation erstellen
  • Disassemblieren und Dekompilieren helfen beim Verstehen von Software, was bei Blackbox Tests sehr nützlich ist
  • Obfuscator-Tools erschweren das Reverse Engineering und können geistiges Eigentum schützen

Reverse Engineering ist eine sehr umfangreiche, mächtige, aber auch kreative Tätigkeit. Im Artikel Reverse Engineering – Erweiterte Sicherheitsüberprüfungen werden die drei verschiedenen Hauptbereiche im Reverse Engineering bereits erläutert. In diesem Artikel liegt der Fokus auf das Disassemblieren und Dekompilieren von Software.

Was ist Reverse Engineering?

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.

Analyse

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.

Interfacing

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.

Security Analyse

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.

Disassemblieren und Dekompilieren

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

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.

Darstellung vom Ablauf der Kompilierung und Disassemblierung

Dekompilieren

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.

Darstellung vom Ablauf der Kompilierung und Dekompilierung mit möglichem Einsatz eines Obfuscator-Tools

Techniken, um Reverse Engineering zu erschweren

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.

Eine Vorstellung von aktuellen Reverse Engineering Tools

Fazit

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.

Über den Autor

Ralph Meier

Ralph Meier hat eine Lehre als Applikationsentwickler, Fokus Webentwicklung mit Java, bei einer Schweizer Grossbank absolviert und danach einen Bachelor of Science ZFH in Informatik an der ZHAW School of Engineering abgeschlossen. Er fokussiert sich auf die sicherheitstechnische Untersuchung von Webapplikationen. (ORCID 0000-0002-3997-8482)

Links

Sie wollen die Resistenz Ihres Unternehmens auf Malware prüfen?

Unsere Spezialisten kontaktieren Sie gern!

×
Dynamische Analyse von Android Apps

Dynamische Analyse von Android Apps

Ralph Meier

Burp Bambdas & BChecks

Burp Bambdas & BChecks

Ralph Meier

Disk Cloning

Disk Cloning

Ralph Meier

Das BIOS

Das BIOS

Ralph Meier

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv