前言
由于这几天在弄论文查重以及论文修改相关的事情,所以没有及时更新博客内容。
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函数中出现的寻址方式:
-
立即数寻址
-
段间间接寻址
-
寄存器寻址