- 当switch的分支不多于3个的时候,和if ..else.类似
00401038 mov eax,dword ptr [ebp+8]
0040103B mov dword ptr [ebp-4],eax
0040103E cmp dword ptr [ebp-4],0
00401042 je function+32h (00401052)
00401044 cmp dword ptr [ebp-4],2
00401048 je function+41h (00401061)
0040104A cmp dword ptr [ebp-4],3
0040104E je function+50h (00401070)
00401050 jmp function+5Fh (0040107f)
- 分支多于3个并连续,生成一张大表
00401038 mov eax,dword ptr [ebp+8]
0040103B mov dword ptr [ebp-4],eax
0040103E mov ecx,dword ptr [ebp-4]
00401041 sub ecx,101h
00401047 mov dword ptr [ebp-4],ecx
0040104A cmp dword ptr [ebp-4],4
0040104E ja $L541+0Fh (004010a5)
00401050 mov edx,dword ptr [ebp-4]
00401053 jmp dword ptr [edx*4+4010C3h]
- sub ecx,101h 101为最小分支值
- cmp dword ptr [ebp-4],4 4为最大的差值
jmp dword ptr [edx*4+4010C3h] 指向大表 edx是与最小值得差值,用他来表示位于表的第几项
大表:
如果分支中的值相差较大会生成小表和大表
00401038 mov eax,dword ptr [ebp+8]
0040103B mov dword ptr [ebp-4],eax
0040103E mov ecx,dword ptr [ebp-4]
00401041 sub ecx,101h
00401047 mov dword ptr [ebp-4],ecx
0040104A cmp dword ptr [ebp-4],0Fh
0040104E ja $L541+0Fh (004010ad)
00401050 mov eax,dword ptr [ebp-4]
00401053 xor edx,edx
00401055 mov dl,byte ptr (004010e3)[eax]
0040105B jmp dword ptr [edx*4+4010CBh]
- mov eax,dword ptr [ebp-4] eax里是差值即第几项
mov dl,byte ptr (004010e3)[eax] 4010e3.是小表!
由这张表和反汇编可以推断出分支的最小值是101hcase 101——-大表的第0项
- 102 103 104 105 106都没有 ——–指向大表的第5项 default
- case 107——-大表的第1项
- case 108——-大表的第2项
- case 109——-大表的第3项
- 10a 10b 10c 10e 10f 没有——–指向大表的第5项 default
- case 110——-大表的第4项
下面查看大表
可以看到大表下面紧跟着小表