棧和函數(shù)

沒有棧就沒有函數(shù),沒有局部變量,傳統(tǒng)上其是一個特殊的容器,用戶將數(shù)據(jù)壓入棧中,也可以將數(shù)據(jù)彈出,遵循先入后出的原則。

也就是說是一個動態(tài)的內(nèi)存區(qū)域,壓棧增大了棧,出棧減少了棧。

通常esp寄存器定位棧頂部,壓棧使得棧頂?shù)刂纷冃?,彈出反之增大,因為從高地址開始。

減少esp等于在棧上開辟空間,反之就是回收空間。

棧在程序運行時,保存了函數(shù)所需要的維護信息,也就是堆棧幀,或者說活動記錄,里面包含了函數(shù)的返回地址和參數(shù),臨時變量,包括非靜態(tài)的局部變量,和編譯器自動生成的其他臨時變量。還保存了上下文,還由函數(shù)調(diào)用前后需要保持不變的寄存器。

一般就是esp和ebp兩個寄存器,esp指向棧頂部,ebp指向了函數(shù)活動記錄的一個固定的位置,也叫做幀指針。

一般來說一個函數(shù)的匯編代碼開頭應(yīng)該是:

push ebp;把ebp(old ebp)壓入棧

move ebp ,esp;這時候ebp指向棧頂,這時候棧頂是old ebp,也就是保存了舊的棧頂置針

返回的時候再把ebp給esp,從而獲得初始入棧的時候的函數(shù)信息。

一些函數(shù)前幾個字節(jié)會預(yù)留一些空字節(jié),這樣就可以動態(tài)的插入一個jmp指令,從而跳轉(zhuǎn)到另外一個函數(shù),那么我們就可實現(xiàn)一個簡單hook

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,966評論 1 19
  • 棧: 在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中函數(shù)調(diào)用后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址,然后是函...
    zjfclimin閱讀 4,300評論 0 5
  • 首先寄存器使用慣例:eip :指令地址寄存器,保存程序計數(shù)器的值,當前執(zhí)行的指令的下一條指令的地址值,16位中為i...
    扎Zn了老Fe閱讀 2,099評論 0 0
  • 堆棧是連續(xù)的地址空間,且向低地址端生長。 esp 是堆棧指針ebp 是基址指針那兩條指令的意思是將棧頂指向ebp的...
    wyrover閱讀 1,240評論 0 1
  • 最近在看神夏。可能是之前看到waston的扮演者在訪談里公然譏諷基本演繹法里的劉玉玲,再加上實在不喜歡他劇中的走路...
    伍伍陸閱讀 168評論 0 0

友情鏈接更多精彩內(nèi)容