Wie unterscheidet ein Disassembler zwischen Opcode und Nutzdaten?
-
Und woran erkennt er bei Programmcode für eine 32 Bit Maschine einen 64 Bit großen Datentyp?
Meine Laienhafte vermutung ist, daß zu jedem Opcode Befehl z.b. mov
es eine bestimmte feste Anzahl an Parametern gibt, so daß das anhand der
Anzahl der Parameter klar ist, was Nutzdaten sind und wo der nächste Opcodebefehl weitergeht?Richtig? Wenn nein, kann mir das mal jemand anhand eines Beispiels erklären?
-
Kann er nicht mit Sicherheit sagen.
Viele Disasembler folgen zB. irgendwie dem Programmverlauf, um festzustellen, welche Daten ausgefuehrt werden, und welche nicht.
Andere gehen einfach stur durch und packen bei Unstimmigkeiten eben Daten hin.OpCodes haben immer eine feste Groesse/Parameteranzahl. Das hat aber nichts mit der Unterscheidung von Daten/Code zu tun.
Die OpCodes enthalten natuerlich Groessenangaben ueber angesprochene Daten - in gewissem Rahmen auch Informationen zum Typ (integer/fp kann man zB. leicht unterscheiden). Das waere ein Ansatzpunkt fuer Disassembler. Ansonsten kann der Disassembler wie gesagt auch Datentypen/Groesse nicht unterscheiden.
-
Hm, aber wenn ein Disassembler eine EXE Datei von vorne durchgeht, dann weiß er doch anhand der Paramaterzahl und des Datentyps, welche Bytes nach dem Opcode zu den Nutzdaten gehören.
Und das, was nach den Nutzdaten kommt ist dann wieder der nächste Opcode also Maschinenbefehl.Und dann gleich noch eine Frage, wie sieht es mit Sprunganweisungen aus?
Wenn der Disassembler sieht, wo ein Opcode hinspringt, dann kann er den dortigen Code doch schonmal in einem Array als Programmcode markieren und an der alten Stelle weitermachen, bis er an diesen Sprungcode kommt wo er dann weitermachen kann.
-
Du kannst zwischen zwei Opcodes auch datenmüll ablegen und den Müll mit einem Sprung übergehen, der Disassembler kann das nur erkennen, wenn er den Datenfluss analysiert und nicht nur die statische Version.
Disassembler führen für gewöhnlich mehrere Durchgänge durch um zu ermitteln was Code und was Daten sind.Aber der Disassembler kann nicht immer zu 100% sicher entscheiden was Code und was Daten sind, manchmal entscheidet er sich auch falsch und sowas wird zum Schutz von Programmen auch durchaus ausgenutzt (aber ist natürlich auch klar, dass die Disassembler auch immer besser werden).