不說廢話,上來高階語言c++的源**
int _tmain(int argc, _tchar* argv)
; for(int i=0;i<3;i++)
}
反彙編之後如下:
.text:004010a0 ; int __cdecl wmain(int argc, wchar_t **argv)
.text:004010a0 _wmain proc near ; code xref: __tmaincrtstartup+11dp
.text:004010a0
.text:004010a0 a = dword ptr -10h
.text:004010a0 var_4 = dword ptr -4
.text:004010a0 argc = dword ptr 8
.text:004010a0 argv = dword ptr 0ch
.text:004010a0
.text:004010a0 push ebp
.text:004010a1 mov ebp, esp
.text:004010a3 sub esp, 10h
.text:004010a6 mov eax, ___security_cookie
.text:004010ab xor eax, ebp ; cookie
.text:004010ad mov [ebp+var_4], eax
.text:004010b0 push esi
.text:004010b1 mov [ebp+a], offset ?test@@yahxz ; test(void)
.text:004010b8 mov [ebp+a+4], offset ?test1@@yahxz ; test1(void)
.text:004010bf mov [ebp+a+8], offset ?test2@@yahxz ; test2(void)
.text:004010c6 xor esi, esi
.text:004010c8
.text:004010c8 loc_4010c8: ; code xref: _wmain+32j
.text:004010c8 mov eax, [ebp+esi*4+a]
.text:004010cc call eax
.text:004010ce inc esi
.text:004010cf cmp esi, 3
.text:004010d2 jl short loc_4010c8
.text:004010d4 mov ecx, [ebp+var_4]
.text:004010d7 xor ecx, ebp
.text:004010d9 xor eax, eax
.text:004010db pop esi
.text:004010dc call @__security_check_cookie@4 ; __security_check_cookie(x)
.text:004010e1 mov esp, ebp
.text:004010e3 pop ebp
.text:004010e4 retn
.text:004010e4 _wmain endp
不用考慮,test,test1和test2函式的具體實現,以上彙編**在ida中得出,在
.text:004010a0 a = dword ptr -10h
可以看到這是乙個區域性變數,陣列指標,指向test,test1和test2的函式位址
ebp中存放的是主函式的起始位址,而a中的元素是int型,也就是4個位元組,所以在
.text:004010b8 mov [ebp+a+4], offset ?test1@@yahxz ; test1(void)
中進行的是+4或者+8的操作ebp是主函式的起始位址a是陣列的起始位址,在其中每個元素佔據記憶體是4個位元組,所以將這三個函式位址放在以a為起始位址的陣列當中是
.text:004010b1 mov [ebp+a], offset ?test@@yahxz ; test(void)
.text:004010b8 mov [ebp+a+4], offset ?test1@@yahxz ; test1(void)
.text:004010bf mov [ebp+a+8], offset ?test2@@yahxz ; test2(void)
呼叫這三個函式則是只需要將三個函式的位址放在乙個通用暫存器中然後call eax即可(這是最簡單的無引數的呼叫,嗯有引數的應該也類似,只是筆者還沒有學習到...)
另外還有就是
.text:004010a3 sub esp, 10h
這一句將棧頂指標向上移動了10h個位置,其實就是為區域性變數開闢的棧空間,esi佔據乙個,a陣列佔據3個,也就是一共四個,即0x10h
反彙編 函式指標
函式指標的定義 返回型別 呼叫約定 變數名 引數列表 例如 int cdecl myfun int,int 一般都用來呼叫非本身程式提供的函式來進行使用 如下 includeint main 反彙編如下 5 int cdecl myfun int,int 6 7 int i 10 00401028 ...
函式指標呼叫和直接函式呼叫的反彙編對比
本文主要從x86彙編一級來檢視函式呼叫和函式指標呼叫函式的差別。具體看如下的兩個函式 void show void showdata int a 下面是兩者彙編 對比 18 show 00411aae e8 3d f6 ff ff call show 4110f0h 19 20 void ptrsh...
反彙編 函式巢狀呼叫
實現的功能 兩層函式呼叫,外層函式的傳入的兩個引數再傳到子函式中相加,實現四個數相加返回 004010e8 6a 03 push 3 壓入3 004010ea 6a 02 push 2 壓入2 004010ec 6a 01 push 1 壓入1 004010ee e8 12ffffff call s...