C++逆向对于switch的学习

    参考教材:

    环境: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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值