[英]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.