iOS逆向安防从入门到秃头--switch-case分析

·  阅读 355

小谷秃头合集

  • 兄弟们--今天有时间研究这个switch了。哪里有不对的地方,大家可以指指点点

1. switch-case简单分析

    1. 首先。我们写一个简单的switch语句
void judgeSwitch(int a){
    switch (a) {
        case 10:
            printf("我是小明\n");
            break;
        case 2:
            printf("我是小白\n");
            break;
        case 7:
            printf("我是小黑\n");
            break;
            
        default:
            printf("我是小谷\n");
            break;
    }
}
复制代码
    1. 在好多人眼里,switch-caseif-else差不多,都是个判断选择~
    1. 但是也流传着一句话:switch-caseif-else

哦吼~,我们今天找到了主要目标了,为什么会流传着这么一句话?

2. switch-case汇编分析

还是上面的代码~

    1. 调用: judgeSwitch(5);
    1. 我们通过汇编看下switch-caseif-else有什么异同?

1.png

我们分析汇编看到:还是不停的判断不停的跳转

感觉和if-else没啥区别~

    1. 疑问:但是上面的为啥要让传入的参数减去0x2呢?(我怀疑是最小的case,但是我没有证据~)

2.1. case个数为4个

既然没有证据,那就寻找下证据~

    1. 这个时候,我加入了一个比2还小的case(也就是1了~)
    1. 代码
void judgeSwitch(int a){
    switch (a) {
        case 10:
            printf("我是小明\n");
            break;
        case 2:
            printf("我是小白\n");
            break;
        case 7:
            printf("我是小黑\n");
            break;
        case 1:
            printf("我是小芳\n");
            break;
            
        default:
            printf("我是小谷\n");
            break;
    }
}
复制代码

把小芳加入,看看效果是不是减一了~

2.1.1 switch-caseD炸天操作

    1. 我们继续上面的问题:看汇编代码是不是减一

2.png

他果然是减一

    1. 但是这个时候我们发现了新的情况:与if-else不同了,粗略看好像是通过一次比较--然后地址偏移取值~他怎么做到了?
    1. 我们带着疑问,仔细分析一波~

3.png

    1. 不经意间再次感叹LLVM的强大

3. switch-case流程总结

  • 小谷非常细心的画了一波流程图(有点丑~兄弟们不要取笑我)

4.png

4. 总结

    1. 兄弟们常说的switch-caseif-else好是有原因的~
    1. switch的条件判断的区间是有限制有规律的,不能差距过大
    1. case个数只有大于等于4个的时候才会比if-else有优势
    1. switch的参数是我们定义的,case也是我们开发者写的----所以,兄弟们可以搞起来了
    1. 当然,最后一步要感谢了! 哈哈哈,就希望和兄弟们共同进步吧。
分类:
iOS
标签: