cpp反汇编之数组

先贴上源代码

#include<string.h>
void Show(char szBuf[])
{
	strcpy(szBuf , "Hello World");
}

char* RetArray()
{
	char szBuff[] = {"Hello World"};
	return szBuff;
}
void main()
{
	int nArray[5] = {1 , 2 , 3 , 4 , 5};
/*	int nOne = 1;
	int nwo = 2;
	int nThree = 3;
	int nFour = 4;
	int nFive = 5;
	*/
	char cChar = 'A';
	float fFloat = 1.0f;
	short sShort = 1;
	int nInt = 2;
	double dDouble = 2.0f;
	char szHello[] = "Hello World";
	char szHell[] = "Hello Worl";
	char szHello1[] = "Hello World";
	char szHelloB[20] = {0};
	Show(szHelloB);
	RetArray();
}
另一个例子

#include<stdio.h>

int main5()
{
	int arr[3][5] = { {1 , 2 , 3} , {0}};
	int nIndex = 0;
	printf("%d\n" , arr[nIndex][nIndex + 1]);
//
7:        printf("%d\n" , arr[nIndex][nIndex + 1]);
00401105   mov         eax,dword ptr [ebp-40h]
00401108   imul        eax,eax,14h
0040110B   lea         ecx,[ebp+eax-3Ch]
0040110F   mov         edx,dword ptr [ebp-40h]
00401112   mov         eax,dword ptr [ecx+edx*4+4]
00401116   push        eax
00401117   push        offset string "%d\n" (0042901c)
0040111C   call        printf (004018e0)
00401121   add         esp,8

             return 0;
}

又一个

#include<stdio.h>

int main7()
{
	char cArray[3][256] = {
		"Hello World\r\n" ,
		"This is a test\r\n" ,
		"This is the end line!\r\n"
	};
	printf(cArray[1]);
	return 0;
}

反汇编分析

1:    void main()
2:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,68h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-68h]
0040101C   mov         ecx,1Ah
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
3:        int nArray[5] = {1 , 2 , 3 , 4 , 5};
00401028   mov         dword ptr [ebp-14h],1    栈的最底部是第一个元素    从下往上
0040102F   mov         dword ptr [ebp-10h],2
00401036   mov         dword ptr [ebp-0Ch],3
0040103D   mov         dword ptr [ebp-8],4
00401044   mov         dword ptr [ebp-4],5
4:        int nOne = 1;
0040104B   mov         dword ptr [ebp-18h],1
5:        int nwo = 2;
00401052   mov         dword ptr [ebp-1Ch],2
6:        int nThree = 3;
00401059   mov         dword ptr [ebp-20h],3
7:        int nFour = 4;
00401060   mov         dword ptr [ebp-24h],4
8:        int nFive = 5;
00401067   mov         dword ptr [ebp-28h],5
9:    }
0040106E   pop         edi
0040106F   pop         esi
00401070   pop         ebx
00401071   mov         esp,ebp
00401073   pop         ebp
00401074   ret

10:       char cChar = 'A';
0040104B   mov         byte ptr [ebp-18h],41h
11:       float fFloat = 1.0f;
0040104F   mov         dword ptr [ebp-1Ch],3F800000h
12:       short sShort = 1;
00401056   mov         word ptr [ebp-20h],offset main+4Ah (0040105a)
13:       int nInt = 2;
0040105C   mov         dword ptr [ebp-24h],2
14:       double dDouble = 2.0f;
00401063   mov         dword ptr [ebp-2Ch],0
0040106A   mov         dword ptr [ebp-28h],40000000h


15:       char szHello[] = "Hello World";
004106F7   mov         eax,[string "Hello World" (00426ef4)]
004106FC   mov         dword ptr [ebp-38h],eax
004106FF   mov         ecx,dword ptr [string "Hello World"+4 (00426ef8)]
00410705   mov         dword ptr [ebp-34h],ecx
00410708   mov         edx,dword ptr [string "Hello World"+8 (00426efc)]
0041070E   mov         dword ptr [ebp-30h],edx
16:       char szHell[] = "Hello Worl";
00410711   mov         eax,[string "Hello Worl" (00426ee8)]
00410716   mov         dword ptr [ebp-44h],eax
00410719   mov         ecx,dword ptr [string "Hello Worl"+4 (00426eec)]
0041071F   mov         dword ptr [ebp-40h],ecx
00410722   mov         dx,word ptr [string "Hello Worl"+8 (00426ef0)]
00410729   mov         word ptr [ebp-3Ch],dx
0041072D   mov         al,[string "Hello Worl"+0Ah (00426ef2)]
00410732   mov         byte ptr [ebp-3Ah],al
17:       char szHello1[] = "Hello World";
00410735   mov         ecx,dword ptr [string "Hello World" (00426ef4)]
0041073B   mov         dword ptr [ebp-50h],ecx
0041073E   mov         edx,dword ptr [string "Hello World"+4 (00426ef8)]
00410744   mov         dword ptr [ebp-4Ch],edx
00410747   mov         eax,[string "Hello World"+8 (00426efc)]
0041074C   mov         dword ptr [ebp-48h],eax


