我有来自 C++ DLL 的源代码。此 DLL 是应用程序的一部分。我想 Hook 一个由另一个 DLL 加载到内存中的函数,以便我的 Hook 函数被所有其他 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 Hook 该函数)?顺便说一下,有人知道我如何在 IDA PRO 中获得标准(fex.0x0100344C)偏移量吗?
最佳答案
看来你是想绕微软的弯路,是windows平台的hook系统。 Detours 使用的是“蹦床 Hook ”。简单来说,它会尝试“重写”函数前面的几条 ASM 指令,并将真正的调用重定向到您的特定函数,诸如此类。绕路可以帮助你处理这些细节。但是我没有看到任何关于弯路的代码,所以我认为你需要学习一些弯路基本用法的文档。
针对您的问题:
OriginalFunction
只是一个指向特定地址的变量。重写这个变量不能影响真正的调用。因为你的程序仍然会使用原来的地址调用,你只是改变了一个变量,而不是你的内部程序。
当你改写内存钩子(Hook)函数时,这个正常只是影响当前进程,因为windows NT下的程序使用的是虚拟地址,而不是真实的内存地址。
关于DLL 源代码中的 C++ 函数 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562486/