反汇编逆向实例_unoin语句反汇编

反汇编逆向实例_unoin语句反汇编

                                                                                                   by:比方

逆向反汇编第六章,unoin语句反汇编 

示例代码:

 1 #include"stdio.h"
 2 typedef enum            定义一个名为myenum的枚举体
 3 {
 4     ENUM_1=1,
 5     ENUM_2=2,
 6     ENUM_3,
 7     ENUM_4
 8 }myenum;
 9 typedef struct               定义一个名为mystruct的结构体
10 {
11     int a;
12     int b;
13     int c;
14 }mystruct;
15 typedef union                定义一个名为myunion的共用体
16 {
17     mystruct s;
18 myenum e[3];
19 }myunion;
20 
21 int function(int a,int b)
22 {
23     unsigned char *buffer[100]={0};
24     myunion *uns=(myunion*)buffer;
25     int i;
26     for(i=0;i<5;i++)
27     {
28         uns[i].s.a=0;
29         uns[i].s.b=1;
30         uns[i].e[1]=ENUM_4;
31     }
32     return 0;
33 }
34 void main()
35 {
36     function(1,2);
37 } 

 

反汇编结果:

 1 #include "stdio.h"
 2 
 3 typedef enum
 4 {
 5 
 6     ENUM_1=1,
 7     ENUM_2=2,
 8     ENUM_3,
 9     ENUM_4
10 }myenum;
11 
12 
13 typedef struct
14 {
15 
16     int a;
17     int b;
18     int c;
19 }mystruct;
20 
21 
22 typedef union
23 {
24 
25     mystruct s;
26     myenum e[3];
27 }myunion;
28 
29 int function(int a,int b)
30 
31 {
01083530 push ebp
01083531 mov ebp,esp
01083533 sub esp,270h
01083539 push ebx
0108353A push esi
0108353B push edi
0108353C lea edi,[ebp-270h]
01083542 mov ecx,9Ch
01083547 mov eax,0CCCCCCCCh
0108354C rep stos dword ptr es:[edi]        ;开始分配9C个4字节空间,定位到edi,edi是来自[ebp-270h],定位到缓冲区头部并初始化为CC,
 
1 myunion *uns=(myunion*)buffer;
0108356E lea eax,[buffer]                               ;缓冲区内容赋值给uns
01083574 mov dword ptr [uns],eax
 
1    int i;
2     for(i=0;i<5;i++)
0108357A mov dword ptr [i],0                          ;IF分支语句比较容易识别,且在前面章节中有所介绍,故不再重复介绍。
01083584 jmp function+65h (1083595h)
01083586 mov eax,dword ptr [i]
0108358C add eax,1
0108358F mov dword ptr [i],eax
01083595 cmp dword ptr [i],5
0108359C jge function+0B4h (10835E4h)
 
1  {
2        uns[i].s.a=0;
0108359E mov eax,dword ptr [i]                          ;取得i元素放入到eax,然后eax乘上的0ch后,结果放回eax寄存器中,(注意此处是有符号乘法)
010835A4 imul eax,eax,0Ch
010835A7 mov ecx,dword ptr [uns]                    ;把uns放入到ecx中,在把0值赋值给,eax+ecx,所以结果就是 uns的[i]元素 = 0; 
010835AD mov dword ptr [ecx+eax],0
 
1 uns[i].s.b=1;
010835B4 mov eax,dword ptr [i]                           ;以下结果类似,这里可以看到一个+4的动作,而32位操作系统默认是4字节,                                                                                  
                            ;所以这里实际上是操作他的第二个元素,如果是+8就是操作它的第三个元素,结果自推(…)。
010835BA imul eax,eax,0Ch
010835BD mov ecx,dword ptr [uns]
010835C3 mov dword ptr [ecx+eax+4],1
 
1 uns[i].e[1]=ENUM_4;
010835CB mov eax,dword ptr [i]
010835D1 imul eax,eax,0Ch
010835D4 mov ecx,dword ptr [uns]
010835DA mov dword ptr [ecx+eax+4],4
    }
010835E2 jmp function+56h (1083586h)
    return 0;
010835E4 xor eax,eax
}
 
 

 

posted @ 2014-08-15 10:21  比方  阅读(290)  评论(0)    收藏  举报