gpt4 book ai didi

c++ - 在不使用 __fastcall 的情况下 Hook __thiscall

转载 作者:行者123 更新时间:2023-11-28 00:34:04 25 4
gpt4 key购买 nike

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

例如,假设您需要 Hook 这样的函数:

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

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

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

最佳答案

我已经有几个解决方案了,所以我们开始吧:

第一个可以说是最快的:

__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);

关于c++ - 在不使用 __fastcall 的情况下 Hook __thiscall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21636482/

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