乙個簡單函式的反彙編

2021-06-13 03:05:26 字數 1196 閱讀 5183

void myfunction(int a,int b)

int c=a+b;

(1)儲存ebp。ebp總是被我們用來儲存這個函式執行前的esp的值。執行完畢後,我們用ebp恢復esp;同時,呼叫此函式的上層函式也用ebp做同樣的事情。所以先把ebp壓入堆疊,返回之前彈出,避免ebp被我們改動。

push ebp

(2)儲存esp到ebp中。

;儲存ebp並把esp放入ebp中,此時ebp與esp同,都是這次函式呼叫時的棧頂

mov ebp,esp

(3)在堆疊中騰出區域來儲存區域性變數。

方法是:把esp減少乙個數值,這就等於壓入了一堆變數。要恢復時,只要把esp恢復成ebp中儲存的資料就可以了。

儲存ebx,esi,edi到堆疊中。函式呼叫後恢復。

sub esp,0cch

push ebx

push esi

push edi

(4)把區域性變數初始化成全0cccccccch。0cch實際是int 3指令的機器碼,是乙個斷點中斷指令。因為區域性變數不可能被執行,如果執行了,必然程式有錯

,這時發生中斷來提示開發者。這是vc編譯debug版本的特有操作。

lea edi,[ebp-0cch]            ;本來是要mov edi,ebp-0cch,但是mov不支援ebp-0cch這樣的引數。所以對ebp-0cch取內容,而

;lea把內容的位址也就是ebp-0cch載入到edi中。目的是把儲存區域性變數的區域(從ebp-0cch開始的區域)初始化成全部0cccccccch

mov ecx,33h

mov eax,0cccccccch

rep stos dword ptr [edi]   ;串寫入

(5)然後做函式裡應該做的事。引數的獲取是ebp+12位元組為第二個引數,ebp+8為第乙個引數(注意倒序壓入),依次增加。最後ebp+4位元組處是要返回的位址。

(6)恢復ebx,esi,edi,esp,ebp,最後返回。**如下:

pop edi                    ;恢復edi,esi,ebx

pop esi

pop ebx

mov esp,ebp    ;恢復原來的ebp和esp,讓上乙個呼叫的函式正常使用

pop ebp

ret另外,該函式沒有返回值。如果要返回值,函式應該在返回之前,把返回值放入eax中,外部通過eax獲得返回值。

objdump 反彙編乙個函式的指令碼

1 使用system.map檔案查詢函式的起始位址和結束位址 2 使用objdump d 反彙編,然後通過 start address和 stop address引數指定函式區間 3 使用nm n out.elf system.map 命令生成system.map檔案 bin sh routine ...

C 反彙編揭秘1 乙個簡單的C 程式反彙編解析

本系列主要從彙編角度研究c 語言機制和彙編的對應關係。第一篇自然應該從最簡單的開始。c 的源 如下 class my class void method int n my class private int m member int tmain int argc,tchar argv 可以直接deb...

反彙編之簡單函式呼叫

簡單的函式呼叫,通過反彙編可以清楚了解 舉例 include int add int a,int b int main void 這是乙個簡單的通過呼叫函式計算兩數之和的程式 vc6.0生成的彙編 如下 ebp 棧低 高位址 esp 棧頂 低位址 add函式 push ebp ebp 1000 es...