首页 > 代码库 > 纯手工秒杀VM,SE等虚拟机Handle
纯手工秒杀VM,SE等虚拟机Handle
/**************************************
/* 作者:半斤八兩
/* 博客:http://cnblogs.com/bjblcracked
/* 日期:2014-12-08 19:01
/**************************************
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
最近在研究虚拟机还原,偶然发现这个快速寻找Handle的方法.现在就把这个方法分享给大家 :)
破解或者逆向的时候经常遇到程序加了虚拟机保护.每当遇到虚拟机时,新人多半就是直接放弃,有经验的就是头疼着搞,边搞边头疼 :(
VMProtect的Handle非常好找, 从壳的EP处起, 只要人肉一会就能找到Handle.
Vmprotect无论编译选择是设成怎样, 一般都不会超过200条指令就能找到Handle.
我们先来看看如何快速寻找Vmprotect Handle.
首先就是OD加载Vmprotect.exe, 本例直接拿 Vmprotect 2.13.5 主程序做测试.
加载完后,我们打开 View 菜单 选择 Run trace.
打开Run trace 菜单后, 对着菜单 右键 另存 log 到文件.
然后我们就直接按 Shift + F11 跟踪运行. (前题是要清除所有断点.)
运行3秒后, 轻按一下f7.
然后我们再到 Run trace 界面右键 关闭log 文件.
然后我们直接打开 log 文件, 查找 “*” 星号, 就能直接找到Handle. 是不是很方便?
1 011B2F82 Main mov edx,dword ptr ds:[eax*4+11B3234] ; EDX=A0236748
其中 11B3234 就是Handle的地址了.我们再到数据窗口 地址形式显示 看看Handle
1 011B3234 402366DE 2 011B3238 C0236876 3 011B323C A0236ABB 4 011B3240 4023679B 5 011B3244 A0236779 6 011B3248 00236907 7 011B324C E0236AEC 8 011B3250 C02367C8 9 011B3254 0023698710 011B3258 8023681311 011B325C C02368D712 011B3260 8023664013 011B3264 00236A7B14 011B3268 C0236A1C15 011B326C 4023679B16 011B3270 0023690717 011B3274 0023672718 011B3278 C023660519 011B327C C0236A1C20 011B3280 6023694B21 011B3284 E0236A5722 011B3288 202365C123 011B328C A02367FF24 011B3290 C02367A625 011B3294 202367AE26 011B3298 4023681A27 011B329C C023660D28 011B32A0 0023690729 011B32A4 402368EC30 011B32A8 0023690731 011B32AC A0236ABB32 011B32B0 E02365E233 011B32B4 C023660D34 011B32B8 002365F535 011B32BC 0023695B36 011B32C0 00236A3B37 011B32C4 A023660738 011B32C8 6023694B39 011B32CC 4023676940 011B32D0 0023672741 011B32D4 2023696242 011B32D8 602369C243 011B32DC 0023692144 011B32E0 C023687E45 011B32E4 C023660D46 011B32E8 0023689247 011B32EC 402366DE48 011B32F0 C0236605
我们直接到 011B2F82 这里看看他是如何解密Handle的?
1 011B2F6D 28C3 sub bl,al 2 011B2F6F 66:0FBAE5 0B bt bp,0B 3 011B2F74 0FB6C0 movzx eax,al 4 011B2F77 60 pushad 5 011B2F78 0F97C6 seta dh 6 011B2F7B 66:F7D2 not dx 7 011B2F7E 0FBAE4 19 bt esp,19 8 011B2F82 8B1485 34321B01 mov edx,dword ptr ds:[eax*4+11B3234] 9 011B2F89 F5 cmc10 011B2F8A C1CA 1D ror edx,1D // 这里是解密Handle11 011B2F8D 57 push edi12 011B2F8E FF7424 04 push dword ptr ss:[esp+4]13 011B2F92 E9 79180000 jmp VMProtec.011B4810
我们拿402366EC这条Handle地址来解密试一下.
ROR 402366EC, 0x1d == 011B3762
1 011B3762 C0D1 02 rcl cl,2 2 011B3765 8B55 00 mov edx,dword ptr ss:[ebp] 3 011B3768 0F99C5 setns ch 4 011B376B 28C5 sub ch,al 5 011B376D 80E1 3E and cl,3E 6 011B3770 F6DD neg ch 7 011B3772 83C5 04 add ebp,4 8 011B3775 F6D1 not cl 9 011B3777 F6D1 not cl10 011B3779 29C0 sub eax,eax11 011B377B F7C4 9E651C71 test esp,711C659E12 011B3781 66:0FBEC9 movsx cx,cl13 011B3785 89C1 mov ecx,eax14 011B3787 F8 clc15 011B3788 C1E0 07 shl eax,716 011B378B 56 push esi17 011B378C 9C pushfd18 011B378D F8 clc19 011B378E C1E9 19 shr ecx,1920 011B3791 E8 59110000 call VMProtec.011B48EF21 22 011B48EF F9 stc23 011B48F0 9C pushfd24 011B48F1 F9 stc25 011B48F2 09C8 or eax,ecx26 011B48F4 9C pushfd27 011B48F5 9C pushfd28 011B48F6 3202 xor al,byte ptr ds:[edx]29 011B48F8 68 8EE25741 push 4157E28E30 011B48FD 42 inc edx31 011B48FE E8 80FCFFFF call VMProtec.011B458332 33 011B4583 FF4D 00 dec dword ptr ss:[ebp]34 011B4586 ^ E9 6AF3FFFF jmp VMProtec.011B38F535 36 011B38F5 /E9 03140000 jmp VMProtec.011B4CFD37 38 011B4CFD 60 pushad39 011B4CFE 8D6424 40 lea esp,dword ptr ss:[esp+40]40 011B4D02 ^ 0F85 73EAFFFF jnz VMProtec.011B377B // 计算Hash
通过分析不难看出这个Handle是计算Hash的.
Vmprotect的Handle很少, 而且每个Handle都非常短,现在Handle地址已经拿到了,
剩下的就是花时间分析每个Handle了.剩下的,该破解破解, 该分析分析...
Safengine的Handle也非常好找, 从EP处起,
一般只要人肉几个小时就能找到Handle.(对于新人而言)我就直接拿Safengine主程序来做演示.
主程序好像是用的 Safengine NetLicensor v2.3.3.0加的壳.用什么加壳不重要, 重要的是我们的方法能找到Handle.
首先重复上面Vmprotect的步骤. 再搜索 “*” 时, 会发现,有非常多 类似 [reg*4] 的指令.
那么我们这招就失灵了. 不管他怎么变, 我们总会想到对应的办法的.
程序每次解码完成后,都会跑到虚拟指令里. 跑过去就会更改ip. 那么我们就从改变ip的指令着手.
改变ip的常规手法就是 jcc / ret / call / 等等.
为了节省篇幅我就不一个个试了, 经分析发现 ret 我们还是可以利用的.
我们打开刚才的跟踪Log. 直接搜索 ret . 会发现有很多 ret
带有参数的, 我们就不要看了, 直接看没带参数的. 找到一个:
1 0061E5CA Main retn ; ESP=0012FE90
找到后打开OD,到这个地址下个断点F9运行. 断下来, 再Shift+F9 跟踪运行. 断下来后,就可以关闭 Log. 打开Log 看看最后几行.
1 0061EBE7 Main jmp Shielden.0061D030 2 0061D030 Main add ebx,EEEF5392 ; FL=S, EBX=EEEF554A 3 0061D036 Main jmp Shielden.0061E94A 4 0061E94A Main call Shielden.0061E7E9 ; ESP=0012FE64 5 0061E7E9 Main jmp short Shielden.0061E779 6 0061E779 Main mov edx,dword ptr ss:[esp+3] ; EDX=00000000 7 0061E77D Main not edx ; EDX=FFFFFFFF 8 0061E77F Main call Shielden.0061E57F ; ESP=0012FE60 9 0061E57F Main mov ebx,dword ptr ds:[ebx+11727F72] ; EBX=9A8B2F4F // 这里是Handle藏匿之处10 0061E585 Main mov dx,0BF2D ; EDX=FFFFBF2D11 0061E589 Main sub esp,5 ; FL=A, ESP=0012FE5B12 0061E58C Main jmp short Shielden.0061E54613 0061E546 Main jg short Shielden.0061E55C14 0061E55C Main mov dx,word ptr ss:[esp+2] ; EDX=FFFF00DC15 0061E561 Main lea esp,dword ptr ss:[esp+1] ; ESP=0012FE5C16 0061E565 Main jmp Shielden.0061D05017 0061D050 Main add ebx,65D77E6D ; FL=CA, EBX=0062ADBC // 这里是解密Handle18 0061D056 Main jmp Shielden.0061E6F119 0061E6F1 Main mov edx,dword ptr ss:[esp] ; EDX=0000DC0020 0061E6F4 Main jmp Shielden.0061E5A821 0061E5A8 Main stc22 0061E5A9 Main jpe short Shielden.0061E58E23 0061E5AB Main mov dx,bp ; EDX=0000FE9024 0061E5AE Main jmp short Shielden.0061E59125 0061E591 Main mov esp,ebp ; ESP=0012FE9026 0061E593 Main jmp short Shielden.0061E5EF27 0061E5EF Main mov edx,E01F9EB1 ; EDX=E01F9EB128 0061E5F4 Main setl dl ; EDX=E01F9E0029 0061E5F7 Main sbb edx,edx ; FL=CPAS, EDX=FFFFFFFF30 0061E5F9 Main jnz short Shielden.0061E5C631 0061E5C6 Main btr edx,ebx ; EDX=EFFFFFFF32 0061E5C9 Main push ebx ; ESP=0012FE8C // Handle入栈33 Breakpoint at Shielden.0061E5CA34 0061E5CA Main retn // 进入虚拟机35 Run trace closed
我们在 0061E57F 处下断点, 看看信息窗口显示的,就是Handle所在处了.
信息窗口显示如下:
ds:[0061D34C]=9A8ABFBA
ebx=EEEF53DA
0061D34C 处显示的就是Handle 所在地了.
1 0061D350 9A7F1BFB 2 0061D354 9A9C3F3E 3 0061D358 9A8A675E 4 0061D35C 9A8B1C48 5 0061D360 9A7F4D05 6 0061D364 9A8ADA8E 7 0061D368 9A8A675E 8 0061D36C 9A809549 9 0061D370 9A80BAE710 0061D374 9A8AD6E511 0061D378 9A8B8FED12 0061D37C 9A8AF54113 0061D380 9A7FC71E14 0061D384 9A7E6DF715 0061D388 9A7FA40A16 0061D38C 9A8B3B1217 0061D390 9A81475C18 0061D394 9A7FDA3019 0061D398 9A80C8CA20 0061D39C 9A8AFB1121 0061D3A0 9A7F438222 0061D3A4 9A80272323 0061D3A8 9A7F65C924 0061D3AC 9A8B99FD25 0061D3B0 9A8A67D426 0061D3B4 9A8A781C27 0061D3B8 9A8AB00B28 0061D3BC 9A7FF5C529 0061D3C0 9A8B155630 0061D3C4 9A9BD5CA31 0061D3C8 9A803DB832 0061D3CC 9A9BE60C33 0061D3D0 9A7ECA1734 0061D3D4 9A8BBB4035 0061D3D8 9A8ABFBA36 0061D3DC 9A9BB06637 0061D3E0 9A8B79E538 0061D3E4 9A8AE69639 0061D3E8 9A8A675E40 0061D3EC 9A804A3E41 0061D3F0 9A8B690542 0061D3F4 9A805E3243 0061D3F8 9A7FE7F744 0061D3FC 9A9C1F77
找到了Handle 剩下的就是”人肉”了 :)
PDF及Trace Log:
<看雪学院>
纯手工秒杀VM,SE等虚拟机Handle