/**************************************php
/* 做者:半斤八兩測試
/* 博客:http://cnblogs.com/bjblcrackedspa
/* 日期:2014-12-08 19:01code
/**************************************blog
只是感興趣,沒有其餘目的。失誤之處敬請諸位大俠賜教!ip
最近在研究虛擬機還原,偶然發現這個快速尋找Handle的方法.如今就把這個方法分享給你們 :) get
破解或者逆向的時候常常遇到程序加了虛擬機保護.每當遇到虛擬機時,新人多半就是直接放棄,有經驗的就是頭疼着搞,邊搞邊頭疼 :(博客
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 00236987 10 011B3258 80236813 11 011B325C C02368D7 12 011B3260 80236640 13 011B3264 00236A7B 14 011B3268 C0236A1C 15 011B326C 4023679B 16 011B3270 00236907 17 011B3274 00236727 18 011B3278 C0236605 19 011B327C C0236A1C 20 011B3280 6023694B 21 011B3284 E0236A57 22 011B3288 202365C1 23 011B328C A02367FF 24 011B3290 C02367A6 25 011B3294 202367AE 26 011B3298 4023681A 27 011B329C C023660D 28 011B32A0 00236907 29 011B32A4 402368EC 30 011B32A8 00236907 31 011B32AC A0236ABB 32 011B32B0 E02365E2 33 011B32B4 C023660D 34 011B32B8 002365F5 35 011B32BC 0023695B 36 011B32C0 00236A3B 37 011B32C4 A0236607 38 011B32C8 6023694B 39 011B32CC 40236769 40 011B32D0 00236727 41 011B32D4 20236962 42 011B32D8 602369C2 43 011B32DC 00236921 44 011B32E0 C023687E 45 011B32E4 C023660D 46 011B32E8 00236892 47 011B32EC 402366DE 48 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 cmc 10 011B2F8A C1CA 1D ror edx,1D // 這裏是解密Handle 11 011B2F8D 57 push edi 12 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 cl 10 011B3779 29C0 sub eax,eax 11 011B377B F7C4 9E651C71 test esp,711C659E 12 011B3781 66:0FBEC9 movsx cx,cl 13 011B3785 89C1 mov ecx,eax 14 011B3787 F8 clc 15 011B3788 C1E0 07 shl eax,7 16 011B378B 56 push esi 17 011B378C 9C pushfd 18 011B378D F8 clc 19 011B378E C1E9 19 shr ecx,19 20 011B3791 E8 59110000 call VMProtec.011B48EF 21 22 011B48EF F9 stc 23 011B48F0 9C pushfd 24 011B48F1 F9 stc 25 011B48F2 09C8 or eax,ecx 26 011B48F4 9C pushfd 27 011B48F5 9C pushfd 28 011B48F6 3202 xor al,byte ptr ds:[edx] 29 011B48F8 68 8EE25741 push 4157E28E 30 011B48FD 42 inc edx 31 011B48FE E8 80FCFFFF call VMProtec.011B4583 32 33 011B4583 FF4D 00 dec dword ptr ss:[ebp] 34 011B4586 ^ E9 6AF3FFFF jmp VMProtec.011B38F5 35 36 011B38F5 /E9 03140000 jmp VMProtec.011B4CFD 37 38 011B4CFD 60 pushad 39 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=FFFFBF2D 11 0061E589 Main sub esp,5 ; FL=A, ESP=0012FE5B 12 0061E58C Main jmp short Shielden.0061E546 13 0061E546 Main jg short Shielden.0061E55C 14 0061E55C Main mov dx,word ptr ss:[esp+2] ; EDX=FFFF00DC 15 0061E561 Main lea esp,dword ptr ss:[esp+1] ; ESP=0012FE5C 16 0061E565 Main jmp Shielden.0061D050 17 0061D050 Main add ebx,65D77E6D ; FL=CA, EBX=0062ADBC // 這裏是解密Handle 18 0061D056 Main jmp Shielden.0061E6F1 19 0061E6F1 Main mov edx,dword ptr ss:[esp] ; EDX=0000DC00 20 0061E6F4 Main jmp Shielden.0061E5A8 21 0061E5A8 Main stc 22 0061E5A9 Main jpe short Shielden.0061E58E 23 0061E5AB Main mov dx,bp ; EDX=0000FE90 24 0061E5AE Main jmp short Shielden.0061E591 25 0061E591 Main mov esp,ebp ; ESP=0012FE90 26 0061E593 Main jmp short Shielden.0061E5EF 27 0061E5EF Main mov edx,E01F9EB1 ; EDX=E01F9EB1 28 0061E5F4 Main setl dl ; EDX=E01F9E00 29 0061E5F7 Main sbb edx,edx ; FL=CPAS, EDX=FFFFFFFF 30 0061E5F9 Main jnz short Shielden.0061E5C6 31 0061E5C6 Main btr edx,ebx ; EDX=EFFFFFFF 32 0061E5C9 Main push ebx ; ESP=0012FE8C // Handle入棧 33 Breakpoint at Shielden.0061E5CA 34 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 9A80BAE7 10 0061D374 9A8AD6E5 11 0061D378 9A8B8FED 12 0061D37C 9A8AF541 13 0061D380 9A7FC71E 14 0061D384 9A7E6DF7 15 0061D388 9A7FA40A 16 0061D38C 9A8B3B12 17 0061D390 9A81475C 18 0061D394 9A7FDA30 19 0061D398 9A80C8CA 20 0061D39C 9A8AFB11 21 0061D3A0 9A7F4382 22 0061D3A4 9A802723 23 0061D3A8 9A7F65C9 24 0061D3AC 9A8B99FD 25 0061D3B0 9A8A67D4 26 0061D3B4 9A8A781C 27 0061D3B8 9A8AB00B 28 0061D3BC 9A7FF5C5 29 0061D3C0 9A8B1556 30 0061D3C4 9A9BD5CA 31 0061D3C8 9A803DB8 32 0061D3CC 9A9BE60C 33 0061D3D0 9A7ECA17 34 0061D3D4 9A8BBB40 35 0061D3D8 9A8ABFBA 36 0061D3DC 9A9BB066 37 0061D3E0 9A8B79E5 38 0061D3E4 9A8AE696 39 0061D3E8 9A8A675E 40 0061D3EC 9A804A3E 41 0061D3F0 9A8B6905 42 0061D3F4 9A805E32 43 0061D3F8 9A7FE7F7 44 0061D3FC 9A9C1F77
找到了Handle 剩下的就是」人肉」了 :)
PDF及Trace Log: