[教程]逆向反汇编第十课

循环是高级语言中可以进行反向引用的一种语言形式,其他类型的分支语句(比如IF-THEN-ELSE等)都是由低向高地址区域走的.因此,通过这点可以较方便的将循环语句识别出来.如果确定某段代码是循环,就可以分析其计数器,一般是用ecx寄存器做计数器,也有用其他方法来控制循环的,如/"test eax,eax/"等.
看一个简单的循环代码:

 

  1. xoreax,eax;eax清零    
  2. @@:    
  3. incecx;计数    
  4. ....    
  5. cmpecx,0A;循环10次    
  6. ;重复   

 

如果上面的代码用C来表示的话:

 

  1. while(i<10)    
  2. {    
  3. ....    
  4. }   

 

或者:

 

  1. for(i=0;i<10;i++)    
  2. {    
  3. ....    
  4. }   

 

用C写一段比较复杂的循环:

 

  1. #include /"stdio.h/"   
  2. #include /"windows.h/"    
  3. int main(void)    
  4. {    
  5.      int i,sum=0;    
  6.      for(i=0;i<=100;i++)    
  7.      sum=sum+i;    
  8.      printf(/"%d/",sum);    
  9.      Sleep(100000);    
  10.      return 0;    
  11. }   

 

反汇编的结果如下

 

  1. 00401028|.C745 F8 00000>MOV DWORD PTR SS:[EBP-8],0 ;变量清零    
  2. 0040102F|.C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 ;变量清零    
  3. 00401036|.EB 09 JMP SHORT 循环.00401041;先跳到比较处    
  4. 00401038|>8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4];i赋值给eax    
  5. 0040103B|.83C0 01 |ADD EAX,1 ;eax+1->i+1    
  6. 0040103E|.8945 FC |MOV DWORD PTR SS:[EBP-4],EAX;eax+1后的值再送还给i    
  7. 00401041|>837D FC 64|CMP DWORD PTR SS:[EBP-4],64 ;i+1后的值和64h(100)比较    
  8. 00401045|.7F 0B |JG SHORT 循环.00401052;大于就往下跳    
  9. 00401047|.8B4D F8 |MOV ECX,DWORD PTR SS:[EBP-8]    
  10. 0040104A|.034D FC |ADD ECX,DWORD PTR SS:[EBP-4];[ebp-4]是变量i    
  11. 0040104D|.894D F8 |MOV DWORD PTR SS:[EBP-8],ECX;变量sum    
  12. 00401050|.^ EB E6 SHORT 循环.00401038    
  13. 00401052|>8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]    
  14. 00401055|.52PUSH EDX ; /Arg2    
  15. 00401056|.68 1C004200 PUSH 循环.0042001C ; |Arg1 = 0042001C ASCII /"%d/"    
  16. 0040105B|.E8 50000000 CALL 循环.004010B0 ; //循环.004010B0    
  17. 00401060|.83C4 08 ADD ESP,8    
  18. 00401063|.8BF4MOV ESI,ESP    
  19. 00401065|.68 A0860100 PUSH 186A0 ; /Timeout = 100000. ms    
  20. 0040106A|.FF15 3C514200 CALL DWORD PTR DS:[<&KERNEL32.Sleep>];   

 

另一种反汇编出来的情况是

 

  1. xorecx,ecx;变量初始化,即sum=0    
  2. xoreax,eax;变量初始化,即i=0    
  3. @@:    
  4. addecx,eax;相当于sum=sum+i    
  5. inceax;eax+1,即i++    
  6. cmpeax,64h;将变量i与100比较    
  7. ;如果eax<100就往上跳    
  8. xoreax,eax    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值