• if语句,if...else语句的分析


    if语句的反汇编判断

      if语句的反汇编判断基本是围绕JCC指令的,如果想要有深刻的理解,可以自行练习JCC指令

      执行各类影响标志位的指令
      jxx xxxx
      1、案例一
      mov eax,dword ptr [ebp+8]        分析:cmp指令 影响标志位
      cmp eax,dword ptr [ebp+0Ch]         jle :小于或者等于就跳转到00401059
      jle 00401059

      2、案例二
      mov eax,dword ptr [ebp+8]        分析:cmp指令 影响标志位
      cmp eax,dword ptr [ebp+0Ch]         jl :小于则跳转
      jl 00401059

      3、案例三
      mov eax,dword ptr [ebp+8]       jge :大于或者等于则跳转
      cmp eax,dword ptr [ebp+0Ch]
      jge 00401059

      4、案例四
      mov eax,dword ptr [ebp+8]       jg :大于则跳转
      cmp eax,dword ptr [ebp+0Ch]
      jg 00401059

      仅列举少许,有兴趣可以尝试全部的JCC指令,以便加深理解

    案例分析

      在分析if语句时,我们得先有一个整体概念,即在函数调用前,先分析大段,如下:

      函数调用处代码:

      push 5          分析:
      push 4          两个参数
      call 0040100f
      add esp,8

      分析第一个实例:

     1 00401030   push        ebp                    
     2 00401031   mov         ebp,esp                    
     3 00401033   sub         esp,40h                    
     4 00401036   push        ebx                    
     5 00401037   push        esi                    
     6 00401038   push        edi                    
     7 00401039   lea         edi,[ebp-40h]                    
     8 0040103C   mov         ecx,10h                    
     9 00401041   mov         eax,0CCCCCCCCh                    
    10 00401046   rep stos    dword ptr [edi]                    
    11 00401048   mov         eax,dword ptr [ebp+8]                    
    12 0040104B   cmp         eax,dword ptr [ebp+0Ch]                    
    13 0040104E   jle         00401059                    
    14 00401050   mov         ecx,dword ptr [ebp+8]                    
    15 00401053   mov         dword ptr [004225c4],ecx                    
    16 00401059   pop         edi                    
    17 0040105A   pop         esi                    
    18 0040105B   pop         ebx                    
    19 0040105C   mov         esp,ebp                    
    20 0040105E   pop         ebp                    
    21 0040105F   ret

      我在Excel中将其用颜色标注,上下两段颜色一样的,我们可以不用看,之前有过探究,开辟堆栈所进行的一系列操作,实际功能块就是中间紫色那块

              

       我们的分析过程可大致分为下面五个步骤:

      函数内部功能分析:

      1、分析参数:
      [ebp+8] : X [ebp+0Ch] :Y

      2、分析局部变量
      无

      3、分析全局变量
      mov dword ptr 004225c4,ecx

      4、功能分析
      mov eax,dword ptr [ebp+8]
      cmp eax,dword ptr [ebp+0Ch]

      将参数X存到到EAX中,然后比较EAX,与参数Y的大小
      如果X<=Y 那么跳转到00401059的位置

      否则,将X的值存储到全局变量中

      5、返回值分析
      无

      分析第二个实例:

      调用处代码:

      push 5
      push 4
      call 0040100f
      add esp,8

      函数内部:

     1 00401030   push        ebp                    
     2 00401031   mov         ebp,esp                    
     3 00401033   sub         esp,44h                    
     4 00401036   push        ebx                    
     5 00401037   push        esi                    
     6 00401038   push        edi                    
     7 00401039   lea         edi,[ebp-44h]                    
     8 0040103C   mov         ecx,11h                    
     9 00401041   mov         eax,0CCCCCCCCh                    
    10 00401046   rep stos    dword ptr [edi]                    
    11 00401048   mov         eax,[004225c4]                    
    12 0040104D   mov         dword ptr [ebp-4],eax                    
    13 00401050   mov         ecx,dword ptr [ebp+8]                    
    14 00401053   cmp         ecx,dword ptr [ebp+0Ch]                    
    15 00401056   jg          00401064                    
    16 00401058   mov         edx,dword ptr [ebp+0Ch]                    
    17 0040105B   add         edx,dword ptr [ebp-4]                    
    18 0040105E   mov         dword ptr [004225c4],edx                    
    19 00401064   pop         edi                    
    20 00401065   pop         esi                    
    21 00401066   pop         ebx                    
    22 00401067   mov         esp,ebp                    
    23 00401069   pop         ebp                    
    24 0040106A   ret

      我还是在Excel中标注一下颜色:

             

      函数内部功能分析:

      1、分析参数:
      Y: ebp+8     Z: ebp+c

      2、分析局部变量
      A:ebp-4

      3、分析全局变量
      Global:dword ptr [004225c4],edx

      4、功能分析

      a、00401048 mov eax,[004225c4]
      0040104D mov dword ptr [ebp-4],eax
      A = Global


      b、00401050 mov ecx,dword ptr [ebp+8]
      00401053 cmp ecx,dword ptr [ebp+0Ch]
      参数Y与Z比较大小


      c、00401056 jg 00401064
      如果Y比Z大,则跳转至0x00401064,否则程序走下一步


      d、00401058 mov edx,dword ptr [ebp+0Ch]
      0040105B add edx,dword ptr [ebp-4]
      0040105E mov dword ptr [004225c4],edx
      到这一步,说明Y小于等于Z,将Z与A相加,并把相加的值赋给Global

      5、返回值分析
      无
      6、还原成C函数

    1 int Global;
    2 void function(int Z, int Y)        
    3 {
    4     int A = Global;
    5     if (Y <= Z)
    6     {
    7         Global = A + Z;
    8     }
    9 }

    IF...ELSE...语句的反汇编判断:

      IF...ELSE...语句的反汇编判断:
      IF_BEGIN:
      先执行各类影响标志位的指令
      jxx ELSE_BEGIN
      ......
      IF_END:
      jmp END
      ELSE_BEGIN:
      ......
      ELSE_END:
      END:

      特点分析:

      1、如果不跳转,那么会执行到jmp处,jmp直接跳转到END处

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

      总结:

      跳转执行一部分代码,不跳转执行另外一部分代码

      第一个jxx跳转的地址前面有一个jmp ,可以判断是if...else...语句

    第一个案例分析

     1 004010B0   push        ebp                    
     2 004010B1   mov         ebp,esp                    
     3 004010B3   sub         esp,44h                    
     4 004010B6   push        ebx                    
     5 004010B7   push        esi                    
     6 004010B8   push        edi                    
     7 004010B9   lea         edi,[ebp-44h]                    
     8 004010BC   mov         ecx,11h                    
     9 004010C1   mov         eax,0CCCCCCCCh                    
    10 004010C6   rep stos    dword ptr [edi]                    
    11 004010C8   mov         eax,[004225c4]                    
    12 004010CD   mov         dword ptr [ebp-4],eax                    
    13 004010D0   mov         ecx,dword ptr [ebp+8]                    
    14 004010D3   cmp         ecx,dword ptr [ebp+0Ch]                    
    15 004010D6   jle         004010e6                    
    16 004010D8   mov         edx,dword ptr [ebp+8]                    
    17 004010DB   add         edx,dword ptr [ebp-4]                    
    18 004010DE   mov         dword ptr [004225c4],edx                    
    19 004010E4   jmp         004010f1                    
    20 004010E6   mov         eax,dword ptr [ebp+0Ch]                    
    21 004010E9   add         eax,dword ptr [ebp-4]                    
    22 004010EC   mov         [004225c4],eax                    
    23 004010F1   pop         edi                    
    24 004010F2   pop         esi                    
    25 004010F3   pop         ebx                    
    26 004010F4   mov         esp,ebp                    
    27 004010F6   pop         ebp                    
    28 004010F7   ret

             

      函数内部功能分析:

      1、分析参数:
      [ebp+8] : X [ebp+0Ch] :Y

      2、分析局部变量
      [ebp-4] = eax = [004225c4]

      3、分析全局变量
      [004225c4] G

      4、功能分析

      a、004010C8 mov eax,[004225c4]
      004010CD mov dword ptr [ebp-4],eax
      Local = Global


      b、004010D0 mov ecx,dword ptr [ebp+8]
      004010D3 cmp ecx,dword ptr [ebp+0Ch]
      比较X与Y的大小

      c、如果Y<=X 那么执行
      004010E6 mov eax,dword ptr [ebp+0Ch] X
      004010E9 add eax,dword ptr [ebp-4] Local + X
      004010EC mov [004225c4],eax Global = Local + X


      d、如果Y>X 那么执行
      004010D8 mov edx,dword ptr [ebp+8] Y
      004010DB add edx,dword ptr [ebp-4] Local + Y
      004010DE mov dword ptr [004225c4],edx Global = Local + Y
      004010E4 jmp 004010f1

      5、返回值分析
      无

    第二个案例分析

     1 004010B0   push        ebp                    
     2 004010B1   mov         ebp,esp                    
     3 004010B3   sub         esp,48h                    
     4 004010B6   push        ebx                    
     5 004010B7   push        esi                    
     6 004010B8   push        edi                    
     7 004010B9   lea         edi,[ebp-48h]                    
     8 004010BC   mov         ecx,12h                    
     9 004010C1   mov         eax,0CCCCCCCCh                    
    10 004010C6   rep stos    dword ptr [edi]                    
    11 004010C8   mov         eax,[004225c4]                    
    12 004010CD   mov         dword ptr [ebp-4],eax                    
    13 004010D0   mov         dword ptr [ebp-8],2                    
    14 004010D7   mov         ecx,dword ptr [ebp+8]                    
    15 004010DA   cmp         ecx,dword ptr [ebp+0Ch]                    
    16 004010DD   jl          004010e8                    
    17 004010DF   mov         edx,dword ptr [ebp-8]                    
    18 004010E2   add         edx,1                    
    19 004010E5   mov         dword ptr [ebp-8],edx                    
    20 004010E8   mov         eax,dword ptr [ebp+8]                    
    21 004010EB   cmp         eax,dword ptr [ebp+0Ch]                    
    22 004010EE   jge         004010fb                    
    23 004010F0   mov         ecx,dword ptr [ebp-8]                    
    24 004010F3   mov         dword ptr [004225c4],ecx                    
    25 004010F9   jmp         00401107                    
    26 004010FB   mov         edx,dword ptr [ebp-4]                    
    27 004010FE   add         edx,dword ptr [ebp-8]                    
    28 00401101   mov         dword ptr [004225c4],edx                    
    29 00401107   pop         edi                    
    30 00401108   pop         esi                    
    31 00401109   pop         ebx                    
    32 0040110A   mov         esp,ebp                    
    33 0040110C   pop         ebp                    
    34 0040110D   ret

             

     分析过程如下:

             

  • 相关阅读:
    Python的可变和不可变类型
    Pycharm设置语法规范快捷键方式
    python学习0305作业
    关于jQuery对象与DOM对象
    ie6下子元素撑大父元素
    Hibernate持久层ORM框架
    基于注解的事务管理
    掌握基于AOP事务管理
    Spring事务管理
    事务保存点savepoint
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11621191.html
Copyright © 2020-2023  润新知