1

我有来自 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)偏移量吗?

4

1 回答 1

0

看来你是在尝试走微软的弯路,微软是windows平台上的一个钩子系统。Detours 使用的是“tampline hook”。简单来说,它会尝试“重写”函数前面的几个 ASM 指令,并将真正的调用重定向到你的特定函数,类似这样。Detours 可以帮助你处理这些细节。但是我没有看到任何关于 detours 的代码,所以我认为你需要学习一些关于 detours 基本用法的文档。

对于您的问题:
OriginalFunction只是指向特定地址的变量。重写这个变量不会影响真正的调用。因为您的程序仍将使用原始地址调用,您只需更改一个变量,而不是您的内部程序。
当你重写内存挂钩函数时,这正常只是影响当前进程,因为windows NT下的程序使用的是虚拟地址,而不是真实的内存地址。

于 2011-07-03T14:03:35.130 回答