SwitchCase语句反汇编分析
在逆向中经常会遇到switch语句,在这里做一个总结,如果有错误,望师傅们可以指正。
switch要求
case后面必须是常量表达式
case后常量表达式的值不能一样
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的情况下,开始生成大表
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开始,看是否有sub
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;
}
sub ecx,3E9h
其