不使用__fastcall挂钩__thiscall

时间:2014-02-07 19:44:33

标签: c++ windows hook

假设你需要在x86 Windows上挂钩/绕过一个__thiscall类型的函数,为了做到这一点,你需要将一个void *传递给shim函数。是的,这在技术上是“可怕的滥用”C ++,但这是函数挂钩,而不是编写便携式应用程序的练习。

例如,假设你需要挂钩一个这样的函数:

void __thiscall SomeClass::MemberFunction(int b) { this->somevar = b; }

显然众所周知,你可以创建一个__fastcall函数,使用额外的arg处理EDX,但这有点......蹩脚。

所以问题是:你能想到什么技巧可以将非静态C ++类成员函数的类型转换为void *变量?

1 个答案:

答案 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);