反彙編 函式巢狀呼叫

2022-03-13 22:48:06 字數 4657 閱讀 1862

實現的功能:兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回

004010e8  |.  6a 03         push 3                                   ;  壓入3

004010ea |. 6a 02 push 2 ; 壓入2

004010ec |. 6a 01 push 1 ; 壓入1

004010ee |. e8 12ffffff call stackdem.00401005 ; 壓入call位址+指令長度,再呼叫call

004010f3 |. 83c4 0c add esp,0c ; 外平棧

004010f6 |. 33c0 xor eax,eax ; 清空eax

進入00401005 call

00401070  /> \55            push ebp                                 ;  儲存ebp

00401071 |. 8bec mov ebp,esp ; 提公升棧底

00401073 |. 83ec 48 sub esp,48 ; 提公升棧頂

00401076 |. 53 push ebx ; 壓入ebx

00401077 |. 56 push esi ; 壓入esi

00401078 |. 57 push edi ; 壓入edi

00401079 |. 8d7d b8 lea edi,dword ptr ss:[ebp-48] ; 提公升棧頂的低位址賦值給edi

0040107c |. b9 12000000 mov ecx,12 ; ecx 為 0x12

00401081 |. b8 cccccccc mov eax,cccccccc ; eax 為 0xcccccccc

00401086 |. f3:ab rep stos dword ptr es:[edi] ; 將eax的值賦值給 之前提公升的棧頂和棧底之間的值

00401088 |. c745 fc 02000>mov dword ptr ss:[ebp-4],2 ; 給初始化中的第乙個位址賦值為2

0040108f |. 8b45 0c mov eax,dword ptr ss:[ebp+c] ; 將壓入的第乙個引數的值 賦值 給eax

00401092 |. 50 push eax ; 壓入 第乙個引數的值

00401093 |. 8b4d 08 mov ecx,dword ptr ss:[ebp+8] ; 將壓入的第二個引數的值 賦值 給eax

00401096 |. 51 push ecx ; 壓入 第二個引數的值

00401097 |. e8 6effffff call stackdem.0040100a

0040109c |. 83c4 08 add esp,8 ; 恢復入call之前的棧頂

0040109f |. 8945 f8 mov dword ptr ss:[ebp-8],eax ; 把上面的call返回值 賦值給這個call中處理的第二個引數

004010a2 |. 8b45 fc mov eax,dword ptr ss:[ebp-4] ; 把子call中的引數賦值給當前eax

004010a5 |. 0345 f8 add eax,dword ptr ss:[ebp-8] ; 上面兩個值相加

004010a8 |. 0345 10 add eax,dword ptr ss:[ebp+10] ; 上面兩個值相加完之後再加上這個call中壓入的第乙個引數

004010ab |. 5f pop edi

004010ac |. 5e pop esi

004010ad |. 5b pop ebx

004010ae |. 83c4 48 add esp,48 ; 恢復剛入call之前的棧頂

004010b1 |. 3bec cmp ebp,esp ; 比較棧頂和棧底是否相等

004010b3 |. e8 68000000 call stackdem.00401120 ; 檢查堆疊平衡

004010b8 |. 8be5 mov esp,ebp ; 把剛入call的時候堆疊中的棧底賦值給棧頂

004010ba |. 5d pop ebp ; 恢復入call之前的棧底

進入0040100a

00401030  /> \55            push ebp                                 ;  壓入ebp

00401031 |. 8bec mov ebp,esp

00401033 |. 83ec 44 sub esp,44

00401036 |. 53 push ebx

00401037 |. 56 push esi

00401038 |. 57 push edi

00401039 |. 8d7d bc lea edi,dword ptr ss:[ebp-44]

0040103c |. b9 11000000 mov ecx,11

00401041 |. b8 cccccccc mov eax,cccccccc

00401046 |. f3:ab rep stos dword ptr es:[edi] ; 初始化垃圾資料

00401048 |. c745 fc 0a000>mov dword ptr ss:[ebp-4],0a ; 初始化的第乙個資料 賦值為0x0a

0040104f |. 8b45 08 mov eax,dword ptr ss:[ebp+8] ; 把壓入的第二個引數的值 賦值給eax

00401052 |. 0345 0c add eax,dword ptr ss:[ebp+c] ; 把壓入的第乙個引數的值 新增給eax

00401055 |. 0345 fc add eax,dword ptr ss:[ebp-4] ; 把初始化的第乙個資料 加給 eax

反彙編之簡單函式呼叫

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

反彙編深入分析函式呼叫

函式 int fun inta,intb int main f11 跟蹤到fun,alt 8 看反彙編 00401078push1100h 引數壓棧,這裡遵循 cdecl 呼叫規範,引數由右向左 0040107d push8899h 壓棧 00401082call ilt 0 fun 0040100...

通過VC學習反彙編 函式呼叫 呼叫約定

呼叫約定決定了以下內容 函式引數的壓棧順序 由呼叫者還是被呼叫者平衡堆疊。3.1 cdecl cdecl是c和c 程式的預設呼叫約定 引數通過堆疊來傳遞,從右向左依次入棧,由呼叫者平衡堆疊。同樣的 我們在addint函式前面加上 cdecl呼叫約定 int cdecl addint int a,in...