1. 程式人生 > 實用技巧 >逆向工程核心原理——第十章

逆向工程核心原理——第十章

函式呼叫約定

函式呼叫約定,就是函式呼叫時如何傳遞引數的一種約定。

*棧的大小記錄在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傳參,而是直接使用暫存器傳參。這樣速度就比壓棧傳參更快。