9 逆向 函式呼叫約定

2021-09-27 04:47:20 字數 1390 閱讀 2211

函式呼叫約定:是對函式呼叫時引數如何傳遞的一種約定。呼叫函式先把引數壓入棧然後再傳遞給函式。棧就是定義在程序中的一段記憶體空間。向下(低位址方向)擴充套件。且其大小被記錄在pe頭中。也就是說,程序執行時確定佔記憶體的大小。

函式執行完成後,棧中的引數如何處理?不處理。

函式執行完畢後,esp值如何變化?恢復到呼叫之前。

呼叫約定分三種cdecl/stdcall/fastcall

cdecl:呼叫者負責處理棧

vs2015 c++ 控制台程式 預設是cdecl

#include "stdafx.h"

#include #include #include using namespace std;

dword  add(dword dwnumberfirst ,dword dwnumbersecond) 

int main()

add函式(被呼叫函式)

main函式(呼叫函式)

stdcall:被呼叫者負責處理棧

#include "stdafx.h"

#include #include #include using namespace std;

dword _stdcall add(dword dwnumberfirst ,dword dwnumbersecond) 

int main()

add函式(被呼叫函式)

main函式(呼叫函式)

雖然win32api是使用c語言寫的庫,但它使用的是stdcall方式,而不是c語言預設的cdecl方式。這是為了獲得更好的相容性,使c語言之外的其他語言也能直接呼叫api。

fastcall:與stdcall方式基本類似,但該方式通常是使用暫存器(非棧記憶體)去傳遞那些需要傳遞給函式的部分引數(前兩個)。若某函式有4個引數,則前2個引數分別使用ecx、edx暫存器傳遞。使用過程中注意ecx和edx已經包含引數了。fastcall的目的是為了加大執行速度用的。

函式呼叫約定

函式呼叫約定有多種,這裡簡單說一下 1 stdcall 呼叫約定相當於16位動態庫中經常使用的 pascal 呼叫約定。在32位的vc 5.0中pascal呼叫約定不再被支援 實際上它已被定義為 stdcall。除了 pascal外,fortran和 syscall也不被支援 取而代之的是 stdc...

函式呼叫約定

函式呼叫約定1.stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧,由呼...

函式呼叫約定

1.stdcall是pascal程式的預設呼叫方式,通常用於win32 api中,函式採用從右到左的壓棧方式,自己在退出時清空堆疊。vc將函式編譯後會在函式名前面加上下劃線字首,在函式名後加上 和引數的位元組數。2 c呼叫約定 即用 cdecl關鍵字說明 按從右至左的順序壓引數入棧,由呼叫者把引數彈...