参考教材:
环境:win7 编译器:vs2013 C++
程序源代码:
学习钱老师C++逆向与反汇编基础的switch时,进行试验发现存在case 666时,O1选项编译出的程序依然是采用的索引表+地址表的方法,为此从新选取了试验的case的情况,发现vs2013在过大的项数量较少 (我发现的是1)的情况下仍然会使用过去的索引表+地址表的方法,对于666的情况会在jg比较完之后加一个je比较,当较大的数大于2个时才会使用二项树模拟的方式进行分别。
代码如下:switch (num) //索引表+地址表
{
case (2) :printf("%d",num+1); break;
case (8) :printf("%d",num+134); break;
case (3) :printf("%d",num+32); break;
case (10) :printf("%d",num+111); break;
case (5) :printf("%d",num); break;
case (24) :printf("%d",num+15); break;
case (31) :printf("%d",num+1); break;
case (32) :printf("%d",num-1); break;
case (666) :printf("%d",num-2); break;
case (17) :printf("%d",num-3); break;
case (29) :printf("%d",num-4); break;
}
汇编代码:
00DA3D40 mov eax,dword ptr [num]
00DA3D43 mov dword ptr [ebp-0D0h],eax
00DA3D49 cmp dword ptr [ebp-0D0h],29Ah
00DA3D53 jg main+95h (0DA3D95h)
00DA3D55 cmp dword ptr [ebp-0D0h],29Ah
00DA3D5F je $LN11+111h (0DA3EABh)
00DA3D65 mov ecx,dword ptr [ebp-0D0h]
00DA3D6B sub ecx,2
00DA3D6E mov dword ptr [ebp-0D0h],ecx
00DA3D74 cmp dword ptr [ebp-0D0h],1Eh
00DA3D7B ja $LN11+16Fh (0DA3F09h)
00DA3D81 mov edx,dword ptr [ebp-0D0h]
00DA3D87 movzx eax,byte ptr [edx+0DA3F74h]
00DA3D8E jmp dword ptr [eax*4+0DA3F48h]
00DA3D95 jmp $LN11+16Fh (0DA3F09h)
代码:switch (num) //二项树的情况
{
case (2) :printf("%d",num+1); break;
case (8) :printf("%d",num+134); break;
case (3) :printf("%d",num+32); break;
case (10) :printf("%d",num+111); break;
case (5) :printf("%d",num); break;
case (244) :printf("%d",num+15); break;
case (313) :printf("%d",num+1); break;
case (324) :printf("%d",num-1); break;
case (666) :printf("%d",num-2); break;
case (17) :printf("%d",num-3); break;
case (299) :printf("%d",num-4); break;
}
汇编代码:
013B3D40 mov eax,dword ptr [num]
013B3D43 mov dword ptr [ebp-0D0h],eax
013B3D49 cmp dword ptr [ebp-0D0h],11h
013B3D50 jg main+88h (013B3D88h)
013B3D52 cmp dword ptr [ebp-0D0h],11h
013B3D59 je $LN11+131h (013B3F1Fh)
013B3D5F mov ecx,dword ptr [ebp-0D0h]
013B3D65 sub ecx,2
013B3D68 mov dword ptr [ebp-0D0h],ecx
013B3D6E cmp dword ptr [ebp-0D0h],8
013B3D75 ja $LN11+16Fh (013B3F5Dh)
013B3D7B mov edx,dword ptr [ebp-0D0h]
013B3D81 jmp dword ptr [edx*4+13B3F9Ch]
013B3D88 cmp dword ptr [ebp-0D0h],139h
013B3D92 jg main+0C9h (013B3DC9h)
013B3D94 cmp dword ptr [ebp-0D0h],139h
013B3D9E je $LN11+0D1h (013B3EBFh)
013B3DA4 cmp dword ptr [ebp-0D0h],0F4h
013B3DAE je $LN11+0AEh (013B3E9Ch)
013B3DB4 cmp dword ptr [ebp-0D0h],12Bh
013B3DBE je $LN11+151h (013B3F3Fh)
013B3DC4 jmp $LN11+16Fh (013B3F5Dh)
013B3DC9 cmp dword ptr [ebp-0D0h],144h
013B3DD3 je $LN11+0F1h (013B3EDFh)
013B3DD9 cmp dword ptr [ebp-0D0h],29Ah
013B3DE3 je $LN11+111h (013B3EFFh)