DLL 源代码中的 C++ 函数 Hook

标签 c++ windows hook dll-injection detours

我有来自 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/

相关文章:

c++ - 将 C++ 项目升级到 VS2010,现在出现 AccessViolationException

c++ - 气泡排序-如何使用?

c++ - 为什么或为什么不应该使用 'UL' 来指定 unsigned long?

c++ - 如何在 Internet Explorer 中显示我自己的上下文菜单

c++ - 获取物理磁盘路径

winapi - 低级鼠标和键盘 Hook 回调在哪个线程中运行?

windows - 从 Windows Server 2008 在 Linux 上执行管理任务

windows - 如何使用 Windows 命令获取剪贴板内容?

templates - 角度 cli Hook

c++ - 如何 Hook 一个exe函数?