【问题标题】:C++ function hook inside source code of DLLDLL 源代码中的 C++ 函数挂钩
【发布时间】:2011-09-27 14:18:06
【问题描述】:

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

【问题讨论】:

    标签: c++ windows hook dll-injection detours


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多