2010-12-31 5 views
1

I次のコードを持っている:ここではスタックフレームのアセンブリコードを分析するには?

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

は私が持っているスタックトレースです -

**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 

は今、私はそれ

ff ff ff 88 E8 
上記の最初の5つのバイトを得たFunc5のリターンアドレスを使用して

E8の存在は、これがコールステートメント(near)であり、次の4バイトがアドレスの計算に使用されることを意味します。 CALL Func5を読むと、EIPは4038c3になります。このデータからFunc5の開始アドレスを計算するにはどうすればよいですか? 他のデータが必要かどうか教えてください。これが遠距離コール(opcode - FF)の場合も、計算はどのように行われますか?

答えて

3

逆の順序でバイトを印刷しています。正しい順序は次のとおりです。E8は、x86は少しエンディアンを使用しているためjump relative 0xFFFFFF88、または-0x78を意味するだろう

「相対IMM32ジャンプ」のオペコードである

E8 88 ff ff ff 

EDIT:コール命令の次のバイトを基準にしています。例えば、

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

あなたはもちろん正しいです。最終アドレスはどのように取得するのですか?それは何に相対的ですか? CS? – Bruce

+0

だからここでは0x403850になります。クール。どうもありがとう。 FAR CALL(opcode - FF)の計算方法は?私は今あなたにすべてのポイントを与えるように感じる! – Bruce

+0

また、この資料についてはどこで読むことができますか? – Bruce

1

これはプレートフォームによって異なります。ほとんどのUNICESでは、dladdrはアドレスに最も近いシンボルを提供します。

ウィンドウ上ではもっと複雑です:dbghelp.dllとmsapi.dll APIを見てください。 私は恥ずかしそうに覚えていませんが、これは遠くないです。

関連する問題