sub_E90代码分析
继续分析接下来的switch分支情况
1 | case 144: |
其实可以看出这些情况主要负责执行控制指令,JMP、JZ、JNZ、JG、JS、JNS这些指令。
对于144,执行的是无条件跳转指令JMP,跳转到相应的地址。
145,执行的是等于零则跳转指令JZ,跳转到相应的地址。
146,执行的是不等于零则跳转指令JNZ,跳转到相应的地址。
147,执行的是负号则跳转指令JS,跳转到相应的地址。
148,执行的是不大于0则跳转指令JNG,跳转到相应的地址。
149,执行的是大于0则跳转指令JG,跳转到相应的地址。
150,执行的是非负则跳转指令JNS,跳转到相应的地址。
只看这些伪代码是分析不出来具体指令的,比如说当和0比较的时候,如何区别JS和JL呢,在这时就要结合汇编代码一起看了,看IDA文本视图,就别看IDA图形视图了,找线和框框容易找哭。文本视图里case的情况都是集中在一起的,更容易分析。然后根据汇编代码确定出具体的指令,拿伪代码做验证,这样就可以了。
总结
先来总结今天遇到的汇编代码
指令 | 含义 | 操作码 |
---|---|---|
JMP $R | 跳转到$R给出的地址 | 32 |
JZ $R1,$R2,$R3 | 如果$R1=$R2,跳转到R3给出的地址 | 33 |
JNZ $R1,$R2,$R3 | 如果$R1!=$R2,跳转到R3给出的地址 | 34 |
JS $R1,$R2 | 如果$R1<0,跳转到R2给出的地址 | 35 |
JNS $R1,$R2 | 如果$R1>=0,跳转到R2给出的地址 | 38 |
JG $R1,$R2,$R3 | 如果$R1>$R2,跳转到R3给出的地址 | 37 |
JNG $R1,$R2,$R3 | 如果$R1<=$R2,跳转到R3给出的地址 | 36 |
JMP指令的实现很简单,把$IP寄存器的值修改为JMP指令的寄存器操作数里的数值就行了。
1 | JMP: |