【问题标题】:C++ custom calling conventionC++ 自定义调用约定
【发布时间】:2011-12-03 07:13:53
【问题描述】:

在进行逆向工程时,我遇到了一个非常奇怪的程序,它使用在 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)

【问题讨论】:

    标签: c++ assembly calling-convention


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我知道,但 MSVC fastcall 使用 ECX+EDX 而不是 EAX,因此这不是我需要的 :-(
    • 谢谢我按照你的建议求助于内联汇编,我首先认为你几乎总是可以避免内联汇编,这是我遇到的第一个你不能的情况。
    猜你喜欢
    • 2011-01-05
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多