詳解C++代碼反匯編后的堆棧寄存器EBP和ESP


 

詳解C++代碼反匯編后的堆棧寄存器EBPESP

最近在分析一個進程崩潰的嚴重問題,其中有些過程分析需要對ebp, esp 有清晰的理解,對於ebp esp 相信大家都很熟悉了,但是為了使本文自成體系,我還是解釋一下。

ebp--棧底指針

esp--棧頂指針

 

 

如圖所示,簡化后的代碼調用過程如下:

void Layer02()

{

       int b = 2;

}

 

void Layer01()

{

       int a = 1;

       Layer02();

}

 

那么函數執行過程中ebpesp是如何變化的呢?如下是反匯編后的代碼:

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

我們看到函數調用開始執行如下的兩行代碼:

00413700 push        ebp 

00413701 mov         ebp,esp

 

返回前執行如下代碼:

00413728 mov         esp,ebp

0041372A pop         ebp 

0041372B ret

那么這幾行代碼到底是什么意思呢?首先,如圖上所示:

開始兩行代碼的意思是先將ebp1壓棧,然后將現在的棧頂esp1作為函數調用時的棧底,所以會執行如下語句:

00413701 mov         ebp,esp

 

那么,返回前的幾條語句又是什么意思呢?

我想大家已經猜到了,當函數調用執行結束,我們要執行相反的過程:

00413728 mov         esp,ebp

 

還原棧頂指針

 

0041372A pop         ebp 

 

還原棧底指針

 

0041372B ret

返回到函數調用前的指令繼續執行。待續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM