跳转至

清理栈

新被调用者还必须正确处理栈、保留寄存器,并传递正确的返回值。至少,这意味着你的替换函数必须在调用约定和参数数量上都与游戏原始函数匹配。

假设这是原始的完整函数调用,用汇编表示:

PUSH 1
PUSH 456
PUSH 321
CALL 0x0BADF00D
ADD ESP, 0x0C

你可以判断这个函数使用 C++ 的 __cdecl 约定,因为栈由调用者重置。此外,从栈清理的 0x0C 字节表明有三个参数,你可以这样计算:0x0C / sizeof(DWORD) = 3。当然,你也可以通过检查栈上压入了多少东西来获得参数数量:有三个 PUSH 命令,每个参数一个。