Switch函数分析

Hello world,hello blog!

Posted by 吴柚 on May 19, 2019

前言

由于这几天在弄论文查重以及论文修改相关的事情,所以没有及时更新博客内容。

Switch函数部分

上次分析到Switch函数部分,现在对Switch函数进行分析。

	  case 144:
        goto LABEL_38;
      case 145:
        if ( !*((_DWORD *)v1 + 10) )
          goto LABEL_38;
        return v2;
      case 146:
        if ( !*((_DWORD *)v1 + 10) )
          return v2;
        goto LABEL_38;
      case 147:
        if ( *((_DWORD *)v1 + 10) < 0 )
          goto LABEL_38;
        return v2;
      case 148:
        if ( *((_DWORD *)v1 + 10) <= 0 )
          goto LABEL_38;
        return v2;
      case 149:
        if ( *((_DWORD *)v1 + 10) <= 0 )
          return v2;
        goto LABEL_38;
      case 150:
        if ( *((_DWORD *)v1 + 10) >= 0 )
LABEL_38:
          *((_WORD *)v1 + 15) = __ROL2__(*((_WORD *)v7 + 1), 8) + v8;
        return v2;

由于此函数过于复杂,从下图可以看出,汇编代码中表现出的逻辑非常复杂。

我将上图放大,分别找到每一个case的跳转指令,分别为:

144,执行的是无条件跳转指令JMP,跳转到相应的地址。 145,执行的是等于零则跳转指令JZ,跳转到相应的地址。 146,执行的是不等于零则跳转指令JNZ,跳转到相应的地址。 147,执行的是负号则跳转指令JS,跳转到相应的地址。 148,执行的是不大于0则跳转指令JNG,跳转到相应的地址。 149,执行的是大于0则跳转指令JG,跳转到相应的地址。 150,执行的是非负则跳转指令JNS,跳转到相应的地址。

不过这一题,一定需要从汇编代码来分析,仅仅从C语言伪代码是分析不出具体内容的。

目前我所了解到的寻址方式

main函数中出现的寻址方式:

  • 立即数寻址

  • 段间间接寻址

  • 寄存器寻址