假设你需要在x86 Windows上挂钩/绕过一个__thiscall
类型的函数,为了做到这一点,你需要将一个void *传递给shim函数。是的,这在技术上是“可怕的滥用”C ++,但这是函数挂钩,而不是编写便携式应用程序的练习。
例如,假设你需要挂钩一个这样的函数:
void __thiscall SomeClass::MemberFunction(int b) { this->somevar = b; }
显然众所周知,你可以创建一个__fastcall
函数,使用额外的arg处理EDX,但这有点......蹩脚。
所以问题是:你能想到什么技巧可以将非静态C ++类成员函数的类型转换为void *变量?
答案 0 :(得分:3)
我已经有了几个解决方案,所以我们来了:
第一个可以说是最快的:
__declspec(naked) __cdecl void* MemberFuncToPtr(...) {
__asm {
mov eax, [esp+4]
retn
}
}
void* ptr = MemberFuncToPtr(&MyClass::TheMemberFunction);
另一个没有asm但需要一个未使用的参数的替代方案:
void* MemberFuncToPtr(char i, ...) {
va_list v;
va_start(v,i);
void* ret = va_arg(v, void*);
va_end(v);
return ret;
}
void* ptr = MemberFuncToPtr(0, &MyClass::TheMemberFunction);