在逆向工程彙編分析過程中,我們很關心關鍵函式的功能及其引數的意義。總會遇到很多的函式呼叫。我們需要關注的是:引數的傳遞,函式返回,函式呼叫,引數引用,返回值,函式返回,堆疊平衡這些問題。下面我們用例項來分析一下函式整個呼叫過程。
首先給一張函式呼叫全景圖
函式呼叫協議可以參考文章:
函式呼叫協議彙總x86/x64/arm/arm64
如圖1所示,引數由右向左依次入棧
call 指令可以分寫為兩個動作,push 和jump。push當前函式返回位址,jump到函式處。我們在ida中f7進入函式,棧中情況如圖2所示。
0x791586指向函式的返回位址,如圖3
這裡看看被代用函式是如何使用引數的。
首先了解c**,很簡單的求和。那麼我們在彙編**中學習一下如何引用a,b,c,d,e五個引數
int __stdcall fun_stdcall_5args
(int a,
int b,
int c,
int d,
int e)
如圖4所示,ebp是本函式的棧底,從上面的分析我們知道,ebp+4儲存的函式返回位址,從ebp+8開始儲存著函式呼叫所使用的引數。
函式返回
當函式將返回值設定好後,函式開始準備返回。
eax儲存著函式的返回值。
圖5中,返回關鍵**參見方框中。首先恢復函式體內使用的暫存器,恢復函式體臨時申請棧空間,彈出呼叫者的ebp,最後呼叫retn函式返回。
retn指令表示取出當前棧頂值 作為返回位址 將eip修改為該位址。
看看函式返回棧的情況。如圖6所以,retn指令後eip指向被呼叫函式的下面一條指令。esp和ebp恢復到了代用函式前的狀態。
根據規則進行堆疊平衡,可能是函式體內負責堆疊平衡,也可能是呼叫者負責堆疊平衡。
堆疊恢復平衡後如圖8,呼叫函式之前將引數壓棧使用的棧空間,釋放了。達到呼叫的平衡。
函式呼叫過程
每乙個未執行完的函式都對應著乙個棧幀,系統為單個函式分配的那部分棧空間就叫做棧幀,棧幀儲存了函式的資訊。以下面的 為例,通過彙編 的執行過程介紹棧幀建立和銷毀的過程 include int add int x,int y int main 從main函式建立自己的棧幀開始 其他內容先忽略 初始狀態 ...
函式呼叫過程
c語言種有三種迴圈 do.while while for 初始化 條件判斷 步進 主函式 main 庫函式自定義函式函式的發明,使得變成可以以函式為單位進行模組化,叫做面向過程。軟體工程中,有 高內聚,低耦合 的要求。函式就是為了實現以上要求發明的產物。函式是面向過程的 介面 其介面包含了 引數 返...
函式呼叫過程
引數代入順序 引數入棧的順序是從右向左入棧的。8位元組的引數代入 push入棧的方式將引數傳遞 8位元組的引數代入 先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。int fun1 int a,int b int main 第一步進行函式引數入棧,如圖 ...