免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
工具下載:
鏈接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取碼:6tw3
復制這段內容后打開百度網盤手機App,操作更方便哦
上一個內容:15.x86游戲實戰-匯編指令jmp call ret
現在引入一個堆棧的概念,首先每個程序運行時,操作系統會分給它一片內存空間,這個內存空間分堆內存空間和棧內存空間,不管是堆內存還是棧內存它們都是內存空間,只是用法不一樣,堆空間里存放全局數據,比如代碼、常量(就是一些寫死的數字、文字等),然后棧空間,用來存放局部數據,局部數據可以理解為在函數中寫死的常量、數據,現在就先這樣理解,現在沒寫代碼沒有畫面,等后面寫上c++代碼了會再說,現在有這樣一個概念就行
然后棧有點復雜,棧它的內存空間的使用方式,一個場景比如排隊買東西,它是先賣給排在最后一個的人,排在第一個的人要最后才能買到東西,棧就是新來數據會排在最后,最后一個數據會被優先使用,所以使用棧內存空間時,有往里存放數據的代碼就必須有取數據的代碼,也就是要把棧給恢復了,不然會亂套
然后棧里面的數據只有被斷點斷下來的時候才是準確的,程序運行中看到的棧里面的數據全部都是亂的全部都是垃圾數據
然后在調用函數的時候一般在調用的函數頭部會有提升棧的代碼,就是本來棧最后一個數據的內存是22222,調用函數會讓22222+30,加多少不固定,代碼編譯成程序的那一刻編譯器會給搞好,這個加的操作是為了防止棧里的數據被搞壞,所以這里有加它就會有減,當函數執行完加多少它就會再減多少
push是把一個數據放到棧內存空間中(放在最后一個位置)
pop是把棧里最后一個數據取出來,也就是把剛剛push拿出來
pushad是把所有寄存器當前的值放到棧里(也是放在最后一個位置)
popad是把剛剛pushad存的值拿出來
push
![]()
執行之后,下圖中的內存地址與上圖不一樣,是因為OD卡死了,游戲重啟了,如下圖可以看到執行push之后它會把數據一直放到棧里最后一個位置
![]()
pop
執行之前
![]()
執行之后,pop之后把棧里的數據放到pop后面跟的內存地址或寄存器里,然后把棧里的數據刪除(esp的值-4,為什么減4?因為32位它是4字節大小)
![]()
pushad
執行之前
![]()
執行之后
![]()
上圖執行之后不明顯,又執行了一次pushad,可以很清晰看到把eax、ecx、edx、ebx、esp、ebp、esi、edi這八個寄存器的值都給放到了棧里
![]()
popad
執行之前
![]()
執行之后
![]()
然后上方pushad的時候執行了兩次,所以好習慣是popad也兩次,這一次把棧里的數據改一改,可以看popad的值去哪了
首先右擊點修改
![]()
輸入修改的值
![]()
執行之前
![]()
執行之后,popad它會把棧中的值重新給到八個通用寄存器
![]()