我编写了一个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);
看来,我的钩子不起作用。我想我在代码中添加了一些逻辑错误,但我是初学者并且没有帮助!
答案 0 :(得分:3)
您确定要挂钩的功能使用__fastcall
呼叫约定吗?
为了挂钩从DLL导出的函数,您需要修补调用它的所有模块(dll / exe)的导入表或在运行时重写函数入口点。有关修补导入表的文章可以在CodeProject here 上找到。有关使用MS Detours的优秀教程可以在 here 找到。
调用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);