gpt4 book ai didi

c++ - 弯路 - Hook 类成员函数 - 设置目标函数偏移量的语法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:48 24 4
gpt4 key购买 nike

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

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

SomeFunc Real_SomeFunc = (SomeFunc)(0xCAFEBABE);

...

DetourAttach(&(PVOID&)Real_SomeFunc, (PVOID)Hook_SomeFunc);

现在,绕过类的成员函数会变得困难 - detours 有一个示例:

https://github.com/microsoft/Detours/blob/master/samples/member/member.cpp

该示例已经定义了目标成员函数 - 但我不知道我只知道将我的 DLL 注入(inject)的二进制 im 中的偏移量 - 那么我该如何转换它

void (CDetour::* CDetour::Real_Target)(void) = 
(void (CDetour::*)(void))&CMember::Target;

像这样:

void (CDetour::* CDetour::Real_Target)(void) = 
(void (CDetour::*)(void))0xCAFEBABE;

编译出错

有什么提示吗?

最佳答案

void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))0xCAFEBABE;

I'm getting a compile error here

具体来说,它是 error C2440: 'type cast' : cannot convert from 'unsigned int' to 'void (__thiscall CDetour::* )(void). There are no conversions from integral values to pointer-to-member values .转换为成员指针是一件非常重要的事情——它们可能是也可能不是简单的内存地址,这取决于成员函数的类型和类层次结构的复杂性。多重虚拟继承为这个伪数据结构增加了额外的字段;除了代码地址,还有 rebase 信息。此数据的格式是特定于编译器的。

出于我的目的,我使用了这个 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;
}

用法:ptr = VTOF<void (CDetour::*)(void)>((void*)0xCAFEBABE);现在,这显然不适用于真正的复杂代码,但我认为它足以在 Hook 中对原始代码的调用中工作。自从我不得不在成员函数指针上使用它已经有一段时间了。

关于c++ - 弯路 - Hook 类成员函数 - 设置目标函数偏移量的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10559323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com