Disassembler
Ein Disassembler ist ein Computerprogramm, das die binär kodierte Maschinensprache eines ausführbaren Programmes in eine für Menschen lesbarere Assemblersprache umwandelt. Seine Funktionalität ist der eines Assemblers entgegengesetzt.
Funktionsweise
[Bearbeiten | Quelltext bearbeiten]Zu jedem Prozessorbefehl existiert ein entsprechender Befehl in Assemblersprache, ein Mnemonic. Auch die einzelnen Argumente der Prozessorbefehle, wie Registernummern oder Speicheradressen, lassen sich eins zu eins in Assemblercode übertragen. Ein Disassembler übersetzt also die binären Repräsentationen der Prozessorbefehle zurück in für Menschen lesbare Assemblersprache.
Bei einem Programm, das in Assembler geschrieben wurde, lässt sich der ursprüngliche Code im Allgemeinen nachträglich nicht im Originaltext wiederherstellen, sondern lediglich funktional gleich. Pseudobefehle, Labels und Kommentare sind vom Programmierer gewählt und haben daher zumindest keine direkte, d. h. eindeutig umkehrbare Entsprechung im Maschinencode, was die exakte textliche Rekonstruktion unmöglich macht. Bei einem Programm, das in einer höheren Programmiersprache geschrieben wurde, hat der Compiler meist verschiedene Optimierungen vorgenommen, welche die Programmausführung beschleunigen, aber den Maschinencode komplexer machen.
Ein Disassemblat ist damit in der Regel deutlich schlechter lesbar als der ursprüngliche Assemblercode. Auch aus diesem Grund ist es bei komplexeren Programmabschnitten sinnvoll und üblich, die Disassemblierung nicht in einem einzigen Durchgang vollautomatisch vorzunehmen, sondern in Wiederholungen mit manuellen Zwischenschritten. Hierbei können aus schrittweiser Erfahrung und Erkenntnis zunehmend Bezeichner für Sprungmarken, Unterprogramme, Variablen, Konstanten sowie Kommentare manuell verfeinert und zur Optimierung in nachfolgenden Durchläufen vorgegeben werden.
Nutzen
[Bearbeiten | Quelltext bearbeiten]Der Zweck eines Disassemblers liegt meistens darin, die Diagnose und das Auffinden von potenziellen Fehlern in einem Programm zu erleichtern oder die Ausgabe eines Compilers zu überprüfen. Oft wird er auch zum Reverse Engineering benutzt.
Disassembler
[Bearbeiten | Quelltext bearbeiten]Eine Liste von Programmen, die verschiedene Modelle und Dateiformate verarbeiten können. Zum Teil auf GitHub einsehbar.
- Ghidra (plattformunabhängig)
- IDA Pro
- JEB decompiler
- radare2
- Binary Ninja
Rechtliche Aspekte
[Bearbeiten | Quelltext bearbeiten]Proprietäre Software steht oft unter einer EULA, die das Disassemblieren sowie Dekompilieren untersagt. Dies ist jedoch in Deutschland nur in seltenen Fällen rechtlich bindend. Auch ist Reverse Engineering zur Herstellung von Kompatibilität mit der Software Dritter ausdrücklich gesetzlich gesichert erlaubt – und damit nicht durch einen Lizenzvertrag zu unterbinden.[1]
Die Tätigkeit des Disassemblierens ist bei urheberrechtlich geschützten Programmen allerdings in einigen Ländern durch gesetzliche Bestimmungen reglementiert, da das Disassemblieren die Möglichkeit eröffnet, den Code zu ändern und danach wieder in ein Programm zu assemblieren. So könnte z. B. von erfahrenen Assembler-Programmierern und Crackern eine Passwortabfrage entfernt, eine aus lizenzrechtlichen Gründen abgeschaltete Funktion aktiviert, oder ein Virus unbemerkt in das Programm eingeschleust werden. Ausführliche Erläuterungen zu diesem Aspekt von Disassemblern und vergleichbaren Werkzeugen finden sich im Artikel Reverse Engineering.
Sonstiges
[Bearbeiten | Quelltext bearbeiten]Nahezu alle Debugger, einige Programme zur Inspektion von Binärdateien (wie „objdump“ aus den GNU Binutils) sowie manche Assembler beinhalten einen Disassembler. Ein bekannter und häufig eingesetzter Disassembler ist IDA von Ilfak Guilfanov, der Assemblercode strukturiert anzeigen kann.
Der Vorgang des Disassemblierens wird in der deutschsprachigen Fachliteratur synonym mit den Begriffen „entassemblieren“ oder nicht ganz korrekt mit „entkompilieren“ bezeichnet. Letzteres würde korrekterweise das Dekompilieren meinen.