1

我编写了一个dll。在这个 dll 中,我想挂钩另一个 dll 的函数加载到内存中。这是许多小时工作的结果:

typedef int (__fastcall *def_cry)(int a,int b,int fromlen);
def_cry Real_cry;
int __fastcall custom_cry(int a,int b,int fromlen) {
    Log("cry ...");
    __asm nop;
    return Real_cry(a, b, fromlen);
}
DWORD imageBaseOtherDll = 0x39500000;
DWORD functionOffset = 0x395742F8;
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll");
DWORD functionOffset = imageBase + (functionOffset  - imageBaseOtherDll);
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry);

看来,我的钩子不起作用。我想我在代码中放了一些逻辑错误,但我是初学者并且需要帮助!

4

1 回答 1

3

您确定要挂钩的函数使用__fastcall调用约定吗?

为了挂钩从 DLL 导出的函数,您需要修补调用它的所有模块 (dll/exe) 的导入表,或者在运行时重写函数入口点。可以在此处的 CodeProject 上找到一篇关于修补导入表的不错的文章。可以在此处找到有关使用 MS Detours 的好教程。

调用 DetourFunction 时需要提供要挂钩的函数的地址。这些值不应被硬编码,因为不保证在您的 DLL 中加载到特定地址。使用以下代码可以很容易地做到这一点:

// Get the module containing the function to hook
HMODULE targetModule = GetModuleHandle("otherDll.dll");
// Get the address of the function to hook
FARPROC targetFunction = GetProcAddress(targetModule, "cry");
// Go hook it.
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);
于 2011-07-26T01:12:28.370 回答