如何从反编译图像(IDA 或 Ghidra)中的基地址找到函数地址的偏移量

逆向工程 反编译 地址 抵消 十六进制
2021-06-23 01:43:00

假设 IDA 和 Ghidra 上的应用程序映像都有一个默认基地址,它等于140 000 000.

如果函数地址是: 140 039 ea0

这是否意味着从基地址到该函数地址的偏移量是0x39ea0

问的原因是当我像这样设置钩子时:

HookInfo{(void**)&gladius::get().gamemain, gamemainHooked}

在哪里 HookInfo = std::pair<void**, void*>;

gamemain 地址是从主进程的 baseAddress + 偏移量派生的(我确定它按预期工作)表示read access violation该地址有。

1个回答

发现它是如何工作的。

  1. 偏移量实际上只是地址的差异,可以从静态分析中获取,即来自IDA或Ghidra,无论它默认加载哪个地址空间。

  2. 因此,如果这些工具指定的基地址(在图像的开头)是:140 000 000并且函数从 开始140 039 ea0,则偏移量为:0x39ea0

  3. 要正确计算地址(即 baseAddress + Offset),您需要记住指针算法。

baseAddress + Offset / (2*sizeof(pointerSize)), IE

DWORD_PTR* address = baseAddress + 0x39ea0 / (2*sizeof(DWORD))

注意:我不太明白为什么在这种情况下尺寸是原来的两倍

  1. 需要确保根据正确的应用程序计算 baseAddress。

即,当简单地执行以下操作时:base_address = (DWORD_PTR)GetModuleHandle(NULL); 您将获得当前正在构建的应用程序的地址。因此,如果在我的情况下您正在构建代理 dll,那么您将获得它的基地址。

虽然我试图挂钩的函数在程序的 .exe 文件中,但该 dll 将被挂钩。所以,你真正想要的是:

baseAddressPtr = (DWORD_PTR*)GetModuleHandleA("<YourProgram>.exe");