假设您需要在x86 Windows上挂钩/绕行__thiscall
types的函数,为了实现这一点,您需要将void *传递给shim函数。 是的,这在技术上是C ++的“可怕的滥用”,但这是函数挂钩,而不是编码便携式应用程序的练习。
例如,假设你需要挂钩一个这样的函数:
void __thiscall SomeClass::MemberFunction(int b) { this->somevar = b; }
显然众所周知,你可以创build一个__fastcall
函数来使用一个额外的参数来处理EDX,但这有点…蹩脚。
所以问题是: 你能想到能够将非静态C ++类成员函数的types转换为void *variables的技巧?
我已经有了一些解决方案,所以我们来看看:
第一个可以说是最快的:
__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);