2016-05-01 7 views
0

Ich mache ein kleines Programm, das ein bisschen wie strace funktioniert, außer dass ich es alle Anrufe und auch die Rets fangen lasse. Da ich keine Möglichkeit finde, alle Aufrufe und ret wegen indirekter Aufrufe zu erhalten, würde ich gerne einen Weg finden, um die Funktion zu erhalten, von der ein ret-Opcode stammt. Haben euch eine Idee, wie man dieWie man den Ursprung eines ret Opcodes beim Verfolgen eines Programms erkennt

+0

Welcher Befehlssatz ist das? –

Antwort

1

Sie simulieren können, was ein ret tun: Es sieht in den Stapel an der Adresse %esp und setzt EIP auf diesen Wert. Die Anweisung vor der Adresse auf dem aktuellen Stapel wird die call sein, die hier verwendet wird.

+0

ok, aber da die Größe des vorherigen Befehls nicht festgelegt ist, ist es nicht schwierig, rückwärts zu gehen und zum Anfang dieses Befehls zu gelangen? –

+1

Ja, das ist eine allgemeine Einschränkung aller Opcode-Architekturen mit variabler Größe - Sie können nicht rückwärts gehen. Aber Sie kennen die aufrufende Funktion. Ich bin mir nicht sicher, warum Sie den 'Aufruf' an erster Stelle haben wollen, aber die Art, das zu tun, ist dann, die ganze Funktion von jedem gültigen Punkt zu disassemblieren, den Sie kennen, an der Adresse haltend, die von der' ret' gelesen wird . – phihag

Verwandte Themen