天天看點

9.逆向-函數調用約定

函數調用約定:是對函數調用時參數如何傳遞的一種約定。調用函數先把參數壓入棧然後再傳遞給函數。棧就是定義在程序中的一段記憶體空間。向下(低位址方向)擴充。且其大小被記錄在PE頭中。也就是說,程序運作時确定占記憶體的大小。

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

函數執行完畢後,ESP值如何變化? 恢複到調用之前。

調用約定分三種 cdecl/stdcall/fastcall

cdecl:調用者負責處理棧

VS2015 C++ 控制台程式 預設是cdecl

#include "stdafx.h"

#include <iostream>

#include <windows.h>

#include <string>

using namespace std;

DWORD  Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {

return dwNumberFirst + dwNumberSecond;

}

int main(){



DWORD dwSum = Add(1 ,2);

cout << dwSum << endl;

getchar();

    return 0;

}      

ADD函數(被調用函數)

9.逆向-函數調用約定

MAIN函數(調用函數)

9.逆向-函數調用約定

Stdcall:被調用者負責處理棧

#include "stdafx.h"

#include <iostream>

#include <windows.h>

#include <string>

using namespace std;

DWORD _stdcall Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {

return dwNumberFirst + dwNumberSecond;

}

int main(){



DWORD dwSum = Add(1 ,2);

cout << dwSum << endl;

getchar();

    return 0;

}      

ADD函數(被調用函數)

9.逆向-函數調用約定

MAIN函數(調用函數)

9.逆向-函數調用約定

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

繼續閱讀