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
Antwort
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.
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? –
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
Welcher Befehlssatz ist das? –