c++自定义调用约定

C++ custom calling convention

本文关键字:约定 调用 自定义 c++      更新时间:2023-10-16

逆向工程时,我遇到了一个非常奇怪的程序,它使用调用约定在eax中传递一个参数(非常奇怪的编译器??)。我现在想调用那个函数我不知道怎么声明,IDA把它定义为

bool __usercall foo<ax>(int param1<eax>, int param2);

,其中param1在eax寄存器中传递。我尝试了

bool MyFoo(int param1, int param2) 
{
    __asm mov eax, param1;
    return  reinterpret_cast<bool(__stdcall *)(int)>(g_FooAddress)(param2);
}

然而,不幸的是,我的编译器在堆栈上推param2时使用了eax寄存器,是否有任何方法可以在不使用内联汇编器编写整个调用的情况下使其干净?(我正在使用Visual Studio,如果这很重要)

有通过寄存器传递参数的"正常"调用约定。如果您正在使用MSVC,例如,__fastcall .

http://en.wikipedia.org/wiki/X86_calling_conventions fastcall

你不能定义你自己的调用约定,但我建议你创建一个包装器函数,它通过内联汇编完成自己的调用/清理。这可能是实现此效果的最实用的方法,尽管您也可以通过使用__fastcall来更快地完成此操作,做一些寄存器交换,然后jmp到正确的函数。

调用约定比传递参数更重要,因此选项#1可能是最好的,因为您可以完全控制调用方的行为。