如何获取函数定义的地址?

逆向工程 拆卸 C++ 函数挂钩
2021-06-16 23:32:55

所以我想知道如何通过取消引用 C++ 函数的起始地址来检索定义的地址而不是声明的地址。

更具体地说:

我检索函数地址的函数:

在此处输入图片说明

我有这个功能我想挂钩:

在此处输入图片说明

所以要检索whereHookGoes我所做的地址在此处输入图片说明

返回:

在此处输入图片说明

这是 的声明whereHookGoes在此处输入图片说明

但是我想要定义的地址,这样我就可以在函数中挂钩一个调用指令。

无论如何我可以从这里检索定义的地址吗?

如果您需要更多信息,请告诉我,我会提供。

1个回答

你得到的地址从编译器的角度来看的函数定义。看来您正在处理一个启用了增量链接的可执行文件(调试版本中的默认设置)。当增量链接打开时,链接器为所有函数生成跳转存根并引用它们而不是“真正的”函数体;这允许它仅替换跳转以指向下一个链接上的新/更新的函数体,而不必更新对该函数的所有其他引用(因为它们都转到跳转),从而加快了链接速度,尤其是对于大型项目.

因此,您有以下选择:

  1. 在禁用增量链接的情况下编译目标。
  2. 检测这种情况(例如检查第一个字节是否为 E9)并跟随跳转到实际的函数体。
  3. 修补跳跃以指向您的钩子,然后跳回最终目标。