挂钩函数的函数地址不一致(地址移位)

逆向工程 C++ 函数挂钩 dll注入
2021-07-11 18:38:45

我在特定应用程序中的函数地址方面遇到了“奇怪的”不一致。

首先,主函数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 个字节?它是我的钩子函数的大小吗?

1个回答

行。再次检查屏幕截图后发现问题。在检查 Ghidra 输出时,我似乎只是错过了函数的正确开头。

正如@blabb 所建议的那样再次验证所有内容表明我错过了函数开头的正确地址。

以下是如何对其进行评估的屏幕截图:

吉德拉地址在此处输入图片说明

VS 中的地址: 在此处输入图片说明

正如你所看到的 Ghidra offset = 140000000 - 140353ed0 = 353ed0

和VS一样 offset = createWorld - baseAddress = 0x00007ff6076d3ed0 - 0x00007ff607380000 = 353ed0

正如我所说 - 以某种方式检查 Ghidra 偏移量时出错了......