2011-10-07 192 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