所以这可能是一个奇怪的问题。我正在使用 IDA 中的 Windows 32 位可执行文件,它最初是用 C/C++ 编程的(很可能使用 Visual Studio .NET 2002)。对于虚函数调用,ABI 使用__thiscall,因此被调用者清理堆栈,IDA 需要知道函数在调用者中考虑了多少参数。
问题是虚函数调用的方式使得 IDA 很难找出被调用的函数。调用可能是什么样子的一个例子是这样的(在英特尔语法中,IDA 使用):
mov eax, [ecx]
call dword ptr [eax+4]
与ecx被设置为this调用者。由于没有简单的方法可以知道所指的dword ptr [eax+4]是什么,它会猜测在调用之前推送的变量需要多少个参数。问题是它经常抓取太多的推送指令,并不断包含保存的寄存器。这导致它假设函数退出时堆栈指针不正确,并弄乱了调用下方的堆栈变量引用。
我想告诉 IDA 调用中的堆栈更改应该是什么来纠正这个问题,但我似乎无法在任何地方找到该选项。这可能吗?我似乎无法弄清楚这一点。