C++ 迂回-挂钩类成员函数-设置目标函数偏移量的语法?

C++ 迂回-挂钩类成员函数-设置目标函数偏移量的语法?,c++,hook,detours,C++,Hook,Detours,对于非类函数-我可以简单地声明要绕道的函数的偏移量,如下所示: typedef int (_cdecl* SomeFunc)(char* pBuffer, int size); SomeFunc Real_SomeFunc = (SomeFunc)(0xCAFEBABE); ... DetourAttach(&(PVOID&)Real_SomeFunc, (PVOID)Hook_SomeFunc); 现在,对类的成员函数进行迂回处理变得很困难-迂回有一个示例: 镜像:

对于非类函数-我可以简单地声明要绕道的函数的偏移量,如下所示:

typedef int (_cdecl* SomeFunc)(char* pBuffer, int size);

SomeFunc Real_SomeFunc = (SomeFunc)(0xCAFEBABE);

...

DetourAttach(&(PVOID&)Real_SomeFunc, (PVOID)Hook_SomeFunc); 
现在,对类的成员函数进行迂回处理变得很困难-迂回有一个示例:

镜像:

该示例已经定义了targets成员函数,但我不知道,我只知道我将DLL注入到的二进制文件中的偏移量,那么如何转换它呢

void (CDetour::* CDetour::Real_Target)(void) = 
    (void (CDetour::*)(void))&CMember::Target;
对这样的事情:

void (CDetour::* CDetour::Real_Target)(void) = 
    (void (CDetour::*)(void))0xCAFEBABE;
我这里有个编译错误

有什么提示吗

我这里有个编译错误

具体来说,这是错误C2440:“类型转换”:无法从“unsigned int”转换为“void”(\uu thiscall CDetour::*)(void)。没有从整数值到指向成员值的指针的转换。到成员指针的转换是一个非常重要的问题——它们可能是也可能不是简单的内存地址,这取决于成员函数的类型和类层次结构的复杂性。多重虚拟继承为这个伪数据结构添加了额外的字段;除了代码地址之外,还有基于代码的信息。此数据的格式是特定于编译器的

出于我的目的,我使用此MSVC特定宏:

/// Void pointer to Func pointer.
/// Assumes first four bytes should hold the address and rest be zero.
template<typename T> T VTOF(void* ptr)
{// fills in 4 bytes and zeroes the rest
    T result = 0;
    *(void**)&result = ptr;
    return result;
}
///Void指针指向Func指针。
///假设前四个字节应包含地址,其余字节为零。
模板T VTOF(无效*ptr)
{//填充4个字节,其余字节归零
T结果=0;
*(无效**)和结果=ptr;
返回结果;
}
用法:
ptr=VTOF((void*)0xCAFEBABE)
现在,这显然在真正复杂的代码中不起作用,但我假设它足以在钩子中调用原始代码。我已经有一段时间没有在成员函数指针上使用它了

/// Void pointer to Func pointer.
/// Assumes first four bytes should hold the address and rest be zero.
template<typename T> T VTOF(void* ptr)
{// fills in 4 bytes and zeroes the rest
    T result = 0;
    *(void**)&result = ptr;
    return result;
}