實驗環境:WIN7虛擬機
軟體:VC6
首先在VC6里面寫一個空函式Fun();

F7編譯運行一下,沒有出錯,接著在函式處使用F9下斷點,使程式運行到Fun函式時停下,

接著F5開始運行這個程式

程式停在了Fun函式處,反匯編進去進行逆向分析

可以看到程式停在Fun函式的入口處,這里的call就是Fun函式的入口,F11跟進去進行分析,
原始堆疊圖是這樣的,

0040D408 call @ILT+5(_Fun) (0040100a)
F11,跟進這個call進行分析,進入函式之后編譯器會將跳出函式之后下一個要執行的地址壓入堆疊,即將0040D40D壓入堆疊,同時esp-4,esp變成0012FEF8,這時的堆疊是這樣的:

跟進來之后是一個jmp,F11直接跳轉,

現在進到函式里面了

00401010 push ebp
首先將ebp壓堆疊,就是將[ebp]壓入堆疊,即將0012FF48壓入堆疊,然后esp的位置向上提升一個變為0012FEF4,

查看檢查暫存器進行驗證:

00401011 mov ebp,esp
將esp的值賦給ebp,也就是將0012FEF4賦給ebp,這時的堆疊圖是這樣的

查看暫存器驗證,這里可以看到esp和ebp的值相等,說明上面那個堆疊圖沒有問題

00401013 sub esp,40h
將esp減去40h,也就是將esp的位置提升到0012FEB4位置,這一步的作用是提升堆疊,這時的堆疊圖是這樣的

查看暫存器進行驗證,看到esp的值為0012FEB4

00401016 push ebx
接著將ebx壓堆疊,查看堆疊頂可以看到ebx被壓入堆疊,同時esp的位置向上提升,

此時的堆疊是這樣的:

00401017 push esi
將esi的值壓入堆疊,此時的堆疊是這樣的

查看暫存器進行驗證:

00401018 push edi
接著將edi的值壓入堆疊,此時的堆疊是這樣的

查看暫存器驗證:

00401019 lea edi,[ebp-40h]
將[ebp-40h]的地址存入edi中,也就是將0012FEB4存入edi,
查看暫存器驗證,可以看到0012FEB4被存入edi中

0040101C mov ecx,10h
將10h存入ecx中,也就是將00000010存入ecx,查看暫存器驗證:

00401021 mov eax,0CCCCCCCCh
將CCCCCCCC存入eax中,查看暫存器驗證:

00401026 rep stos dword ptr [edi]
將eax的中的值存盤到[edi]對應地址的記憶體中,并重復ecx次,也就是將CCCCCCCC存入地址0012FEB4對應的記憶體中,并重復10h次,rep每執行一次,[edi]會相應的加4(向下填充數值),ecx會相應的減4(減少執行次數),
此時的堆疊是這樣的:

查看暫存器驗證一下,發現從0012FEF4到0012FEB4全部被填充為CCCCCCCC,

00401028 pop edi
將edi出堆疊,也就是將esp當前對應的值0012FF48賦給edi,同時esp加4變成0012FEAC,此時的堆疊

查看暫存器驗證:

00401029 pop esi
將esi出堆疊,也就是將esp當前對應的值00000000賦給edi,同時esp加4變成0012FEB0,此時的堆疊

查看暫存器驗證:

0040102A pop ebx
將ebx出堆疊,也就是將esp當前對應的值7FFDD000賦給ebx,同時esp加4變成0012FEB4,此時的堆疊

查看暫存器驗證一下:

0040102B mov esp,ebp
將ebp的值賦給esp,這里的作用相當于降低堆疊,此時的堆疊是這樣的

查看暫存器進行驗證,esp的值和ebp的值相等

0040102D pop ebp
將ebp出堆疊,也就是將esp當前對應的值0012FF48賦給ebx,這時ebx又回到了一開始所在的位置,同時esp加4變成0012FEF8,此時的堆疊是這樣的

查看暫存器驗證一下

0040102E C3 ret
相當于pop eip,即將當前esp對應的值放入eip中,也就是將0040D40D放入eip中,同時ESP+4,esp變為0012FEFC,此時的堆疊是這樣的

查看暫存器驗證一下,至此堆疊恢復平衡,Fun函式執行完畢

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69209.html
標籤:C
上一篇:使用Dev C++5.1.1 scanf輸入多個值的問題
下一篇:c語言請教大佬
