2
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

4

1 回答 1

3

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

于 2010-09-15T05:02:01.357 回答