使用 C++、IDA 和 .pdb 文件的挂钩函数

逆向工程 艾达 C++ 函数挂钩
2021-06-12 03:05:54

我想在程序中调用一个函数。我从 DLL 入口点执行此操作。我在 IDA 中打开了该程序及其 .pdb 文件。根据 IDA,这是该函数的样子:

void __fastcall Logger::log(LogLevel lvl, const char *msg)

(LogLevel 只是一个枚举)

参数一目了然,不是问题。

但问题是我可能有错误的地址(我假设我需要先获取类的地址?)IDA 给了我:

.text:00000001400981A0

为函数。这是我尝试过的:

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) {
  if (dwReason == DLL_PROCESS_ATTACH) {
    typedef void __fastcall func(int lvl, const char* msg);
    func* loggerLog = (func*)(GetModuleHandle(0) + 0x1400981A0);
    loggerLog(0, "test 123");
  }
  return 1;
}

这样做程序就关闭了,没有错误。

我不知道从哪里开始。正确的方法和地址是什么?我如何获得我需要的地址?

1个回答

0x1400981A0 - 这是一个错误的值添加。您很可能需要使用 GetModuleHandle(0) + 0x981A0。因为 GetModuleHandle(0) 会给你像 0x140000000 这样的基地址。即,如果操作系统具有可用地址,IDA 会向您显示 DLL 将被加载到的虚拟地址。在其他情况下,您需要知道 RVA(相对虚拟地址),以便您计算函数的地址,例如操作系统将 DLL 加载到的 RVA + 虚拟地址。