为什么输出是“In foo,a = 7”?

时间:2010-09-15 04:33:55

标签: c assembly thunk

void foo(int a)
{ printf ("In foo, a = %d\n", a); }

unsigned char code[9];
* ((DWORD *) &code[0]) = 0x042444FF; /* inc dword ptr [esp+4] */
              code[4]  = 0xe9;       /* JMP */
* ((DWORD *) &code[5]) = (DWORD) &foo - (DWORD) &code[0] - 9; 
void (*pf)(int/* a*/) = (void (*)(int)) &code[0];
pf (6);

任何人都知道上述代码6中的哪个位置增加1

1 个答案:

答案 0 :(得分:3)

foo()以及你的thunk使用__cdecl调用转换,这需要调用者在堆栈上推送参数。因此,当调用pf(6)时,6会通过PUSH 6指令被压入堆栈,然后通过CALL pf指令输入thunk。输入thunk时,6占用堆栈的内存位于ESP+4,即堆栈指针寄存器ESP的当前值为4个字节。 thunk的第一条指令是递增ESP+4指向的值,因此值“6”递增为“7”。然后,thunk的foo()指令输入JMP foofoo()然后将a参数视为7而不是原始6,因为thunk修改了foo()的调用堆栈。