Decompiler – Wikipedia

Ein Dekompilierer (englisch Decompiler oder auch Reverse Compiler, Reverse Engineering Compiler) ist ein Computerprogramm, das aus Maschinen- oder Objektcode für den Menschen wieder lesbaren Quelltext in einer Hochsprache erzeugt. Er versucht, den Vorgang des Kompilierens umzukehren.

Ein Dekompilierer ist nicht zu verwechseln mit einem Disassembler, da die Assemblersprache nur eine alternative Darstellungsform des Maschinencodes ist.

Da es für die Kompilierung meist keine Umkehrfunktion gibt, ist eine Dekompilierung eine Reverse-Engineering-Technik. Sie wird zum erneuten nachträglichen Erzeugen von Quellcode benutzt, der auf einem ausführbaren Programm basiert. Der gewonnene Quellcode hat in gewissen Grenzen Ähnlichkeit mit der Ursprungsfassung des Quellcodes, der zur Erzeugung des ausführbaren Programms benutzt wurde. Wenn in diesem ausführbaren Programm zusätzlich noch Debuginformationen gespeichert sind, dann können oft sogar die vom ursprünglichen Autor verwendeten Variablennamen, Funktionsnamen und Module wieder zurückgewonnen werden. Verlorengegangen sind üblicherweise Kommentare sowie die ursprüngliche Formatierung, da beide Informationen typischerweise nicht mehr im Kompilat enthalten sind.

Die Dekompilierung von Bytecode, wie z. B. Java- und .Net-Framework-Programmen, ist in der Regel unkomplizierter als die Dekompilierung von Maschinencode, da diese Systeme relativ viele Informationen des Originalquellcodes mit in die Objektdatei übernehmen, vergleichbar mit der Debug-Version eines C- oder C++-Programms. Insbesondere die Typinformation und die Namen von öffentlichen Bezeichnern bleiben erhalten. Der dekompilierte Programmcode ist jedoch nur funktional identisch mit der ursprünglichen Quelldatei.

Einschränkungen

[Bearbeiten | Quelltext bearbeiten]

Wurde das Programm mit einer Optimierungsoption des Compilers übersetzt und sind keine Debuginformationen enthalten, oder es wurde gar mit einem Obfuscator verschleiert, dann kann der zurückgewonnene Quelltext in Einzelfällen bis zur Unbenutzbarkeit entstellt sein.

Aufgrund der genannten Einschränkungen eignet sich Dekompilierung normalerweise nicht, um verlorengegangene Quelltexte zu restaurieren. Diese sollten ohnehin immer in vielfachen Sicherungen vorhanden sein. Unter normalen Umständen wird ein Programmierer selten einen Decompiler einsetzen. Bei sehr alter Software kommt es jedoch hin und wieder vor, dass die Ursprungsquellen verloren wurden oder sich auf Datenträgern befinden, für die keine passenden Lesegeräte mehr verfügbar sind. In den Anfangszeiten der elektronischen Datenverarbeitung war es außerdem üblich, kleine Fehler durch patchen der Objektdateien zu beheben. Diese Fälle sind neben dem Rückentwickeln fremder Software die einzigen Anwendungsfälle, für die Decompiler zum Einsatz kommen.

Kommerzielle Softwareanbieter weisen in ihren Lizenzen oft darauf hin, dass das Dekompilieren ihrer Produkte verboten sei (sei es auch nur zu Studienzwecken oder um die Software für den Eigengebrauch zu verändern).

Allerdings ist es im Recht Deutschlands nach § 69e UrhG unter bestimmten Bedingungen erlaubt, ein Programm zu dekompilieren, soweit dies notwendig ist, um die „Interoperabilität“ mit einem unabhängig vom ursprünglichen Programm geschaffenen Computerprogramm zu erhalten. Lizenzvereinbarungen, die dem widersprechen, sind nichtig.

  • http://www.program-transformation.org/Transform/DeCompilation - Das DeCompilation Wiki diskutiert verschiedene Aspekte der Dekompilierung: Geschichte, Forschung, Mustersuche, die generelle Herangehensweise, Java-Decompiler (und warum diese so viel besser als Binary-Decompiler funktionieren) usw.
  • Nicolas Harrand, César Soto-Valero, Martin Monperrus, Benoit, Baudry: The Strengths and Behavioral Quirks of Java Bytecode Decompilers. In: IEEE (Hrsg.): 19th IEEE International Working Conference on Source Code Analysis and Manipulation. 2019, ISBN 978-1-72814-938-7, doi:10.1109/SCAM.2019.00019 (englisch, researchgate.net [PDF; abgerufen am 18. November 2020]).