《軟體除錯分析技術》學習筆記(十二)

2021-06-04 21:39:23 字數 2233 閱讀 4382

引數和返回值是函式的兩個重要組成部分,可以通過引數向函式傳入資訊,通過返回值使函式傳出資訊。看一段c語言**: 

#include int function(int a, int b) 

else

} int main()

這裡定義了乙個函式function(),引數是兩個整型變數,返回值也是整型變數,當a的值大於b時返回a,否則返回b,很明顯這個函式返回的是兩個數中的較大數,然後在主函式中呼叫了這個函式,引數分別為1、2。編譯後使用ida進行分析,主函式的反彙編**如下:

.text:00401020    push    ebp 

.text:00401021 mov ebp, esp

.text:00401023 push 2 ; b

.text:00401025 push 1 ; a

.text:00401027 call ?function@@yahhh@z ; function(int,int)

這裡向棧中壓入資料2和1,然後呼叫函式function(int,int)。可以猜想這樣向堆疊裡壓入2和1就是在給被呼叫的過程傳遞引數了。這裡要注意,傳遞引數的時候是反著來的,c語言裡呼叫的時候是function(1, 2),等到反彙編的時候就變成先壓入2,再壓入1這樣的了。 

text:0040102c    add     esp, 8 

這一句**用來抬高棧頂,抬高棧頂是為了平衡棧楨,前面為了給被呼叫過程傳遞引數向棧中壓入了兩個四位元組的int型變數,這裡把棧頂抬高八個位元組就是為了銷毀傳遞引數的痕跡。

.text:0040102f    xor     eax, eax 

.text:00401031 pop ebp

.text:00401032 retn

下面是function()函式在ida中的分析結果:

.text:00401000 ; attributes: bp-based frame 

.text:00401000

.text:00401000 ; int __cdecl function(int a, int b)

.text:00401000 ?function@@yahhh@z proc near ; code xref: _main+7 p

.text:00401000

.text:00401000 a = dword ptr 8

.text:00401000 b = dword ptr 0ch

.text:00401000

這裡是對function()函式的引數、返回值、呼叫方式等資訊的分析。這裡說明了function()函式的呼叫方式為__cdecl,返回值是int型,兩個引數a、b與ebp對應的偏移分別為0x08和0x0c。

.text:00401000    push    ebp 

.text:00401001 mov ebp, esp

.text:00401003 mov eax, [ebp+a]

.text:00401006 cmp eax, [ebp+b]

.text:00401009 jle short loc_401012

.text:0040100b mov eax, [ebp+a]

.text:0040100e jmp short loc_401015

.text:00401010 jmp short loc_401015

.text:00401012 mov eax, [ebp+b]

.text:00401015 pop ebp

.text:00401016 retn

.text:00401016 ?function@@yahhh@z endp

一般來說過程返回的結果都是儲存在eax裡的。這個函式比較兩個引數a、b,如果引數a大於引數b則把引數a放到eax,跳到最後返回,如果引數a不大於引數b則把引數b放到eax中返回。 

《軟體除錯分析技術》學習筆記(一)

今天開始寫寫一些心得體驗。軟體除錯分析技術 是好友monster的 作品。作為一直以的好夥伴,他是我看著長大的,嘻嘻 之所以有今天這樣的成績,是與他的努力和天賦脫不了關係的。他大方地給了我pdf版的,我也大方的給了我們全班。但我們班有同學說,這是撒子呦,看不看不懂 我決心寫一些學習筆記,和我班的同學...

《軟體除錯分析技術》學習筆記(二)

1.暫存器 暫存器m講的比較透徹。暫存器是 處理器cpu的組成部分,是有限存貯容量的高速存貯部件,它們可用來暫存指 令 資料和位址,是記憶體階層中的最頂端,也是系統獲得操作資料的最快速途徑。1.1資料暫存器 資料暫存器主要用來儲存運算元和運算結果等資訊,從而節省讀取運算元所需占用匯流排和訪問 儲存器...

《軟體除錯分析技術》學習筆記(三)

m給出乙個c程式 include include int a int main 這段 定義了乙個整型全域性變數a,在主函式main 中定義了乙個整型區域性變數b和乙個整形指標變數c,然後呼叫malloc 函式申請大小為1個整形變數的記憶體並把申請到的記憶體位址賦值給指標變數c,再依次給變數a b和c...