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
?
答案 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 foo
。 foo()
然后将a
参数视为7
而不是原始6
,因为thunk修改了foo()
的调用堆栈。