(繼上)這種間接呼叫的方式要比前面看到的直接呼叫方式麻煩很多。來看乙個複雜一點的例子:
#include void function0()
void function1()
int main()
return 0;
}
這段函式定義了兩個函式function1()和function2(),兩個函式都是空的,只有乙個返回語句。在主函式定義了乙個int型的陣列,大小為2,並分別給他們賦於函function1()function2()位址,再定義乙個函式指標f,使用乙個for迴圈,分別獲取儲存在fn陣列裡的函式function1()和function2()位址並呼叫。編譯後使用ida分析:
.text:00401010 push ebp
.text:00401011 mov ebp, esp
.text:00401013 sub esp, 10h
這裡給整型陣列fn、函式指標f、迴圈變數i開闢儲存空間。
.text:00401016 mov [ebp+fn], offset ?function1@@yaxxz ; function1(void)
.text:0040101d mov [ebp+fn+4], offset ?function1@@yaxxz ; function1(void)
獲取兩個函式的位址放到陣列fn中。
.text:00401024 mov [ebp+i], 0
.text:0040102b jmp short loc_401036
.text:0040102d mov eax, [ebp+i]
.text:00401030 add eax, 1
.text:00401033 mov [ebp+i], eax
.text:00401036 cmp [ebp+i], 2
.text:0040103a jge short loc_40104b
.text:0040103c mov ecx, [ebp+i]
.text:0040103f mov edx, [ebp+ecx*4+fn]
.text:00401043 mov [ebp+f], edx
.text:00401046 call [ebp+f]
.text:00401049 jmp short loc_40102d
這裡是迴圈體的**,首先給迴圈變數賦初值0,然後跳轉到0x00401036把迴圈變數和2進行比較,如果大於等於2則跳出迴圈體;如果小於2則不執行跳轉,取變數fn[i]中的資料,賦值給函式指標f,通過函式指標f呼叫函式,最後跳回迴圈頭部
.text:0040104b xor eax, eax
.text:0040104d mov esp, ebp
.text:0040104f pop ebp
.text:00401050 retn
《軟體除錯分析技術》學習筆記(一)
今天開始寫寫一些心得體驗。軟體除錯分析技術 是好友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...