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

 

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

                                                                                                      by:比方

 逆向反汇编第七章,struct语句反汇编 

示例代码:

 1 typedef struct                   ;定义一个名为mystruct的结构体
 2 {
 3    int a;   定义三个"整形"结构体成员,每个成员4个字节,整个结构体共12字节,转换成16进制为0xC
 4    int b; 
 5    int c;
 6 }mystruct;
7 int function(int a,int b) 8 { 9 unsigned char *buffer[100]; 10 mystruct *strs=(mystruct*)buffer; 11 int i; 12 for(i=0;i<5;i++) 13  { 14    strs[i].a=0; //给三个结构体成员进行赋值操作 15   strs[i].b=1; 16    strs[i].c=2; 17  } 18 return 0; 19 } 20 21 void main() 22 { 23 function(1,2); 24 }

反汇编如下:

 

 1 #include "stdio.h" 
 2 
 3 typedef struct //三个整形变量共占用了12字节的空间,转成16进制为0xc;
 4 { 
 5 
 6     int a; 
 7     int b; 
 8     int c; 
 9 
10 }mystruct; 
11 
12 int function(int a,int b)
13 { 

 

001A3530 push ebp
001A3531 mov ebp,esp
 
001A3533 sub esp,270h
 
001A3539 push ebx
001A353A push esi
001A353B push edi
 
001A353C lea edi,[ebp-270h]
001A3542 mov ecx,9Ch
001A3547 mov eax,0CCCCCCCCh
001A354C rep stos dword ptr es:[edi]                 ;开始分配9C个4字节空间,定位到edi,edi是来自[ebp-270h],定位到缓冲区头部并初始化为CC,

 

1 unsigned char *buffer[100];
2 mystruct *strs=(mystruct*)buffer

001A354E lea eax,[buffer]

001A3554 mov dword ptr [strs],eax

 

1 int i; 
2     for(i=0;i<5;i++) 

 

001A355A mov dword ptr [i],0                                     第一步:   ;i变量赋值为0,int i = 0;
001A3564 jmp function+45h (1A3575h)
 
001A3566 mov eax,dword ptr [i]                                 第五步:  ;将i变量的值加上个1,然后继续和5做比较,重复"第二步"和"第三步"
001A356C add eax,1
001A356F mov dword ptr [i],eax
001A3575 cmp dword ptr [i],5                                     第二步: ;比较i是否小于5,i <5;
001A357C jge function+94h (1A35C4h)                      第三步: ;如果不小于则跳转到return处,既0x1A35C4h地址处,否则执行下面语句
1 { 
2         strs[i].a=0; 
001A357E mov eax,dword ptr [i]
001A3584 imul eax,eax,0Ch                                     ;eax=i*12  由于结构体中有三个成员,都是整形,所以占用了12字节的空间
001A3587 mov ecx,dword ptr [strs]
001A358D mov dword ptr [ecx+eax],0                   ;strs[i].a=0;   第零个成员赋值为0
 
1    strs[i].b=1; 
001A3594 mov eax,dword ptr [i]
001A359A imul eax,eax,0Ch                                       ;eax=i*12
001A359D mov ecx,dword ptr [strs]
001A35A3 mov dword ptr [ecx+eax+4],1                     ;strs[i].b=0;  第一个成员赋值为1

 

1 strs[i].c=2; 

001A35AB mov eax,dword ptr [i]

001A35B1 imul eax,eax,0Ch
001A35B4 mov ecx,dword ptr [strs]
001A35BA mov dword ptr [ecx+eax+8],2                 ;给第二个成员赋值为2

 

    }
001A35C2 jmp function+36h (1A3566h)                     第四步:执行到0x001A3566地址处
 
1    return 0; 

 001A35C4 xor eax,eax

}


 

 

转载于:https://www.cnblogs.com/hailunchina/p/3914056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值