一个简单函数的反汇编分析
利用visual studio的反匯編功能,可以看到函數調用的匯編語言。
一個簡單函數的反匯編分析
int?__stdcall?add(int?a,?int?b,?int?c)
{
00FD13C0??push???????????ebp????????????????????????????ebp入棧
00FD13C1??mov???????????ebp,esp??????????????????????esp賦值給ebp
00FD13C3??sub????????????esp,0C0h????????????????????增加0c0h棧空間(棧空間地址向下增長)
00FD13C9??push??????????ebx?????????????????
00FD13CA??push??????????esi??
00FD13CB??push??????????edi???????????????????????????????ebx,esi,edi先后入棧
00FD13CC??lea?????????????edi,[ebp-0C0h]????????????ebp?-?0c0h的值賦給edi
00FD13D2??mov??????????ecx,30h??????????????????????30h賦值給ecx
00FD13D7??mov??????????eax,0CCCCCCCCh??????cccccccc賦值給eax
00FD13DC??rep?stos????dword?ptr?es:[edi]????????從edi開始給每個雙字地址賦值為eax,重復ecx次
上面做的實際上是調用函數以及初始化這個函數的棧的準備工作
棧的空間為0c0h?=?192?字節,ebp-0c0h實際上就是esp的地址了,即棧頂指針
ecx?=?30h?=?48,stos從這個棧頂位置開始給每個雙字賦值0cccccccch,重復48次,注意stos重復的時候地址的增長方向
如果設置了direction?flag,?那么edi會在該指令執行后減小,?如果沒有設置direction?flag,?那么edi的值會增加,?這是為了下一次的存儲做準備.
48?*?4?剛好為192字節,即把整個棧空間初始化為0cccccccch
????return?a?+?b?+?c;
00FD13DE??mov???????eax,dword?ptr?[a]??
00FD13E1??add?????????eax,dword?ptr?[b]??
00FD13E4??add?????????eax,dword?ptr?[c]??
}
00FD13E7??pop????????edi????????????????
00FD13E8??pop????????esi??
00FD13E9??pop????????ebx?????????????????edi,esi,ebx出棧,注意和入棧的順序相反
00FD13EA??mov???????esp,ebp???????????恢復esp
00FD13EC??pop????????ebp?????????????????
00FD13ED??ret?????????0Ch?????????????????恢復棧指針?0ch即12,是3個int參數的棧空間占用,__stdcall調用約定規定函數自己恢復棧指針
最后一條指令相當于add?esp,0Ch
如果將調用約定改成__fastcall可以觀察到函數調用的地方有所改變
002E143E??push?????????3??
002E1440??mov?????????edx,2??
002E1445??mov?????????ecx,1??
002E144A??call???????????add?(2E1131h)?
如上所示,在傳遞參數的時候用到了兩個寄存器。這是__fastcall?和__stdcall的不同之處
同樣,因為棧中只放了一個參數,所以__fastcall在函數返回之處?ret?4
對于__cdecl調用約定函數調用的反匯編如下:
000E142E??push????????3??
000E1430??push????????2??
000E1432??push????????1??
000E1434??call??????????add?(0E114Fh)??
000E1439??add?????????esp,0Ch?
很明顯。與__stdcall相比他在調用add完了之后多了個add?esp?0ch,還記得這個是啥吧?
也就是說__cdecl的棧需由調用者自己恢復。__fastcall和__stdcall則是被調用者恢復
轉載于:https://my.oschina.net/liangzhenghui/blog/145995
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的一个简单函数的反汇编分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装虚拟机 Network boot f
- 下一篇: 用类求总分和平均分