程式碼保護軟體VMP逆向分析虛擬機器指令:指令中包含了函式呼叫

roffey發表於2021-07-08

VMProtect是一種很可靠的工具,可以保護應用程式程式碼免受分析和破解,但只有在應用程式內保護機制正確構建且沒有可能破壞整個保護的嚴重錯誤的情況下,才能實現最好的效果。


VMProtect透過在具有非標準體系結構的虛擬機器上執行程式碼來保護程式碼,這將使分析和破解軟體變得十分困難。除此之外,VMProtect還可以生成和驗證序列號,限制免費升級等等。


下載VMProtect最新試用版【慧都網下載最新試用版】

七、附加 分析如果VM的指令中包含了函式呼叫

材料檔案在vmptestcall2資料夾中,不知道為什麼我這個vm後的exe總報毒,之前上面那個沒報。追蹤時一樣是按Ctrl+F11記錄,我們先看一下原來的彙編是什麼樣:

然後VMP3後我們下的trace斷點:

經過trace 我們得到記錄檔案。我們接下來擷取vm彙編簡單分析
首先進入虛擬機器:

0043D9C2    主    push 0x7EBD5487    ESP=0012FF88                    ; 進入虛擬機器前兆 VM_Entry
0043D9C7    主    call vmptestc.0041258D    ESP=0012FF84
0041258D    主    push edi    ESP=0012FF80
0041258E    主    mov di,0x7063    EDI=00007063
00412592    主    pushfd    ESP=0012FF7C
00412593    主    push ebx    ESP=0012FF78
00412594    主    clc
00412595    主    neg bx    FL=CPS, EBX=7FFD9000

我們直接搜尋puts字串,得到所在位置如下:

00414248    主    jmp vmptestc.0047DE97
0047DE97    主    retn    ESP=0012FF84                             ; 退出虛擬機器環境 進入函式呼叫內部
puts    主    push 0xC    ESP=0012FF80 -----------------------------------------------------------puts
75A68D06    主    push msvcrt.75A68E80    ESP=0012FF7C
75A68D0B    主    call msvcrt.759F9836    FL=0, EAX=0012FF70, ESP=0012FF54, EBP=0012FF80
75A68D10    主    or ebx,0xFFFFFFFF    FL=PS, EBX=FFFFFFFF
75A68D13    主    mov dword ptr ss:[ebp-0x1C],ebx
75A68D16    主    xor eax,eax    FL=PZ, EAX=00000000

而我們往上看,看出上面是退出虛擬機器的程式碼,特徵不要我多說了吧,很多pop,然後只有一個VM_Exit。在往下看看退出puts後緊跟著的是什麼:

75A68E4E    主    mov dword ptr ss:[ebp-0x4],-0x2
75A68E55    主    call msvcrt.75A68E6D
75A68E5A    主    mov eax,dword ptr ss:[ebp-0x1C]
75A68E5D    主    call msvcrt.759F987B    ECX=75A68E62, EBX=7FFD7000, ESP=0012FF84, EBP=0012FF94, ESI=00000000, EDI=00000000
75A68E62    主    retn    ESP=0012FF88                        ; 退出puts
0042AB41    主    push 0x7EB991DF    ESP=0012FF84                 ; 重新進入虛擬機器
0042AB46    主    call vmptestc.0041258D    ESP=0012FF80
0041258D    主    push edi    ESP=0012FF7C
0041258E    主    mov di,0x7063    EDI=00007063
00412592    主    pushfd    ESP=0012FF78
00412593    主    push ebx    ESP=0012FF74
00412594    主    clc

這裡我們看到我們退出puts後,緊跟著並沒有看到呼叫我們的EspArg1函式,而是又進入虛擬機器,難道我們的EspArg1內部被VM了,然後我們繼續往下分析,找下VM_Exit看看。我們直接搜尋特徵: 提示我們可以搜尋popfd,當然僅限這裡,為什麼?

00461852    主    popfd    FL=PZ, ESP=0012FF7C
00461853    主    cmovne edi,esi
00461856    主    movsx edi,sp    EDI=FFFFFF7C
00461859    主    pop edi    ESP=0012FF80, EDI=00000000
0046185A    主    jmp vmptestc.004266A6
004266A6    主    retn    ESP=0012FF84                        ;退出虛擬機器
00401008    主    mov dword ptr ss:[esp+0x4],vmptestc.00403018 ---------------------------EspArg1 function
00401010    主    retn    ESP=0012FF88
0045AAE7    主    push 0x7EB42BBF    ESP=0012FF84                 ;進入虛擬機器
0045AAEC    主    call vmptestc.0041258D    ESP=0012FF80
0041258D    主    push edi    ESP=0012FF7C
0041258E    主    mov di,0x7063    EDI=00007063

嗯什麼情況,我們看到退出虛擬機器,然後下一條就是我們的EspArg1 function裡面的內容("原畫"),然後又進入虛擬機器。
我們其實VM的就這3句:

push offset HelloWord
call crt_puts
call EspArg1

然後我們可以分析一下有多少次退出虛擬機器的操作,我們可以搜尋特徵去分析,經過分析:

1.VM_Entery
............
2.VM_Exit
3.Call puts
4.VM_Entery
...........
5.VM_Exit
6.Call EspArg1
7.VM_Entery
...........
8.VM_Exit

我們主要分析的是被VM程式碼中存在呼叫函式時的問題,所以其他我們不多管,只管這個是怎麼處理呼叫函式的,現在應該可以大致知道是什麼呼叫的了吧。所以知道為什麼有的程式碼被VM了,我們還能東扣西扣的了沒。看到原始碼 call puts 與call EspArg1中間可是沒有程式碼的 ,但還是要重新進入虛擬機器。

如果您對該加密/解密軟體感興趣,歡迎加入vmpQQ交流群:740060302

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69995027/viewspace-2780363/,如需轉載,請註明出處,否則將追究法律責任。

相關文章