2011-10-07 93 views
3

虽然逆向工程我绕过一个非常奇怪的程序,它使用调用约定,在eax中传递一个参数(非常奇怪的编译器??)。现在我要调用该函数,我不知道如何申报呢,IDA将其定义为C++自定义调用约定

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); 
} 

然而,不幸的是我的编译器利用了EAX寄存器堆栈上推param2的时候,有没有什么办法,我怎么能做出这种干净而不需要编写与内联汇编整个通话? (如果重要,我正在使用Visual Studio)

回答

2

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

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

你不能定义自己的调用约定,但我会建议你做创建一个包装功能,通过内联汇编做自己的使命/清理。这可能是实现这种效果最实际的方法,但也可以通过使用__fastcall,做一些寄存器交换,然后jmp来实现正确的功能。

除了参数传递之外,还有一个调用约定更多,所以选项#1可能是最好的,因为您可以完全控制调用者的行为方式。

+0

我知道,但MSVC快速调用使用ECX + EDX而不是EAX,因此它不是我所需要的:-( – Listing

+0

谢谢我按照您的建议退回到内联汇编程序,我首先想到您几乎总是可以避免内联汇编程序,这是我遇到的第一种情况,你不能。 – Listing