繁体   English   中英

C ++自定义调用约定

[英]C++ custom calling convention

在逆向工程中,我遇到了一个非常奇怪的程序,它使用一个在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可能是最好的,因为您将完全控制调用者的行为方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM