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可能是最好的,因为您可以完全控制调用方的行为。
相关文章:
- 为什么在 x64 中忽略__stdcall调用约定?
- 窗口调用约定
- 我应该提到纯虚函数中的调用约定吗?
- 如何使用gcc指定stdcall调用约定
- Clang:x86 FPU调用约定
- 该标准是否说明了例外和不同调用约定的共存
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- std::sort & comp - 调用约定?
- 如何为类 /块 /范围选择C 调用约定
- DLL 的"good"调用约定是什么?
- 结构中重载运算符的调用约定
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- x86-64 调用约定中的返回值
- 内联功能和调用约定
- 正在直接显示筛选器中调用约定
- 何时使用`__fastcall`调用约定
- 为C++结构定义显式析构函数如何影响调用约定
- 对类方法的正确约定调用
- 如何使用 Visual C++ 中的 Delphi 寄存器调用约定调用函数?
- 使用C调用约定调用函数模板专门化