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;
}