逆向工程核心原理——第十章
阿新 • • 發佈:2020-07-13
函式呼叫約定
函式呼叫約定,就是函式呼叫時如何傳遞引數的一種約定。
*棧的大小記錄在pe頭中。
主要的函式呼叫約定如下:
cdecl
stdcall
fastcall
1.cdecl
cdecl主要是C語言中使用的方式,呼叫者負責處理棧。
這裡書本上給了一段程式碼:
#include<stdio.h>
int add(int a, int b)
{
return (a+b);
}
int main()
{
return add(1,2);
}
編譯後放進OD檢視函式呼叫:
這種通過push指令將值壓入棧中傳遞引數的方法,就是cdecl。
2.stdcall
stdcall這種方式常常用於Win32 API,這種方式由被呼叫者清理棧。
還是利用書上的程式碼:
#include<stdio.h>
int _stdcall add(int a, int b)
{
return (a+b);
}
int main()
{
return add(1,2);
}
還是使用OD工具檢視:
我們看到與上面cdecl相比,缺少了一條關閉棧區的指令。因為stdcll是被呼叫者清理棧。
3.fastcall
fastcall與前面兩個不一樣的地方就是,fastcall不會使用push傳參,而是直接使用暫存器傳參。這樣速度就比壓棧傳參更快。