反匯編01

堆棧是連續(xù)的地址空間,且向低地址端生長冰蘑。

esp 是堆棧指針 
ebp 是基址指針 
那兩條指令的意思是 將棧頂指向 ebp 的地址 
以下摘自網(wǎng)上一篇文章:

push    ebp           ; ebp 入椂詈伲  
mov   ebp, esp        ; 因為 esp 是堆棧指針地啰,無法暫借使用送粱,所以得用 ebp 來存取堆棧  
sub   esp, 4*5        ; 下面的 wsprintf 一共使用了 5 個參數(shù)时捌,每個參數(shù)占用 4 個字節(jié)怒医,所以要入棧 4*5 個字節(jié)  
push  1111  
push  2222  
push  3333  
push  offset szFormat  
push  offset szOut  
call  wsprintf         ; 調(diào)用 wsprintf  
add   esp, 4*5        ; 堆棧使用完畢,“還” 回 4*5 個字節(jié)給系統(tǒng)  
...  
mov   esp, ebp        ; 恢復(fù) esp 的值  
pop   ebp           ; ebp 出椛萏郑  
ret 

明白了嗎稚叹?主要是用來保存 / 恢復(fù)堆棧,以便傳遞參數(shù)給函數(shù)拿诸∪肼迹  在 MASM 里面,有一條更方便的語句佳镜,就是 invoke 使用它后僚稿,你就不用自己做這些事情了◇吧欤 
--------------------------------------------------------------- 
esp 始終指向棧頂蚀同,ebp 是在堆棧中尋址用的

我的理解:
調(diào)用一個函數(shù)時缅刽,先將堆棧原先的基址(EBP)入棧,以保存之前任務(wù)的信息蠢络。然后將棧頂指針的值賦給 EBP衰猛,將之前的棧頂作為新的基址(棧底),然后再這個基址上開辟相應(yīng)的空間用作被調(diào)用函數(shù)的堆棧刹孔。函數(shù)返回后啡省,從 EBP 中可取出之前的 ESP 值,使棧頂恢復(fù)函數(shù)調(diào)用前的位置髓霞;再從恢復(fù)后的棧頂可彈出之前的 EBP 值卦睹,因為這個值在函數(shù)調(diào)用前一步被壓入堆棧。這樣方库,EBP 和 ESP 就都恢復(fù)了調(diào)用前的位置结序,堆棧恢復(fù)函數(shù)調(diào)用前的狀態(tài)纵潦。

二. 通過 ollydbg 跟蹤 esp 和 ebp

       發(fā)現(xiàn)文字描述還是太沒有快感徐鹤。上幾幅圖,來說明這個調(diào)試過程更好邀层。此文對于深刻理解 ebp返敬,esp 是具有長遠意義的

