2010-12-31 2 views
1

Ich habe den folgenden Code:Wie analysiert man Assembly-Code für Stack-Frames?

Func5() { ShowStackTrace();} 
Func4() { Func5();} 

Hier wird der Stack-Trace ich habe, ist -

**Frame for Func5** 
EIP : 403899 
Function name : Func5 
EBP : 12ff0c 
ESP : 12fed0 
Return address : 4038c8 
CS : 23 
DS : 9998 
ESI : 0 
EDI : 0 

**Frame for Func4** 
Function name : Func4 
EBP : 12ff14 
ESP : 12ff14 
CS : 23 
DS : 9998 
ESI : 0 
EDI : 0 

nun die Absenderadresse von Fkt5 mit bekam ich die ersten 5 Bytes darüber

ff ff ff 88 E8 

Das Vorhandensein von E8 bedeutet hier, dass dies eine Aufrufanweisung (nahe) ist und die nächsten 4 Bytes zur Berechnung der Adresse verwendet werden. Also wird die EIP, wenn wir CALL Func5 lesen, 4038c3 sein. Wie berechne ich die Startadresse von Func5 aus diesen Daten? Bitte sagen Sie, ob Sie weitere Daten benötigen. Wie wird die Berechnung durchgeführt, wenn es sich um einen Fernbefehl handelt (Opcode - FF)?

Antwort

3

Sie drucken die Bytes in umgekehrter Reihenfolge. Die richtige Reihenfolge ist:

E8 88 ff ff ff 

wo E8 ist Opcode für "springen relativ imm32"

dass jump relative 0xFFFFFF88 bedeuten würde, oder -0x78 weil x86 wenig Byte-Reihenfolge verwendet.

EDIT: Es ist relativ zum nächsten Byte nach dem Aufruf Befehl. ZB

0x100: E8 10 00 00 00 ;// call relative, will call 0x115 (0x105 + 0x10) 
         ;// and will leave 0x105 on the stack as return address 
0x105: 90    ;// next instruction 
+0

Sie haben natürlich Recht. Wie bekomme ich die endgültige Adresse? Es ist relativ zu was? CS? – Bruce

+0

Also hier wird es 0x403850 sein. Cool. Danke vielmals. Wie berechnen wir es für FAR CALL (Opcode - FF)? Ich möchte dir jetzt alle meine Punkte geben! – Bruce

+0

Wo kann ich auch über dieses Zeug lesen? – Bruce

1

Es hängt von der Plattformform ab. Bei den meisten UNICES stellt das Dladdr der Adresse das nächstgelegene Symbol zur Verfügung.

Unter Windows ist es komplizierter: Blick auf dbghelp.dll und msapi.dll APIs. Ich erinnere mich nicht genau, aber das ist nicht weit.