2011-07-01 15 views

答えて

0

通常は、コマンドdd esp(x86の場合)またはdq rsp(x64の場合)を使用してスタックの内容をダンプするだけです。 va_listの開始アドレスを知ることで、varargブロックが始まるスタック内の場所を見つけるのが少し楽になりますが、通常は、関数に対して通常の(可変ではない)パラメータのサイズを知って計算するか、計算することができます。

ここにはx86の注釈付きの例があります。関数が呼び出されるbeeingて:

printf("%d %o %g %s %c", 101, 201, 301.0, "401-string", '5'); 

デバッガで:その他の機能については

0:000> bp MSVCR100D!printf 
0:000> g 
Breakpoint 1 hit 
eax=00000001 ebx=00000000 ecx=2549afc4 edx=00000000 esi=002ceeb8 edi=002cf040 
eip=0ff57ee0 esp=002cee98 ebp=002cf04c iopl=0   nv up ei pl nz ac po nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00000212 
MSVCR100D!printf: 
0ff57ee0 8bff   mov  edi,edi 
0:000> dd /c1 esp 
002cee98 01365cee // return address 
002cee9c 0137d6e8 // pointer to the format string "%d %o %g %s %c" --> next follows our variable arguments 
002ceea0 00000065 // first vararg argument, int 101 
002ceea4 000000c9 // second vararg argument, int 201 
002ceea8 00000000 // third vararg argument, double 301.0, it occupies two slots in stack 
002ceeac 4072d000 // third argument continues 
002ceeb0 0137d70c // fourth vararg argument, pointer to string 
002ceeb4 00000035 // fifth vararg argument, 8-bit character (still occupies 4 bytes in stack) 
002ceeb8 25b87244 
002ceebc 002cf254 
002ceec0 0041c520 
002ceec4 00000000 
...

、それは非常に似ています、引数の変数番号を使用するすべての関数は呼び出し規約__cdecl次する必要があるため、あなたのように、スタック内に同じ種類のレイアウトのパラメータがあります。

関連する問題