Die nachfolgende Arbeit soll einen Überblick über den aktuellen Stand der Technik zum Thema Decompiling geben. Dazu wird zunächst der Begriff Decompiling gegenüber ähnlichen Begriffen abgegrenzt.
Nach einem Überblick über die Gründe für Decompiling und rechtlichen Aspekten wird der Decompiling-Prozess näher dargestellt und in einzelne Phasen unterteilt. Es wird erklärt welche Vorteile diese Einteilung in einzelne Phasen mit sich bringt.
Zur praktischen Veranschaulichung werden gängige Decompiler-Tools für aktuell relevante Sprachen wie z.B. Java oder .NET vorgestellt. Die Ergebnisse dieser Tools werden mit dem originalen Source Code verglichen um ein Indiz für die Qualität der Tools zu liefern.
Weiters werden vorhandene theoretische Probleme aufgezeigt, die beim Decompiling auftreten können. Ein Überblick über Techniken zum Schutz vor Decompiling rundet diese Arbeit ab.
Inhaltsverzeichnis
1 Einleitung
2 Allgemeines
2.1 Begriffsdefinition Decompiler
2.2 Abgrenzung zu Reverse Engineering / Disassembling
2.3 Gründe für die Verwendung von Decompiling
2.4 Rechtliche Aspekte (Legalität)
3 Der Decompiling Prozess
3.1 Module
3.2 Phasen
4 Probleme beim automatischen Decompiling
4.1 Halteproblem
4.2 Idiome
5 Überblick über ausgewählte Decompiler
5.1 Maschinensprache
5.2 Assembler Code
5.3 Java Bytecode
5.4 .NET assembly, CIL Code
5.5 Skriptsprachen Perl und PHP
5.6 Parallelen und Folgerungen
6 Obfuscation: Schutz vor Decompiling
7 Zusammenfassung
Zielsetzung & Themen
Diese Arbeit bietet einen umfassenden Überblick über den aktuellen Stand der Technik im Bereich des Decompiling. Ziel ist es, den Decompiling-Prozess methodisch zu durchleuchten, die Herausforderungen bei der automatischen Rückgewinnung von Quellcode aus Binärdateien aufzuzeigen und die Eignung verschiedener Programmiersprachen und Plattformen für diesen Prozess zu evaluieren.
- Grundlagen und Abgrenzung des Reverse Engineering
- Struktur und Module des Decompiling-Prozesses
- Theoretische Grenzen: Halteproblem und Idiome
- Analyse der Decompilierbarkeit von Java, .NET, Assembler und Skriptsprachen
- Strategien zur Code-Verschleierung (Obfuscation)
Auszug aus dem Buch
4.1 Halteproblem
Ein grundsätzliches und theoretisch es Problem beim Thema Decompiling ist das sogenannte Halteproblem. Zusammenfassend kann dieses Problem folgendermaßen beschrieben werden:
Der Versuch ein Programm zu schreiben, welches überprüft ob ein bestimmtes Programm mit bestimmten Eingabeparametern terminiert ist nicht immer möglich. Es wird nämlich genau dann ein Widerspruch erzeugt, wenn diesem Programm als Eingabeprogramm und als Eingabeparameter das Programm selbst übergeben wird.
Die von Neumann Architektur, welche in allen Intel 80x86 und Pentium CPUs zum Einsatz kommt, unterscheidet im Maschinencode nicht zwischen Daten und Code. Die Verwendung der jeweiligen Bits ergibt sich aus dem Kontext des Programmablaufs. Da ein Compiler normalerweise gültigen Code erzeugt schafft dies beim Ablauf des Programms keine Probleme, beim Dekompilieren können automatische Analyseprogramme allerdings Schwierigkeiten bei der Zuordnung haben. In manchen Fällen muss der Benutzer des Decompilers also manuell entscheiden, welche Bytes als Code, und welche Bytes als Daten zu verwenden sind.
"...this problem is equivalent to the halting problem, as it is impossible to separate data from instructions in a von Neumann architecture that computes both data addresses and branch destination addresses at execution time. [...] The algorithm is proved to be NP-Complete"
Zusammenfassung der Kapitel
1 Einleitung: Diese Einleitung führt in die Thematik ein und skizziert den Aufbau der Untersuchung sowie die Zielsetzung der Arbeit.
2 Allgemeines: Das Kapitel definiert den Decompiler, grenzt ihn vom Reverse Engineering ab und beleuchtet sowohl die Beweggründe für das Dekompilieren als auch die damit verbundenen rechtlichen Aspekte.
3 Der Decompiling Prozess: Hier werden die Modulstruktur eines Decompilers und die einzelnen Phasen – von der Syntaxanalyse bis zur Code-Erzeugung – detailliert erläutert.
4 Probleme beim automatischen Decompiling: Dieses Kapitel behandelt die theoretischen Hürden, insbesondere das Halteproblem und die Schwierigkeiten bei der Interpretation von Idiomen.
5 Überblick über ausgewählte Decompiler: Eine praktische Analyse, die untersucht, wie gut Code aus verschiedenen Quellarten wie Java, .NET, Maschinensprache oder Skriptsprachen wiederhergestellt werden kann.
6 Obfuscation: Schutz vor Decompiling: Dieses Kapitel widmet sich den Schutzmechanismen, die verhindern sollen, dass Software einfach dekompiliert werden kann.
7 Zusammenfassung: Abschließende Betrachtung der Ergebnisse und ein Ausblick auf zukünftige Entwicklungen im Spannungsfeld zwischen Dekompilierung und Schutzmechanismen.
Schlüsselwörter
Decompiler, Reverse Engineering, Disassembling, Quellcode, Binärcode, Halteproblem, Java Bytecode, .NET, Obfuscation, Programmablauf, Code-Erzeugung, Semantische Analyse, Syntaxanalyse, Software Engineering
Häufig gestellte Fragen
Worum geht es in dieser wissenschaftlichen Arbeit primär?
Die Arbeit befasst sich mit der technischen Analyse von Decompilern, die darauf ausgelegt sind, Binärdateien wieder in lesbaren Quellcode zurückzuführen.
Welche Themenfelder stehen im Zentrum der Analyse?
Im Fokus stehen die methodische Vorgehensweise bei der Dekompilierung, die Problematik der Code-Identifikation (Daten vs. Code) sowie die Analyse-Eignung moderner Programmiersprachen.
Was ist das übergeordnete Ziel der Untersuchung?
Ziel ist es, den Decompiling-Prozess in seine Phasen zu zerlegen und aufzuzeigen, unter welchen Voraussetzungen und bei welchen Sprachen eine erfolgreiche Rekonstruktion des ursprünglichen Codes möglich ist.
Welche wissenschaftliche Methode wird in der Arbeit angewandt?
Die Arbeit nutzt eine strukturierte deskriptive Analyse und vergleicht verschiedene Decompiling-Werkzeuge anhand praktischer Code-Beispiele.
Welche Inhalte bilden den Hauptteil?
Der Hauptteil gliedert sich in die theoretischen Grundlagen des Decompiling-Prozesses, die Darstellung technischer Probleme wie das Halteproblem und die vergleichende Untersuchung verschiedener Compiler-Plattformen.
Durch welche Schlüsselwörter lässt sich die Arbeit am besten charakterisieren?
Die wichtigsten Begriffe sind Reverse Engineering, Decompiler, Maschinencode, Quellcode-Wiederherstellung und Obfuscation.
Warum ist das "Halteproblem" für Decompiler so relevant?
Es stellt eine theoretische Grenze dar, da es unmöglich ist, in einer von Neumann Architektur algorithmisch zweifelsfrei zwischen ausführbarem Maschinencode und Daten zu unterscheiden.
Welche Rolle spielt Obfuscation bei der Softwareentwicklung?
Obfuscation dient dazu, den Quellcode durch Transformationen so zu verschleiern, dass eine Dekompilierung erschwert wird, ohne die Funktionalität des Programms zu beeinträchtigen.
- Quote paper
- C. Pernsteiner (Author), B. Engleder (Author), H. Kreisel (Author), 2008, Decompiler - Der Stand der Technik im Jahr 2008, Munich, GRIN Verlag, https://www.grin.com/document/141455