博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
六、for循环的逆向
阅读量:6674 次
发布时间:2019-06-25

本文共 2631 字,大约阅读时间需要 8 分钟。

1 #include "stdafx.h" 2  3  4  5 int fun(int a,int b) 6 { 7     int c=a+b; 8     int i; 9     for(i=0;i<50;i++)10     {11         c=c+i;12     }13     return c;14 }15 16 17 int _tmain(int argc, _TCHAR* argv[])18 {19 20     int m=fun(11,22);21     return 0;22 }

下面是汇编代码:

1 int fun(int a,int b) 2  { 3  00412CE0  push        ebp                      ;ebp入栈 4  00412CE1  mov         ebp,esp                  ;用ebp保存esp的值 5  00412CE3  sub         esp,0D8h                 ;为局部变量申请空间 6  00412CE9  push        ebx                      ; 7  00412CEA  push        esi                      ; 8  00412CEB  push        edi                      ;寄存器入栈,保存它们的值 9  00412CEC  lea         edi,[ebp-0D8h]           ;获得局部变量空间的首地址10  00412CF2  mov         ecx,36h                  ;确定stos的终止条件11  00412CF7  mov         eax,0CCCCCCCCh           ;将eax的值初始化为CCCCCCCC,也就是int3断点的机器码12  00412CFC  rep stos    dword ptr es:[edi]       ;讲CC放入申请的局部变量空间13      int c=a+b;14  00412CFE  mov         eax,dword ptr [a]        ;eax=a15  00412D01  add         eax,dword ptr [b]        ;eax=a+b16  00412D04  mov         dword ptr [c],eax        ;c=eax17      int i;18      for(i=0;i<50;i++)19  00412D07  mov         dword ptr [i],0          ;int i=020  00412D0E  jmp         fun+39h (412D19h)        ;跳转到B21  00412D10  mov         eax,dword ptr [i]        ;这里是A的开始22  00412D13  add         eax,1                    ;23  00412D16  mov         dword ptr [i],eax        ;i++24  00412D19  cmp         dword ptr [i],32h        ;这里是B的开始       i<50?25  00412D1D  jge         fun+4Ah (412D2Ah)        ;如果i大于或等于50,则此条语句实现,跳出循环26      {27          c=c+i;28  00412D1F  mov         eax,dword ptr [c]        ;eax=c29  00412D22  add         eax,dword ptr [i]        ;eax++ 30  00412D25  mov         dword ptr [c],eax        ;c=eax31      }32  00412D28  jmp         fun+30h (412D10h)        ;跳转到A33      return c;34  00412D2A  mov         eax,dword ptr [c]        ;将结果保存到eax中,作为返回的结果35  }36  00412D2D  pop         edi                      ;弹出保存的寄存器值,实现堆栈的平衡37  00412D2E  pop         esi                      ;38  00412D2F  pop         ebx                      ;39  00412D30  mov         esp,ebp                  ;40  00412D32  pop         ebp                      ;41  00412D33  ret

我们主要看循环部分的代码。

循环主要用这么几条指令来实现:

mov 进行初始化

jmp跳过修改循环变量的代码

cmp实现条件判断

jge根据条件跳转

1 mov 
<循环变量>
,
<初始值>
;给循环变量赋初值 2 jmp B ;跳到第一次循环处 3 A : (改动循环变量) ;修改循环变量 4 ... 5 6 B : cmp
<循环变量>
,
<限制变量>
;检查循环条件 7 jge 跳出循环 8 (循环体) 9 ...10 jmp A ;跳回去修改循环变量

。。。。。。。。。。。。。。。。

转载地址:http://vfgxo.baihongyu.com/

你可能感兴趣的文章
游戏中常用到的碰撞检测帮助类
查看>>
访问默认共享
查看>>
01262015要看的blog——oracle tuning
查看>>
[信息图]电子商务营销的6大步骤
查看>>
Hibernate注释大全收藏
查看>>
通过openfiler模拟存储
查看>>
java学习笔记 --- String类
查看>>
1.5-cut命令
查看>>
我的友情链接
查看>>
从技术角度看人与人的沟通
查看>>
加速sshd
查看>>
15.3、SElinux介绍
查看>>
关于Nagios Core
查看>>
python基本数据类型的介绍
查看>>
原生的js写Ajax请求
查看>>
战略合作背后的秘密:VMware沦为AWS的渠道商?
查看>>
tar.gz安装
查看>>
Centos6.5 glibc 升级
查看>>
排序——C++函数调用
查看>>
Pandownload关了,还有更牛逼的百度网盘全速下载方法
查看>>