Frage

So versuche ich das objdump Dienstprogramm zu verwenden, um eine Kontrollflussgraphen von der Montage zu bauen, und ich laufe in ein Problem. Im Grunde genommen, wenn eine Verzweigung auftritt und die Zieladresse ist relativ Ich bin nicht sicher, wie, wo der nächsten Basisblock beginnt zu kennen. Ich bin mir nicht sicher, ob ich klar bin zu sein, so dass ich ein Beispiel hinzufügen würde. Sagen Sie mein Programm durch den objdump Ausgang geht und hat die Startadresse für den ersten Basisblock aufgezeichnet. Es trifft dann auf einen Sprung-Befehl, der zu Punkt-Adressierung an die richtige Adresse relativ verwendet, um zu springen. Ich weiß, dass das Ende meines ersten Basisblock genau dort auftritt, aber wie ich gehe darum, die richtige Adresse für den Beginn des nächsten Basisblock zu bekommen? Jede Führung jedermann zur Verfügung stellen kann wäre sehr dankbar, ich bin ein x86-Anfänger am besten und ich habe meinen Kopf gegen diese für die vergangene Woche wurde hämmern.

War es hilfreich?

Lösung

Unter der Annahme, ich verstehe die Frage, vielleicht wird dies Sie loslegen. Relative Sprünge werden auf PC-Basis.

d: eb 04 jmp 13 

0xEB ist der Opcode für einen relativen Sprung basierend auf einem 8-Bit-Sofort. Die Adresse des Befehls in der Ausgabe objdump, in diesem Fall D oder 0xD. Es ist ein Zwei-Byte-Befehl (X 86 ist mit variabler Länge). es sagt Sie, in der Ausgabe, welche die Zieladresse, in diesem Fall jmp 13. So in dem objdump Ausgang für die Linie sucht, beginnt mit 13 und ein Doppelpunkt ist der Anfang des nächsten Stückes Code.

Um zu verstehen, wie diese Adresse berechnet wird. Der PC ist auf 0xD ist, wenn es beginnt, den Befehl zu holen, dauert es zwei Bytes, so dass der PC bei 0xD + 2 = 0 × F ist, wenn es bereit ist, diesen Befehl auszuführen. Der Offset ist 0x4 so 0xF + ??0x4 = 0x13 die Zieladresse.

20: 75 ed jne f

Das Gleiche gilt für rückwärts. pc Plus Anzahl von Bytes = 0x20 + 2 = 0x22. 0xED ist eine Zahl mit Vorzeichen und ist negativ, so verlängern unterzeichnen 0xED zu 0xFFFFFFF ... FFFFED jedoch groß Ihre Adressregister ist. In 0x22 + 0xFFFFFF ... FFFED und Sie 0x0F die Zieladresse erhalten. Sie können auch 0xED, Invertzuckersirup nehmen und 1 addieren es zu negieren. ~ 0xED = 0x12, 0x12 + 1 = 0x13. So 0xED Mittel abziehen 0x13. 0x22-0x13 = 0x0F.

Hier sind einige weitere, jeweils gibt es Ihnen die Zieladresse, die Sie gerade in der objdump Ausgabe aussehen kann.

Um zu verstehen, wie sie diesen Wert berechnet. Die gleiche Geschichte, beginnen Sie mit Opcode bei 0x400A81, dauert es 6 Bytes in diesem Fall für die Anweisung mit variabler Länge. Also von der Zeit sind Sie bereit, der PC ist bei 0x400A81 + 6 = 0x400A87 auszuführen. Der Offset ist 0x107 so, wenn die Bedingung der Zieladresse erfüllt ist 0x400A87 + 0x107 = 0x400B8E.

Beachten Sie diese von einem größeren Programm grep ist, nicht sequenziellen Code, nur eine Sammlung von isolierten Beispielen.

  400a81:   0f 8f 07 01 00 00       jg     400b8e 
  400a8f:   0f 8f e6 00 00 00       jg     400b7b 
  400a9d:   0f 8f c5 00 00 00       jg     400b68 
  400aab:   0f 8f a4 00 00 00       jg     400b55 
  400ab9:   0f 8f 83 00 00 00       jg     400b42 
  401d76:   0f 8f 31 01 00 00       jg     401ead 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top