反彙編深入分析函式呼叫

2021-04-06 17:39:01 字數 1338 閱讀 1296

函式:

int

fun(

inta,

intb)

int

main()

f11

跟蹤到fun,alt+8

看反彙編**:

00401078push1100h

//引數壓棧,這裡遵循

__cdecl

呼叫規範,引數由右向左

0040107d

push8899h

//壓棧

00401082call@ilt+0(_fun) (00401005)

00401087

addesp,8

//被呼叫函式的堆疊由主調函式來清空

由上圖的

eip可以看到

0040b500

就是下條要執行的指令,在

memory

視窗中可以看到記憶體資料

99880000

和11000000,

實質上是

0x8899,0x1100,(intel

處理器一般都是小端儲存

),還可以看到有記憶體資料

87104000

,實質上是

00401087

,在主調函式中,可以很清楚的看到

00401087

被調函式返回以後執行的第一條指令,也就是堆疊清空指令(遵循

__cdecl

呼叫規範)。

call

指令隱含做了乙個操作:就是把函式返回後執行的第一條指令壓入堆疊。

1:int fun(int a, int b)

0040b

54a

popedi

0040b54bpopesi

0040b

54c

popebx //

彈棧0040b54dmovesp,ebp

0040b

54f

popebp//

恢復ebp

暫存器0040b550ret//

預設操作,恢復

eip:將堆疊中的

00401087

pop給

eip

執行完:

0040b50bpushedi

如下圖:

esp

:0012fe58

與剛進入函式的時候的

esp:

0012ff28

之間的堆疊圖如下:

執行完:

0040b

51c

rep stosdword ptr [edi]

後edi

為:0012ff24

,如下圖:

反彙編 函式巢狀呼叫

實現的功能 兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回 004010e8 6a 03 push 3 壓入3 004010ea 6a 02 push 2 壓入2 004010ec 6a 01 push 1 壓入1 004010ee e8 12ffffff call s...

C 函式呼叫過程深入分析

0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...

C 函式呼叫過程深入分析

0.引言 首先對三個常用的暫存器做一下說明,eip是指令指標,即指向下一條即將執行的指令的位址 ebp為基址指標,常用來指向棧底 esp為棧指標,常用來指向棧頂。看下面這個簡單的程式並在vc 6.0中檢視並分析彙編 圖11.函式呼叫 g func函式呼叫的彙編 如圖2 圖2首先是三條push指令,分...