?

Sep 11 2016

逆向工程學習第一天--一個VC6編譯的小程序

首頁 » 滲透測試 » 逆向工程學習第一天--一個VC6編譯的小程序   

今天開始研究二進制了,開個文記錄一下。下面是一個小程序的OD反匯編代碼,自己嘗試加了注釋,本人逆向零基礎,屬于摸著石頭過河的類型,有理解錯誤的地方,希望大牛不吝賜教。

源代碼:

#include<stdio.h>

#include<string.h>

char name[] = "37000011111";

int main()

{

char output[8];

strcpy(output, name);

for(int i=0;i<8&&output[i];i++)

printf("\0x%x",output[i]);

return 0;

}

匯編代碼:

00401000  /$  83EC 08       sub esp,0x8 //為output字符數組在棧上分配空間,以dword為單位進行分配。

00401003  |.  83C9 FF       or ecx,-0x1  //ecx設為0xFFFFFFFF準備存放字符長度。

00401006  |.  33C0          xor eax,eax  //eax清零

00401008  |.  8D5424 00     lea edx,dword ptr ss:[esp] //把output字符數組的首地址賦值給edx。

0040100C  |.  56            push esi

0040100D  |.  57            push edi

0040100E  |.  BF 30604000   mov edi,9_22.00406030 //把字符串常量的首地址賦值給edi。

00401013  |.  F2:AE         repne scas byte ptr es:[edi] //掃描edi指向的字符串是否等于al,當前al為0x00,同時累加edi和ecx。

00401015  |.  F7D1          not ecx  //ecx取反得到字符串長度。

00401017  |.  2BF9          sub edi,ecx //把edi恢復至原位,即字符串常量首地址。

00401019  |.  8BC1          mov eax,ecx //把字符串長度賦值給eax,因為下面要用ecx來控制循環。

0040101B  |.  8BF7          mov esi,edi  //把字符串常量首地址(源字符串)賦值給esi。

0040101D  |.  8BFA          mov edi,edx  //把output字符數組的首地址(目標字符串)賦值給edi。

0040101F  |.  C1E9 02       shr ecx,0x2 //修改循環計數的值,因為以DWORD為單位進行復制,所以先復制整的,剩下的不足4字節的零頭再以BYTE為單位復制。

00401022  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds:[esi] //開始復制,循環2次。

00401024  |.  8BC8          mov ecx,eax //把字符串長度還給ecx。

00401026  |.  83E1 03       and ecx,0x3 //計算零頭個數,相當于除以4取余數。

00401029  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[esi] //復制零頭

0040102B  |.  33F6          xor esi,esi //清零esi

0040102D  |>  8A4434 08     /mov al,byte ptr ss:[esp+esi+0x8]  //這里開始循環調用printf函數了,首先把al定位至output首個字符。

00401031  |.  84C0          |test al,al //測試該字符是否為0x00.

00401033  |.  74 17         |je short 9_22.0040104C //如果為0則跳至printf下面的語句。

00401035  |.  0FBEC8        |movsx ecx,al //把al的值傳遞給ecx,因為源和目的操作數不等長,所以此處用movsx進行帶符號擴展。

00401038  |.  51            |push ecx //把ecx入棧,準備函數調用,ecx為字符的ascii碼。

00401039  |.  68 44604000   |push 9_22.00406044 //把格式字符串"\0x%x"入棧,此處可以看出函數參數由右向左入棧。

0040103E  |.  E8 1D000000   |call 9_22.00401060 //調用printf函數。

00401043  |.  83C4 08       |add esp,0x8 //調用函數之后恢復堆棧。

00401046  |.  46            |inc esi //遞增指向output的指針。

00401047  |.  83FE 08       |cmp esi,0x8 //0x8為output的長度,判斷是否把output中的字符已經全部輸出。

0040104A  |.^ 7C E1         \jl short 9_22.0040102D //如果小于0x8,繼續循環。

0040104C  |>  5F            pop edi    //恢復現場,和前面的push edi對應。

0040104D  |.  33C0          xor eax,eax  //eax清零,準備main函數的返回值。

0040104F  |.  5E            pop esi    //恢復現場,和前面的push edi對應。

00401050  |.  83C4 08       add esp,0x8  //main函數恢復堆棧平衡,這里是被調用者恢復,前面的printf是調用者恢復,為__cdecl方式,此處為__stdcall方式。

00401053  \.  C3            retn //退出main函數,返回啟動函數。

 

 

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: 逆向學習

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «逆向工程學習第二天--動手開發自己的第一個shellcode | 分享一款失敗的國產加密勒索軟件»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