2:    void Show(char szBuf[])
3:    {
00410690   push        ebp
00410691   mov         ebp,esp
00410693   sub         esp,40h
00410696   push        ebx
00410697   push        esi
00410698   push        edi
00410699   lea         edi,[ebp-40h]
0041069C   mov         ecx,10h
004106A1   mov         eax,0CCCCCCCCh
004106A6   rep stos    dword ptr [edi]
4:        strcpy(szBuf , "Hello World");
004106A8   push        offset string "Hello World" (00426ee8)
004106AD   mov         eax,dword ptr [ebp+8]
004106B0   push        eax
004106B1   call        strcpy (004041a0)
004106B6   add         esp,8
5:    }
004106B9   pop         edi
004106BA   pop         esi
004106BB   pop         ebx
004106BC   add         esp,40h
004106BF   cmp         ebp,esp
004106C1   call        __chkesp (004107d0)
004106C6   mov         esp,ebp
004106C8   pop         ebp
004106C9   ret

7:    char* RetArray()
8:    {
004106D0   push        ebp
004106D1   mov         ebp,esp
004106D3   sub         esp,4Ch
004106D6   push        ebx
004106D7   push        esi
004106D8   push        edi
004106D9   lea         edi,[ebp-4Ch]
004106DC   mov         ecx,13h
004106E1   mov         eax,0CCCCCCCCh
004106E6   rep stos    dword ptr [edi]
9:        char szBuff[] = {"Hello World"};
004106E8   mov         eax,[string "Hello World" (00426ee8)]
004106ED   mov         dword ptr [ebp-0Ch],eax
004106F0   mov         ecx,dword ptr [string "Hello World"+4 (00426eec)]
004106F6   mov         dword ptr [ebp-8],ecx
004106F9   mov         edx,dword ptr [string "Hello World"+8 (00426ef0)]
004106FF   mov         dword ptr [ebp-4],edx
10:       return szBuff;
00410702   lea         eax,[ebp-0Ch]
11:   }
00410705   pop         edi
00410706   pop         esi
00410707   pop         ebx
00410708   mov         esp,ebp
0041070A   pop         ebp
0041070B   ret

1:    #include<stdio.h>
2:
3:    int g_nArray[5] = {1 , 2 , 3 , 4 , 5};
4:    int main()
5:    {
00401210   push        ebp
00401211   mov         ebp,esp
00401213   sub         esp,44h
00401216   push        ebx
00401217   push        esi
00401218   push        edi
00401219   lea         edi,[ebp-44h]
0040121C   mov         ecx,11h
00401221   mov         eax,0CCCCCCCCh
00401226   rep stos    dword ptr [edi]
6:        int *pInt = g_nArray;
00401228   mov         dword ptr [ebp-4],offset g_nArray (00428a30)   全局数组 地址不在栈中
7:        do
8:        {
9:            printf("%d \n" , *pInt);
0040122F   mov         eax,dword ptr [ebp-4]
00401232   mov         ecx,dword ptr [eax]
00401234   push        ecx
00401235   push        offset string "%d \n" (0042603c)
0040123A   call        printf (00401460)
0040123F   add         esp,8
10:           ++pInt;
00401242   mov         edx,dword ptr [ebp-4]
00401245   add         edx,4                                指针++是加的相应字节数
00401248   mov         dword ptr [ebp-4],edx
11:       }while(pInt < g_nArray + 5);
0040124B   cmp         dword ptr [ebp-4],offset g_nArray+14h (00428a44)
00401252   jb          main+1Fh (0040122f)
12:       return 0;
00401254   xor         eax,eax
13:   }
00401256   pop         edi
00401257   pop         esi
00401258   pop         ebx
00401259   add         esp,44h
0040125C   cmp         ebp,esp
0040125E   call        __chkesp (00401370)
00401263   mov         esp,ebp
00401265   pop         ebp
00401266   ret

