if
跳转
特征
- 不满足向下跳转,汇编的跳转条件和源码中的逻辑取反。
if-else
->cmp-比较取反+jmp-标签
- 有可能使用
return
优化if
最后的jmp
跳转
- 单分支很难优化,双分支、多分支优化空间大。
单分支
&&
连接
||
定式
最后一个||
中的条件取反。
逆向还原时,最后一个条件取反
双分支
三目运算符优化
代码外提-体积优化
提出公共部分,逆向时不需要管。
减少跳转
switch
分支
case
小于等于3个
大于3个分支
当大于三个分支且case
中最大值和最小值的差值在255
以内,此时会生成跳表。
跳表优化
双表优化
条件:最大值和最小值差值在0-255
之间。
增加新的跳表下标表。
折半优化-二叉树优化
条件:差值较大
先判断中间条件。
还原的时候也算是比较清晰的。
循环
所有循环的特征都是上跳。
do-while
循环
特征:先执行再判断,向上跳转。
优化空间:平坦优化(可能)。
Debug、Release区别:无。
while
循环
特征:先判断再执行,向上跳转。
Debug、Release区别:Release优化为if + do-while
循环(大部分情况)。
for
循环
MSVC+Debug版:1. 初始化 2. 步长 3. 比较 4. 循环体执行 5. 跳转2
MSVC+Release版:(初始值确定)优化为do-while
版。