汇编之路_<>!===>=<=for_do_while_while代码还原

==

if(i==5){ jne ==

下面汇编还原:
//把jne 和  ==  联系起来,埋下心锚,是不是很好理解}

int i=6;
013713BE  mov         dword ptr [i],6
     if(i==5){
013713C5  cmp         dword ptr [i],5
013713C9  jne         wmain+42h (013713F7h)    if(i == 5)//就执行下面代码
          printf("1ni");
013713CB  mov         esi,esp
013713F7  ret

---------------------
if(i > 5){ jle >

下面汇编还原:
//把jle 和  >  联系起来,埋下心锚,是不是很好理解}
        int i=6;
010813BE  mov         dword ptr [i],6
        if(i>5){
010813C5  cmp         dword ptr [i],5
010813C9  jle         wmain+42h (010813E4h)
                printf("1ni");
010813CB  mov         esi,esp

010813E4  pop         edi  

---------------------
if(i < 5){ jge <

下面汇编还原:
//把jge和  <  联系起来,埋下心锚,是不是很好理解}

        int i=6;
011A13BE  mov         dword ptr [i],6
        if(i<5){
011A13C5  cmp         dword ptr [i],5
011A13C9  jge         wmain+42h (011A13E2h)
                printf("1ni");
011A13CB  mov         esi,esp
011A13E2  xor         eax,eax




---------------------
if(i != 5){ je !=

下面汇编还原:
//把je和  !=  联系起来,埋下心锚,是不是很好理解}

        int i=6;
010D13BE  mov         dword ptr [i],6
        if(i!=5){
010D13C5  cmp         dword ptr [i],5
010D13C9  je          wmain+42h (10D13E2h)
                printf("1ni");
010D13CB  mov         esi,esp
010D13CD  push        offset string "1ni" (010D13E2h)
010D13E2  xor         eax,eax



---------------------
if(i >= 5){ jl >=

下面汇编还原:
//把jl和  >=  联系起来,埋下心锚,是不是很好理解}
        int i=6;
013F13BE  mov         dword ptr [i],6
        if(i>=5){
013F13C5  cmp         dword ptr [i],5
013F13C9  jl          wmain+42h (13F13E2h)
                printf("1ni");
013F13CB  mov         esi,esp
013F13CD  push        offset string "1ni" (013F13E2h)
013F13E2  xor         eax,eax
}



---------------------
if(i <= 5){ jg <=

下面汇编还原:
//把jg和  <=  联系起来,埋下心锚,是不是很好理解}


        int i=6;
00C113BE  mov         dword ptr [i],6
        if(i<=5){
00C113C5  cmp         dword ptr [i],5
00C113C9  jg          wmain+42h (00C113E2h)
                printf("1ni");
00C113CB  mov         esi,esp
00C113E2  xor         eax,eax
}





---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
         int i =6;
         if (i <=5){
                 printf ("1ni" );
        } else {
                 printf ("1ni" );
        }
         return 0;
}


        int i=6;
001E1A4E  mov         dword ptr [i],6
        if(i<=5){
001E1A55  cmp         dword ptr [i],5
001E1A59  jg          wmain+44h (1E1A74h)      if(i<=5).执行下面的代码,否则就跳到地址处执行
                printf("1ni");
001E1A5B  mov         esi,esp
001E1A5D  push        offset string "1ni" (1E573Ch)
001E1A62  call        dword ptr [__imp__printf (1E82BCh)]
001E1A68  add         esp,4
001E1A6B  cmp         esi,esp
001E1A6D  call        @ILT+320(__RTC_CheckEsp) (1E1145h)
        }else{
001E1A72  jmp         wmain+5Bh (1E1A8Bh)         //这里可以理解为if的结尾
                printf("1ni");
001E1A74  mov         esi,esp           //这里可以理解为else的开始处
001E1A76  push        offset string "1ni" (1E573Ch)
001E1A7B  call        dword ptr [__imp__printf (1E82BCh)]
001E1A81  add         esp,4
001E1A84  cmp         esi,esp
001E1A86  call        @ILT+320(__RTC_CheckEsp) (1E1145h)
        }
        return 0;
001E1A8B  xor         eax,eax
}






---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
         int i =6;
         if (i <=5){
                 printf ("1ni" );
        } else if ( i>=5){
                 printf ("1ni" );
        } else {
                 printf ("1ni" );
        }
         return 0;
}
  



        int i=6;
00AB1A4E  mov         dword ptr [i],6
        if(i<=5){
00AB1A55  cmp         dword ptr [i],5
00AB1A59  jg          wmain+44h (0AB1A74h)         //遇到这个可以直接理解为if,或者else if
                printf("1ni");
00AB1A5B  mov         esi,esp
00AB1A5D  push        offset string "1ni" (0AB573Ch)
00AB1A62  call        dword ptr [__imp__printf (0AB82BCh)]
00AB1A68  add         esp,4
00AB1A6B  cmp         esi,esp
00AB1A6D  call        @ILT+320(__RTC_CheckEsp) (0AB1145h)
00AB1A72  jmp         wmain+7Ah (0AB1AAAh)         //说明是跳到else最后面
        }else if(i>=5){
00AB1A74  cmp         dword ptr [i],5
00AB1A78  jl          wmain+63h (0AB1A93h)      //如果是从其他地方跳到这里来的,说明这是else if
                printf("1ni");
00AB1A7A  mov         esi,esp
00AB1A7C  push        offset string "1ni" (0AB573Ch)
00AB1A81  call        dword ptr [__imp__printf (0AB82BCh)]
00AB1A87  add         esp,4
00AB1A8A  cmp         esi,esp
00AB1A8C  call        @ILT+320(__RTC_CheckEsp) (0AB1145h)
        }else{
00AB1A91  jmp         wmain+7Ah (0AB1AAAh)    ////说明是跳到else最后面
                printf("1ni");
00AB1A93  mov         esi,esp         // 这个是最后的else,这是else的开始位置
00AB1A95  push        offset string "1ni" (0AB573Ch)
00AB1A9A  call        dword ptr [__imp__printf (0AB82BCh)]
00AB1AA0  add         esp,4
00AB1AA3  cmp         esi,esp
00AB1AA5  call        @ILT+320(__RTC_CheckEsp) (0AB1145h)
        }
        return 0;
00AB1AAA  xor         eax,eax
}

















---------------------
int _tmain ( int argc , _TCHAR * argv[])
{
         int i =6;

         switch (i )
        {
         case 1:
                 printf ("1" );
                 break ;
         case 2:
                 printf ("2" );
                 break ;
         default :
                 printf ("default" );
        }
        
         return 0;
}


switch代码还原:


        int i=6;
012A2FEE  mov         dword ptr [i],6

        switch (i)
012A2FF5  mov         eax,dword ptr [i]
012A2FF8  mov         dword ptr [ebp-0D0h],eax
012A2FFE  cmp         dword ptr [ebp-0D0h],1           //如果遇到cmp,je,cmp,je,jmp意思就是2个case,一个default
012A3005  je          wmain+42h (12A3012h)
012A3007  cmp         dword ptr [ebp-0D0h],2           
012A300E  je          wmain+5Bh (12A302Bh)            // je 表示!=.意思就是如果 i!=2.就执行下面的jmp,否则跳入case
012A3010  jmp         wmain+74h (12A3044h)
        {
        case 1:
                printf("1");
012A3012  mov         esi,esp
012A3014  push        offset string "1" (12A57A8h)
012A3019  call        dword ptr [__imp__printf (12A82BCh)]
012A301F  add         esp,4
012A3022  cmp         esi,esp
012A3024  call        @ILT+320(__RTC_CheckEsp) (12A1145h)
                break;
012A3029  jmp         wmain+8Bh (12A305Bh)
        case 2:
                printf("2");
012A302B  mov         esi,esp
012A302D  push        offset string "2" (12A573Ch)
012A3032  call        dword ptr [__imp__printf (12A82BCh)]
012A3038  add         esp,4
012A303B  cmp         esi,esp
012A303D  call        @ILT+320(__RTC_CheckEsp) (12A1145h)
                break;
012A3042  jmp         wmain+8Bh (12A305Bh)                 //break 相当于跳出这个循环 
        default:
                printf("default");
012A3044  mov         esi,esp
012A3046  push        offset string "default" (12A57A0h)
012A304B  call        dword ptr [__imp__printf (12A82BCh)]
012A3051  add         esp,4
012A3054  cmp         esi,esp
012A3056  call        @ILT+320(__RTC_CheckEsp) (12A1145h)
        }
        
        return 0;
012A305B  xor         eax,eax
}


//补充,如果是:
         case 1:
         case 3:











do_while循环还原:

        int i=6;
00352FEE  mov         dword ptr [i],6

        do{
                printf("11");
00352FF5  mov         esi,esp
00352FF7  push        offset string "default" (3557A0h)
00352FFC  call        dword ptr [__imp__printf (3582BCh)]
00353002  add         esp,4
00353005  cmp         esi,esp
00353007  call        @ILT+320(__RTC_CheckEsp) (351145h)
                i++;
0035300C  mov         eax,dword ptr [i]
0035300F  add         eax,1
00353012  mov         dword ptr [i],eax
        }while(i>10);
00353015  cmp         dword ptr [i],0Ah
00353019  jg          wmain+25h (352FF5h)//如果是往上面跳的就可以理解为是一个do while循环
        
        return 0;
0035301B  xor         eax,eax
}







while 循环还原:

        int i=6;
002D2FEE  mov         dword ptr [i],6

        while(i>3){
002D2FF5  cmp         dword ptr [i],3
002D2FF9  jle         wmain+4Dh (2D301Dh)          // 这里可以理解成一个if or else if or while ,这个需要看后面的jmp指令了

                i--;
002D2FFB  mov         eax,dword ptr [i]
002D2FFE  sub         eax,1
002D3001  mov         dword ptr [i],eax
                printf("sd");
002D3004  mov         esi,esp
002D3006  push        offset string "default" (2D57A0h)
002D300B  call        dword ptr [__imp__printf (2D82BCh)]
002D3011  add         esp,4
002D3014  cmp         esi,esp
002D3016  call        @ILT+320(__RTC_CheckEsp) (2D1145h)
        }
002D301B  jmp         wmain+25h (2D2FF5h)              //如果这里的jmp指令是往前面跳转的话,那么他就是一个while循环
        
        return 0;
002D301D  xor         eax,eax
}








for循环还原:

        int i=6;
000C2FEE  mov         dword ptr [i],6

        for(i=0;i<123;i++){
000C2FF5  mov         dword ptr [i],0
000C2FFC  jmp         wmain+37h (0C3007h)             //跳到这个地方
000C2FFE  mov         eax,dword ptr [i]
000C3001  add         eax,1
000C3004  mov         dword ptr [i],eax
000C3007  cmp         dword ptr [i],7Bh                //这个是第一步开始的地方
000C300B  jge         wmain+56h (0C3026h)   // jge = <,  i < 7BH,就执行下面的代码,否则就跳出循环
                printf("a");
000C300D  mov         esi,esp
000C300F  push        offset string "11" (0C57A0h)
000C3014  call        dword ptr [__imp__printf (0C82BCh)]
000C301A  add         esp,4
000C301D  cmp         esi,esp
000C301F  call        @ILT+320(__RTC_CheckEsp) (0C1145h)
        }
000C3024  jmp         wmain+2Eh (0C2FFEh)
        return 0;
000C3026  xor         eax,eax
}











那么他就会多加一个cmp 和 je  i!=6 继续判断下面的

 

posted @ 2013-09-02 15:43  宝贝,我永远都在  阅读(200)  评论(0)    收藏  举报