switch语句case后面的范围怎么写_SwitchCase语句反汇编分析

SwitchCase语句反汇编分析

在逆向中经常会遇到switch语句,在这里做一个总结,如果有错误,望师傅们可以指正。

switch要求

  1. case后面必须是常量表达式

  2. case后常量表达式的值不能一样

  3. switch后面表达式必须为整数

case中必须是常量,常量的值不能一样,switch表达式的结果必须是整型
当分支条件比较小的时候,switch 和 if else 没有区别

1.添加case后面的值,一个一个增加,观察反汇编代码的变化(何时生成大表).

三个case情况下,生成的汇编码和if else 近似

0040F3E8   mov         eax,dword ptr [ebp+8]
0040F3EB mov dword ptr [ebp-4],eax
0040F3EE cmp dword ptr [ebp-4],0
0040F3F2 je Function+32h (0040f402)
0040F3F4 cmp dword ptr [ebp-4],1
0040F3F8 je Function+41h (0040f411)
0040F3FA cmp dword ptr [ebp-4],2
0040F3FE je Function+50h (0040f420)
0040F400 jmp Function+5Fh (0040f42f)
0040F402 push offset string "A" (004241a4)
0040F407 call printf (00401610)
0040F40C add esp,4
0040F40F jmp Function+6Ch (0040f43c)
0040F411 push offset string "B" (00424194)
0040F416 call printf (00401610)
0040F41B add esp,4
0040F41E jmp Function+6Ch (0040f43c)
0040F420 push offset string "B" (00424194)
0040F425 call printf (00401610)
0040F42A add esp,4
0040F42D jmp Function+6Ch (0040f43c)
0040F42F push offset string "Error" (00424214)
0040F434 call printf (00401610)

四个case的情况下,开始生成大表

b968cacd7531fd25f6102fd01debaafb.png

    switch(number)
{ case 0:printf("A");break; case 1:printf("B");break; case 2:printf("B");break; case 3:printf("B");break; default:printf("Error");break;
}

其中case从0开始,没有进行sub处理

尝试case从1开始,看是否有subbe5f737fa32f15bdca6fa8248ef6b2bb.png

    switch(number)
{ case 1001:printf("A");break; case 1002:printf("B");break; case 1003:printf("B");break; case 1004:printf("B");break; default:printf("Error");break;
}

果然出现了sub ecx,1

当case是大数且连续时看sub的情况

    switch(number)
{ case 1004:printf("A");break; case 1001:printf("B");break; case 1002:printf("B");break; case 1003:printf("B");break; default:printf("Error");break;
}

fef0ccc145779d01967f10503fef3a6d.pngsub ecx,3E9h

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值