我有来自C ++ DLL的源代码。此DLL是应用程序的一部分。我想挂钩由另一个DLL加载到内存中的函数,以便我的钩子函数被所有其他DLL而不是原始函数调用。我把这段代码放在我的代码中:
#include <windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")
//Function prototype
int (__stdcall* OriginalFunction)();
//Our hook function
int FunctionHook()
{
//Return the real function
return OriginalFunction();
}
//On attach set the hooks
OriginalFunction = (int (__stdcall*)())DetourFunction((PBYTE)0x0100344C, (PBYTE)FunctionHook);
问题是:如果我在一个DLL中搜索偏移量并通过此偏移量修补函数是不是错误(我认为它更复杂,因为我在另一个DLL中并想要挂钩所有DLL的函数)?顺便问一下,有人知道如何在IDA PRO中获得标准(fex.0x0100344C)偏移吗?
答案 0 :(得分:0)
您似乎正在尝试使用微软,这是Windows平台上的一个钩子系统。 Detours正在使用“trampline hook”。简单来说,它会尝试“重写”函数的前面几个ASM指令,并将真实调用重定向到您的特定函数,就像这样。 Detours可以帮助您处理这些细节。但是我没有看到任何关于弯路的代码,所以我认为你需要学习一些关于弯路基本用法的文档。
对于你的问题:
OriginalFunction
只是指向特定地址的变量。重写此变量不会影响实际调用。因为你的程序仍然会使用原始地址调用,你只需更改变量,而不是内部程序
当您将内存重写为钩子函数时,这种正常只会影响当前进程,因为Windows NT下的程序使用的是虚拟地址,而不是真实的内存地址。