反汇编逆向实例_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
}
作者:比方
出处:http://www.cnblogs.com/Hailunchina/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。

浙公网安备 33010602011771号