3:    int main()
4:    {
00401290   push        ebp
00401291   mov         ebp,esp
00401293   sub         esp,48h
00401296   push        ebx
00401297   push        esi
00401298   push        edi
00401299   lea         edi,[ebp-48h]
0040129C   mov         ecx,12h
004012A1   mov         eax,0CCCCCCCCh
004012A6   rep stos    dword ptr [edi]
5:        int nOne , nTwo;
6:        scanf("%d%d" , &nOne , &nTwo);
004012A8   lea         eax,[ebp-8]
004012AB   push        eax
004012AC   lea         ecx,[ebp-4]
004012AF   push        ecx
004012B0   push        offset string "%d%d" (00429044)
004012B5   call        scanf (004015a0)
004012BA   add         esp,0Ch
7:        static int g_snArray[5] = {nOne , nTwo , 0};
004012BD   xor         edx,edx
004012BF   mov         dl,byte ptr [`main'::`2'::$S1 (0042f028)]      静态数组   编译时期确定存储空间
004012C5   and         edx,1
004012C8   test        edx,edx
004012CA   jne         main+70h (00401300)
004012CC   mov         al,[`main'::`2'::$S1 (0042f028)]              此处是编译器在做相应的内存标记
004012D1   or          al,1
004012D3   mov         [`main'::`2'::$S1 (0042f028)],al                在首地址处做处理
004012D8   mov         ecx,dword ptr [ebp-4]
004012DB   mov         dword ptr [`main'::`2'::$S1+4 (0042f02c)],ecx    0042f02c即为其内存地址
004012E1   mov         edx,dword ptr [ebp-8]
004012E4   mov         dword ptr [`main'::`2'::$S1+8 (0042f030)],edx    间接赋值
004012EA   mov         dword ptr [`main'::`2'::$S1+0Ch (0042f034)],0    直接赋值0
004012F4   xor         eax,eax
004012F6   mov         [`main'::`2'::$S1+10h (0042f038)],eax
004012FB   mov         [`main'::`2'::$S1+14h (0042f03c)],eax
8:        return 0;
00401300   xor         eax,eax
9:    }
00401302   pop         edi
00401303   pop         esi
00401304   pop         ebx
00401305   add         esp,48h
00401308   cmp         ebp,esp
0040130A   call        __chkesp (00401430)
0040130F   mov         esp,ebp
00401311   pop         ebp
00401312   ret

现在该值变为  0042f028
0042F01A  00 00 00 00 00 00 00  .......
0042F021  00 00 00 00 00 00 00  .......
0042F028  00 00 00 00 00 00 00  .......
0042F02F  00 00 00 00 00 00 00  .......
0042F036  00 00 00 00 00 00 00  .......
0042F03D  00 00 00 00 00 00 00  .......
0042F044  00 00 00 00 00 00 00  .......

执行完后
0042F01A  00 00 00 00 00 00 00  .......
0042F021  00 00 00 00 00 00 00  .......
0042F028  01 00 00 00 0F 00 00  .......  标记置1   nOne 15   nTwo 67
0042F02F  00 43 00 00 00 00 00  .C.....
0042F036  00 00 00 00 00 00 00  .......
0042F03D  00 00 00 00 00 00 00  .......
0042F044  00 00 00 00 00 00 00  ....... 
反汇编例子

1:    #include<stdio.h>
2:
3:    int main()
4:    {
004016D0   push        ebp
004016D1   mov         ebp,esp
004016D3   sub         esp,6Ch
004016D6   push        ebx
004016D7   push        esi
004016D8   push        edi
004016D9   lea         edi,[ebp-6Ch]
004016DC   mov         ecx,1Bh
004016E1   mov         eax,0CCCCCCCCh
004016E6   rep stos    dword ptr [edi]
5:        int nIndex = 1;
004016E8   mov         dword ptr [ebp-4],1
6:        int nArray[9] = {1 , 2 , 3 , 0};
004016EF   mov         dword ptr [ebp-28h],1
004016F6   mov         dword ptr [ebp-24h],2
004016FD   mov         dword ptr [ebp-20h],3
00401704   mov         dword ptr [ebp-1Ch],0
0040170B   xor         eax,eax
0040170D   mov         dword ptr [ebp-18h],eax
00401710   mov         dword ptr [ebp-14h],eax
00401713   mov         dword ptr [ebp-10h],eax
00401716   mov         dword ptr [ebp-0Ch],eax
00401719   mov         dword ptr [ebp-8],eax
7:        int *pInt = nArray;
0040171C   lea         ecx,[ebp-28h]
0040171F   mov         dword ptr [ebp-2Ch],ecx
8:        printf("%d\n" , nArray[-1]);
00401722   lea         edx,[ebp-28h]
00401725   mov         eax,dword ptr [edx-4]
00401728   push        eax
00401729   push        offset string "%d\n" (0042901c)
0040172E   call        printf (004018e0)
00401733   add         esp,8
9:        printf("%d\n" , nArray[nIndex]);
00401736   mov         ecx,dword ptr [ebp-4]
00401739   mov         edx,dword ptr [ebp+ecx*4-28h]
0040173D   push        edx
0040173E   push        offset string "%d\n" (0042901c)
00401743   call        printf (004018e0)
00401748   add         esp,8
10:       printf("%d\n" , pInt[nIndex - 2]);
0040174B   mov         eax,dword ptr [ebp-4]
0040174E   mov         ecx,dword ptr [ebp-2Ch]
00401751   mov         edx,dword ptr [ecx+eax*4-8]
00401755   push        edx
00401756   push        offset string "%d\n" (0042901c)
0040175B   call        printf (004018e0)
00401760   add         esp,8
11:       return 0;
00401763   xor         eax,eax
12:   }
00401765   pop         edi
00401766   pop         esi
00401767   pop         ebx
00401768   add         esp,6Ch
0040176B   cmp         ebp,esp
0040176D   call        __chkesp (00401960)
00401772   mov         esp,ebp
00401774   pop         ebp
00401775   ret


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。