为什么用fastcall代替cdecl代替内存中的thiscall函数?

逆向工程 拆卸 反编译 C++ C
2021-06-15 20:41:03

假设我要反转一些处理所有移动客户端的游戏,并确定某些功能属于以下类型:

bool __thiscall Player::CanJump(Player *this)

我已经决定成为 Player 对象的 vtable 的成员。现在假设我想编辑该对象的 vtable 以指向我自己的 dll 注入实现,以便我可以随时跳转。我可以将其声明为

bool __fastcall CanJumpReplacement(Player *player) {
    return true;
}

并用指向此函数的指针替换 Player 的 vtable 条目。这按预期工作,但为什么我要在这里使用 fastcall 约定据我所知,Fastcall 几乎专门用于此目的,但我正在阅读调用约定,而 cdecl 似乎比 fastcall 更接近 thiscall。两种调用约定都成功地替换了该函数。

1个回答

这个问题有点困惑。

双方__fastcall__thiscall分享他们使用ecx的第一个存储点。因此,要么您隐含地说类指针将在ecx( __thiscall) 中,要么您说该函数不是成员函数但有一个参数 -ecx使用时也会传入该参数,__fastcall因此类指针仍会在正确的寄存器中结束。

此外,两种调用约定都使用被调用者清理,所以这里也没有问题。

但是,这只适用于无参数函数。如果您的函数有一个参数,它最终会在edxfor 中__fastcall,但在堆栈中 for __thiscall,因此不再起作用。