可以看到,初始情況下寥院,ebp 此時值為 0012FEDC劲赠,也就是棧幀的地址,而棧頂?shù)刂?esp 值為 0012FDFC只磷【酰可以看到兩個值有一定的關(guān)系泌绣。而幀指針的地址較高钮追。
然后我們讓它執(zhí)行前兩句,push ebp,mov ebp,esp
可以看到前兩句已經(jīng)執(zhí)行了阿迈,那么 ebp 跟 esp 的值也發(fā)生了變化元媚。esp=0012FDF8,ebp=0012FDF8苗沧。為神馬刊棕?一句句解讀,push ebp待逞,向棧里面壓入了一個東西甥角,那么棧頂此時應(yīng)該發(fā)生變化了,也就是地址 - 4 字節(jié)识樱。為什嗎是減法呢嗤无?因為是向低地址增長的震束,這點一定得注意。所以此時 esp 變化成了 0012FDFC-4=OO12FDF8. 至于 ebp 也等于 0012FDF8 就不解釋了当犯。
接著上圖不解釋:
此時呢垢村,觀察現(xiàn)在的值。棧頂 esp=0012FDF4, 而 ebp=0012FDF8; 沒啥好說的嚎卫,此時的棧頂已經(jīng)又跑上去了嘉栓,說明又有元素壓棧了。那么執(zhí)行這句 mov esp,ebp 之后拓诸,不用說侵佃,esp 跟 ebp 都會變成 0012FDF8. 我們重點看下一幅,執(zhí)行完 pop恰响,讓 ebp 出棧趣钱,后會發(fā)生神馬。
此時 ebp 已經(jīng)出棧了胚宦,來看看那他們的值首有,esp=0012FDFC,ebp=0012FEDC. 首先,ebp 出棧了枢劝,這個時候椌空了,所以棧頂會變成初始時的值 001212FDFC您旁。相當(dāng)于上圖中的 esp=0012FDF8+4=0012FDFC.** 注意出棧烙常,則棧頂 + 4,**然后呢鹤盒。ebp 為啥變成了 0012FEDC 初始的值蚕脏?ebp 不是一直保存著 esp 的初始地址么?
所以重點就在 pop 這個語句了侦锯。pop ebp 究竟表達神馬意思驼鞭?ebp 的值起初存在了棧中,出棧以后尺碰,它的值就恢復(fù)了原樣挣棕。所一句灰常重要啊。pop 的意思也許就是把彈出的值賦給我們的變量亲桥,pop ebp洛心,也就是把存在棧中的值彈出來賦給 ebp。
所以我在這里總結(jié)幾句:
1题篷、兩句的 mov ebp,esp 實際上是把 ebp 進棧后的棧頂?shù)刂方o了 ebp词身。
2、在 ebp 沒有出棧錢番枚,它會一直保存 ebp 進棧以后的棧頂值法严,也就是 1 的值璧瞬。
3、在 ebp 出棧前渐夸,需要把 esp 恢復(fù)到只有 ebp 在棧中時的值嗤锉。
4、出棧后墓塌,esp 自然恢復(fù)到 ebp 進棧以前的初始值瘟忱,而 pop ebp 則恢復(fù)了 ebp 的初始值。
5苫幢、pop 的語義很重要, pop ebp 的意思是把當(dāng)前棧頂?shù)脑爻鰲7糜眨腿?ebp 中,而不是讓 ebp 出棧韩肝,這點必須明確触菜!
這下應(yīng)該明白了吧~~~~
參考網(wǎng)上資源:
http://blog.csdn.net/running_noodle/article/details/2838679
http://hi.baidu.com/anheizzq/item/1c0899622926c81e7ddecca3

ebp-- 棧底指針
esp-- 棧頂指針


如圖所示,簡化后的代碼調(diào)用過程如下:
void Layer02()
{
int b = 2;
}

void Layer01()
{
int a = 1;
Layer02();
}

那么函數(shù)執(zhí)行過程中 ebp 和 esp 是如何變化的呢哀峻?如下是反匯編后的代碼:
void Layer02()
{
00413700 push ebp
00413701 mov ebp,esp
00413703 sub esp,0CCh
00413709 push ebx
0041370A push esi
0041370B push edi
0041370C lea edi,[ebp-0CCh]
00413712 mov ecx,33h
00413717 mov eax,0CCCCCCCCh
0041371C rep stos dword ptr es:[edi]
int b = 2;
0041371E mov dword ptr [b],2
}
00413725 pop edi
00413726 pop esi
00413727 pop ebx
00413728 mov esp,ebp
0041372A pop ebp
0041372B ret
我們看到函數(shù)調(diào)用開始執(zhí)行如下的兩行代碼:
00413700 push ebp
00413701 mov ebp,esp

返回前執(zhí)行如下代碼:
00413728 mov esp,ebp
0041372A pop ebp
0041372B ret
那么這幾行代碼到底是什么意思呢涡相?首先,如圖上所示:
開始兩行代碼的意思是先將 ebp1 壓棧剩蟀,然后將現(xiàn)在的棧頂 esp1 作為函數(shù)調(diào)用時的棧底催蝗,所以會執(zhí)行如下語句:
00413701 mov ebp,esp

那么,返回前的幾條語句又是什么意思呢育特?
我想大家已經(jīng)猜到了丙号,當(dāng)函數(shù)調(diào)用執(zhí)行結(jié)束,我們要執(zhí)行相反的過程:
00413728 mov esp,ebp

還原棧頂指針

0041372A pop ebp

還原棧底指針

0041372B ret
返回到函數(shù)調(diào)用前的指令繼續(xù)執(zhí)行缰冤。待續(xù)…

ESP,EBP, 椚В回溯基本原理

我們看到,盡管可以使用相對于棧頂(ESP 寄存器)的偏移來引用局部變量棉浸,但是因為 ESP寄存器經(jīng)常變化怀薛,所以用這種方法引用同一個局部變量的偏移值是不固定的。這種不確定性對于 CPU 來說不成什么問題涮拗,但在調(diào)試時乾戏,如果要跟蹤這樣的代碼迂苛,那么很容易就被轉(zhuǎn)得頭暈眼花三热,因為現(xiàn)實的函數(shù)大多有多個局部變量,可能還有層層嵌套的循環(huán)三幻,棧指針變化非常頻繁就漾。

