9.逆向-函数调用约定
生活随笔
收集整理的這篇文章主要介紹了
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函數(被調用函數)
?
MAIN函數(調用函數)
?
?
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函數(被調用函數)
?
MAIN函數(調用函數)
?
雖然Win32API是使用C語言寫的庫,但它使用的是stdcall方式,而不是C語言默認的cdecl方式。這是為了獲得更好的兼容性,使C語言之外的其他語言也能直接調用API。
Fastcall:與stdcall方式基本類似,但該方式通常是使用寄存器(非棧內存)去傳遞那些需要傳遞給函數的部分參數(前兩個)。若某函數有4個參數,則前2個參數分別使用ECX、EDX寄存器傳遞。使用過程中注意ECX和EDX已經包含參數了。Fastcall的目的是為了加大執行速度用的。
總結
以上是生活随笔為你收集整理的9.逆向-函数调用约定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React-状态提升
- 下一篇: mongoDB常用