分支语句判断

分支语句的反汇编识别

 一、IF语句

1.概述

如果看到

指令  
cmp(准确的说是映像标志位的寄存器) 
jxx 

很有可能就是if语句。

  • 只有小于等于的,就跳转,跳转意味这if后面的代码不执行。

  • 一旦表达式成立,就跳

  • 汇编翻译c语言是反的。

  • 因为c语言里是条件成立就执行,汇编说的是跳转的条件,条件成立就跳走了,嗲代码不执行。

  • 逻辑是反的。

  • 如果单纯的要把指令对上,会累死人的,要了解这段汇编大概做了什么事情。

  • 你用c把功能描述出来就行。你爱杂写杂写。

  • 不要总结这个。

2.if语句的反汇编判断

执行各类影响标志位的指令            
jxx xxxx            
2.1 案例一
mov eaxdword ptr[ebp-8]            
cmp eaxdword ptr[ebp-4]            
jle 00401059        jle:小于等于则跳转 
2.2 案例二
mov eaxdword ptr[ebp-8]            
cmp eaxdword ptr[ebp-4]            
jl 00401059     jl:小于则跳转    
2.3 案例三
mov eaxdword ptr[ebp-8]        jge:大于或者等于跳转    
cmp eaxdword ptr[ebp-4]            
jge 00401059            
2.4 案例四
mov eaxdword ptr[ebp-8]        jg:大于则跳转    
cmp eaxdword ptr[ebp-4]            
jg 00401059         
2.5 有符号数(jge/jle)和无符号数(jae/jbe)
2.5.1有符号数:
if(x>y){Fun(x>y)}


 if (nNum_x > nNum_y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jle   NextFun
Fun(x>y)


NextFun
if(x<y){Fun(x<y)}


 if (nNum_x < nNum_y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jge   NextFun
Fun(x<y)


NextFun
2.5.2无符号数:
if(x>y){Fun(x>y)}


 if (x > y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jbe   NextFun
Fun(x>y)


NextFun
if(x<y){Fun(x<y)}


 if (x < y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jae   NextFun
Fun(x<y)


NextFun

二、IF_else语句

1.有符号&无符号

有符号

if(x>y){Fun(x>y)}else{Fun(x<y)}


 if (nNum_x > nNum_y)
mov  eax,dword ptr ds:[ x ]
cmp  eax,dword ptr ds:[ y ] 
jle  Fun(x<y) 
Fun(x>y)
jmp   NextFun (0E33D57h)  
Fun(x<y) 
NextFun


if(x<y){Fun(x<y)}


 if (nNum_x < nNum_y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jge  Fun(x>y)
Fun(x<y)
jmp   NextFun (0E33D57h)  
Fun(x>y)
NextFun
无符号
if(x>y){Fun(x>y)}else{Fun(x<y)}


 if (x > y)
mov  eax,dword ptr ds:[ x ]
cmp  eax,dword ptr ds:[ y ] 
jbe  Fun(x<y) 
Fun(x>y)
jmp   NextFun (0E33D57h)  
Fun(x<y) 
NextFun


if(x<y){Fun(x<y)}


 if (x < y)
mov   eax,dword ptr ds:[ x ]
cmp   eax,dword ptr ds:[ y ] 
jae  Fun(x>y)
Fun(x<y)
jmp   NextFun (0E33D57h)  
Fun(x>y)
NextFun

2 学习总结

2.1-if-else语句的反汇编判断
    if_begin:           
        先执行各类影响标志位的指令       
        jxx  else_begin     

        …       
    if_end:         
        jmp  end        
    else_begin:         
        …..     
        else_end        

    end         
  • 1、如果不跳转,那么执行到jmp处,jmp直接跳到end处。

  • 2.如果跳转,则会直接跳过 jmp end处的代码,直接执行后面的代码

    总结:
    跳转执行一部分代码,不跳转执行另外一部分代码
    
2.2 与if的区别
第一个jxx跳转的地址前面有一个jmp,可以判断是if else语句。
2.3 if -else 的特点:
从上往下判断,只要有一个条件执行了,其他的一概不执行。         

3Demo

Fun:                                        
012113F0  push        ebp                           int g_n =10;            
012113F1  mov         ebp,esp                            void Fun(int x,int y)          
012113F3  sub         esp,0D8h                               {          
012113F9  push        ebx                                int loc1 = g_n;        
012113FA  push        esi                                int loc2 = 2;      
012113FB  push        edi                                if ( x>=y)     
012113FC  lea         edi,[ebp+FFFFFF28h]                                {      
01211402  mov         ecx,36h                                   loc2+=1;    
01211407  mov         eax,0CCCCCCCCh                                 }      
0121140C  rep stos    dword ptr es:[edi]                                        
0121140E  mov         eax,dword ptr ds:[01218000h]                                   if ( x<y)      
01211413  mov         dword ptr [ebp-8],eax                                  {      
01211416  mov         dword ptr [ebp-14h],2                                      g_n = loc2;    
0121141D  mov         eax,dword ptr [ebp+8]                                  }      
01211420  cmp         eax,dword ptr [ebp+0Ch]                                else       
01211423  jl          0121142E                                   {      
01211425  mov         eax,dword ptr [ebp-14h]                                   g_n =   loc1 + loc2;    
01211428  add         eax,1                                         
0121142B  mov         dword ptr [ebp-14h],eax                                }      
0121142E  mov         eax,dword ptr [ebp+8]                                         
01211431  cmp         eax,dword ptr [ebp+0Ch]                                printf("%d",g_n);      
01211434  jge         01211440                                          
01211436  mov         eax,dword ptr [ebp-14h]                            }          
01211439  mov         dword ptr ds:[01218000h],eax                                          
0121143E  jmp         0121144B                                          
01211440  mov         eax,dword ptr [ebp-8]                             参数  ebp+8   x   
01211443  add         eax,dword ptr [ebp-14h]                               ebp+c   y   
01211446  mov         dword ptr ds:[01218000h],eax                                          
0121144B  mov         esi,esp                                       
0121144D  mov         eax,dword ptr ds:[01218000h]                              局部变量    ebp-4   loc1 =g_N   
01211452  push        eax                               ebp-8   loc2 = 2    
01211453  push        1215880h                                          
01211458  call        dword ptr ds:[012192BCh]                                          
0121145E  add         esp,8                             全局  g_n 4225c4      
01211461  cmp         esi,esp                                       
01211463  call        01211154                                          
01211468  pop         edi                           功能  if x》=y     if(x>=y)
01211469  pop         esi                               loc2+=1;        {loc2 ++=
0121146A  pop         ebx                                       
0121146B  add         esp,0D8h                                  if x<y      
01211471  cmp         ebp,esp                           返回值 g_n = loc2      
01211473  call        01211154                                          
01211478  mov         esp,ebp                               else        
0121147A  pop         ebp                               g_n+=loc2       
0121147B  ret                                       

三、If-else-if

1 if–else if–else 多分支语句的反汇编判断:

if_begin:   
    影响标志位的指令
    jxx else_if_begin
    ….
if_end: 
    jmp end
else_if_begin:  
    影响标志位的指令
    jxx else_begin
    …
else_if_end:    
    jmp end

else_gegin: 
    …
else_end    

end:    
    …

2 分析:

  • 1、当每个条件跳转指令要跳转的地址前面都有jmp指令

  • 2、这些jmp指令跳转的地址都是一样的

  • 3、如果某个分支没有条件判断,则为else部分

3 Demo

Fun_ifelseif:
00F614B0  push        ebp  
00F614B1  mov         ebp,esp  
00F614B3  sub         esp,0C0h  
00F614B9  push        ebx  
00F614BA  push        esi  
00F614BB  push        edi  
00F614BC  lea         edi,[ebp+FFFFFF40h]  
00F614C2  mov         ecx,30h  
00F614C7  mov         eax,0CCCCCCCCh  
00F614CC  rep stos    dword ptr es:[edi]  
00F614CE  mov         eax,dword ptr [ebp+8]  
00F614D1  cmp         eax,dword ptr [ebp+0Ch]  
00F614D4  jle         00F614E0  
00F614D6  mov         eax,dword ptr [ebp+8]  
00F614D9  mov         dword ptr ds:[00F68000h],eax  
00F614DE  jmp         00F6150E  
00F614E0  mov         eax,dword ptr [ebp+8]  
00F614E3  cmp         eax,dword ptr [ebp+10h]  
00F614E6  jle         00F614F2  
00F614E8  mov         eax,dword ptr [ebp+10h]  
00F614EB  mov         dword ptr ds:[00F68000h],eax  
00F614F0  jmp         00F6150E  
00F614F2  mov         eax,dword ptr [ebp+0Ch]  
00F614F5  cmp         eax,dword ptr [ebp+10h]  
00F614F8  jle         00F61504  
00F614FA  mov         eax,dword ptr [ebp+0Ch]  
00F614FD  mov         dword ptr ds:[00F68000h],eax  
00F61502  jmp         00F6150E  
00F61504  mov         dword ptr ds:[00F68000h],457h  
00F6150E  pop         edi  
00F6150F  pop         esi  
00F61510  pop         ebx  
00F61511  mov         esp,ebp  
00F61513  pop         ebp  
00F61514  ret  
void Fun_ifelseif(int x,int y,int z)            
 {          

     if ( x>y)      
     {      
         g_n = x;   
     }else if ( x> z)       
     {      
         g_n = z;   
     }      
     else if(y >z)      
     {      
         g_n =   y; 

     }      
     else       
     {      
         g_n =1111; 
     }      

 }          

00F61504
这个地址上面有个jmp ,后面也没比较了,并且还有代码,就知道
这就是else 了。
if-else-if :            

跳的地址上面有个jmp 和if else一样          

然后紧跟的又是一个比较。            

几个jmp 都跳到刷锅了。----重要特征           

四、变形的If-else

 1 int z = x== y;

    {   
        013E3C5E  mov         eax,dword ptr [ebp+8]  
        013E3C61  cmp         eax,dword ptr [ebp+0Ch]  
        013E3C64  jne         013E3C72  
        013E3C66  mov         dword ptr [ebp+FFFFFF30h],1  
        013E3C70  jmp         013E3C7C  
        013E3C72  mov         dword ptr [ebp+FFFFFF30h],0  
        013E3C7C  mov         ecx,dword ptr [ebp+FFFFFF30h]  
        013E3C82  mov         dword ptr [ebp-8],ecx  
    }   

2 z = x>y?x:y;

z = x>y?x:y;        

汇编里面和if-else一样,只是为了写代码方便。       

五、其他知识点

IDA把入口点识别为导出表       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值