為了解決以上問題,x86 CPU 設(shè)計了另一個寄存器念搬,這就是 EBP 寄存器抑堡。EBP 的全稱是 Extended Base Pointer摆出,即拓展的基址指針。使用 EBP 寄存器首妖,函數(shù)可以把自己將要使用的椯寺空間的基準地址記錄下來,然后使用這個基準地址來引用局部變量和參數(shù)有缆。在同一函數(shù)內(nèi)象踊,EBP 寄存器的值是保持不變的,這樣函數(shù)內(nèi)的局部變量便有了一個固定的參照物棚壁。

通常杯矩,一個函數(shù)在入口處將當(dāng)時的 EBP 值壓入堆棧,然后把 ESP 值(棧頂)賦給 EBP袖外,這樣 EBP 中的地址就是進入本函數(shù)時的棧頂?shù)刂肥仿。@一地址上面(地址值遞減方向)的空間便是這個函數(shù)將要使用棧空間曼验,它下面(地址值遞增方向)是父函數(shù)使用的空間泌射。如此設(shè)置 EBP 后,便可以使用 EBP 加正數(shù)偏移來引用父函數(shù)的內(nèi)容鬓照,使用 EBP 加負數(shù)便宜來引用本函數(shù)的局部變量魄幕,比如 EBP+4 指向的是 CALL 指令壓入的函數(shù)返回地址;EBP+8 是父函數(shù)壓在棧上的第一個參數(shù)颖杏,EBP+0xC 是第二個參數(shù)纯陨,一次類推;EBP-n 是第一個局部變量的起始地址(n 為變量的長度)。

因為在將棧頂?shù)刂罚‥SP)賦給 EBP 寄存器之前先把舊的 EBP 值保存在棧中留储,所以 EBP 寄存器所指向的棧單元中保存的是前一個 EBP 寄存器的值翼抠,這通常也就是父函數(shù)的 EBP 的值。類似的父函數(shù)的 EBP 所指向的棧單元中保存的是更上一層函數(shù)的 EBP 值获讳,以此類推阴颖,直到當(dāng)前線程的最頂層函數(shù)。這也正是椮はィ回溯的基本原理量愧。

links

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帅矗,隨后出現(xiàn)的幾起案子偎肃,更是在濱河造成了極大的恐慌,老刑警劉巖浑此,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累颂,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機紊馏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門料饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朱监,你說我怎么就攤上這事岸啡。” “怎么了赫编?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵凰狞,是天一觀的道長。 經(jīng)常有香客問我沛慢,道長赡若,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任团甲,我火速辦了婚禮逾冬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躺苦。我一直安慰自己身腻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布匹厘。 她就那樣靜靜地躺著嘀趟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愈诚。 梳的紋絲不亂的頭發(fā)上她按,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音炕柔,去河邊找鬼酌泰。 笑死,一個胖子當(dāng)著我的面吹牛匕累,可吹牛的內(nèi)容都是我干的陵刹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欢嘿,長吁一口氣:“原來是場噩夢啊……” “哼衰琐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炼蹦,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡宙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后框弛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辛辨,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捕捂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年瑟枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了斗搞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慷妙,死狀恐怖僻焚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膝擂,我是刑警寧澤虑啤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站架馋,受9級特大地震影響狞山,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叉寂,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一萍启、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屏鳍,春花似錦勘纯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至山涡,卻和暖如春堤结,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸭丛。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工霍殴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人系吩。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓来庭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穿挨。 傳聞我的和親對象是個殘疾皇子月弛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,610評論 1 19
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記章母,在此感謝他和像他一樣...
    Gibbs基閱讀 37,210評論 8 114
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,813評論 0 27
  • 文/路人鋒 什么是對的翩剪?什么是錯的乳怎? 我只知道: 黑夜從來沒有月亮光明月亮從來沒有玫瑰熱情玫瑰從來沒有百靈動聽百靈...
    路人鋒閱讀 304評論 16 19
  • 俗不知,學(xué)一個工具首先需要知道它可以解決什么問題……然后不假思索的靈活的運用到我們的項目中mycat官網(wǎng):http...
    goodchax閱讀 1,543評論 0 1