WikiDer > Disassembler

Disassembler

EIN Disassembler ist ein Programm, das Computerprogramme übersetzt aus dem binärMaschinensprache für die Programmierer besser lesbar Montagecode. Es ist die 'umgekehrte' Operation von dem, was a Monteur und links zusammen zu tun. Die Reversion ist vollständig, aber schwer zu lesen. Beim Zusammenstellen oder Kompilieren Kommentare, symbolische Adressen und aussagekräftige Kennungen nämlich verworfen und der Disassembler kann sie nicht wiederherstellen.Außerdem ist es für den Disassembler oft schwierig zu sehen, welche Anweisungensind und welche nicht.

Ähnlich einem Disassembler ist a Discompiler oder Dekompilierer dass die Montagecode oder Maschinensprache versucht, höher ins Original zurückzuübersetzen Programmiersprache.

Das Disassemblieren und/oder Dekompilieren ist ein wesentlicher Bestandteil von Reverse Engineering von Software. Ein Beispiel für einen kommerziellen Disassembler ist Interaktiver Disassembler (IDA Pro), ein Beispiel für eine nicht-kommerzielle is Ollydbg.

Methode

Normalerweise ist bekannt, wo die Implementierung von a Computer Programm beginnt: zum Beispiel auf Adresse 0. Es gibt also eine ausführbare Datei Anweisung.Diese Anweisung kann zerlegt werden, und dann ist bekannt, wie lang die Anweisung ist und wo die nächste Anweisung beginnt.

Ein einfacher Disassembler verarbeitet auf diese Weise das gesamte Programm. Das Programm enthält jedoch nicht nur ausführbaren Code, sondern auch Daten (Daten). Die Daten werden manchmal vom Disassembler nicht erkannt und gelten daher auch als ausführbare Anweisungen. Ein erfahrener Programmierer kann die . meist erkennen Daten sofort und verbessern das Ergebnis manuell.Wenn nach den Daten ausführbarer Code auftaucht, liegt oft ein Synchronisationsproblem vor: Der Disassembler landet irgendwo in der Mitte einer Anweisung und sieht daher eine ganz andere Anweisung, als sie hätte sein sollen. Nach einigen Anweisungen wird die Synchronisation normalerweise wiederhergestellt.

Ein besserer Disassembler bestimmt selbst, welche Programmteile ausführbar sind Nach einer unbedingten Sprunganweisung gehen wir zunächst davon aus, dass kein ausführbarer Code vorliegt. Der Zweck der jump-Anweisung ist jedoch ausführbar, schließlich finden wir möglicherweise eine jump-Anweisung, die auf die Daten verweist, die ursprünglich als nicht ausführbar galten.

Werkzeuge

Wenn das zerlegte Programm Funktionen in anderen aufruft Bibliotheken, und wenn die Namen dieser Funktionen sichtbar sind, können diese Funktionsaufrufe verwendet werden, um die Parameter im Datenteil des aufrufenden Programms zu finden. Dies wiederum kann einen Einblick in die im Programm verwendete Logik geben, wenn weitere Verweise auf die neu entdeckten Parameter nachgeschlagen werden.

Probleme

Ein Computerprogramm kann jedoch kompliziert sein, es ist sogar möglich, dass der Programmierer Dinge eingebaut hat, die die Demontage erschweren.

Mögliche Probleme sind:

  • Nach einem Aufruf einer Unterroutine kommt normalerweise ausführbarer Code. Es ist aber auch möglich, dass dem Aufruf weitere Daten folgen, zB Parameter für das Unterprogramm. Das Unterprogramm muss diese Daten lesen und die Rückkehradresse anpassen. Dies ist für einen Disassembler schwer zu erkennen.
  • Auf einen bedingten Sprung folgt normalerweise ausführbarer Code. Es ist jedoch möglich, dass der Sprung nicht wirklich bedingt ist, da die Bedingung in der Praxis immer erfüllt ist.
  • Das Programm kann sich selbst ändern (selbstmodifizierender Code). Dies ist keine gute Programmierpraxis, aber manchmal unvermeidlich.
  • Ein Wert wird in ein Register geladen und dieser Wert wird später als Sprungadresse betrachtet. Es kann dann schwierig sein zu bestimmen, welcher Wert sich in diesem Register befand. Noch schwieriger wird es, wenn dieser Wert (was oft der Fall sein wird) dynamisch bestimmt wird.

Letztendlich stellt sich heraus, dass die Arbeit eines Disassemblers (eines Computerprogramms) nicht ausreicht und die Hilfe eines erfahrenen Programmierers benötigt wird. Dadurch ist die Demontage letztlich eine sehr mühsame Aufgabe.

Zusammenbauen

Nach der Demontage kann das Ergebnis mit a . überprüft werden Monteur wieder zusammengesetzt und das Ergebnis kann dann schnell mit dem Originalprogramm verglichen werden, sie sollten identisch sein.

Es ist jedoch keineswegs ausgeschlossen, dass das Programm nach dem Zerlegen und Zusammenbauen anders ist. Einige Befehle (wie MOV AX,BX auf dem i86) können auf zwei Arten zusammengebaut werden - funktional identisch. Es ist auch möglich, dass der Assembler eine kurze Sprunganweisung ausführt, während das ursprüngliche Programm eine lange Sprunganweisung hatte Diese Unterschiede können dazu führen, dass sich Adressen ändern und das Programm nicht mehr funktioniert.

Im Allgemeinen möchte man nach der Disassemblierung Änderungen am Programm vornehmen.Das Verschieben von Code, das Ändern von Sprungadressen kann zu überraschenden und unerwünschten Ergebnissen führen, wenn der Programmierer einige Dinge falsch verstanden hat.

Externe Links