我在特定应用程序中的函数地址方面遇到了“奇怪的”不一致。
首先,主函数hook成功,地址导出方式如下:
baseAddress + Offset,即来自 Ghidra 的 baseAddress 为140000000,主要函数的地址为:0x39EA0
所以,主函数地址是
(DWORD_PTR*) baseAddress + 0x39EA0 / (2 * sizeof(DWORD))
这工作得很好。
但现在我想打电话
gladius::world::World* __fastcall gladius::gui::GUI::getWorld(gladius::gui::GUI* thisptr);
从钩子函数和
根据 Ghidra 的说法,它应该在14003ef30。
这使得偏移量等于0x3ef30(加上指针算术)。但是在与 baseAddress 的那个偏移处我得到
Gladius.exe!proxy::video::RenderQueueManager::get
功能。
在静态分析中,它位于地址14003ecc0 处,距离getWorld的静态地址 270 字节。
那么,发生了什么?为什么堆栈移动了 270 个字节?它是我的钩子函数的大小吗?