vmp3.0.9全保護拆分解析

vmp3.0.9全保護拆分解析

vmp3.0.9全保護拆分解析

以下為了避免插件干擾,故採用x64dbg原版進行分析。

vmp3.0.9全保護拆分解析

首先我通過檢測到調試器的彈窗進行棧回溯,定位到該關鍵點:

CALL eax

由於才接觸Vmp,所以是把各個保護拆分開來進行的分析,會比較簡單一些,不過全保護其實也就是湊在一起罷了,只要注意順序就行啦。

本帖只是分析基礎保護反調試反虛擬機等,不涉及還原VM和分析VM代碼的部分。屬於新手貼一類,適合萌新觀看,大佬輕噴,有錯漏之處,敬請指正,謝謝。

EverEdit編輯器是加的一個vmp的殼子,雖然特徵和這裡分析的不太一致,但是反調試路子大致一樣的,而且雖然是vmp但是通過trace跟蹤和分析也是可以暴力破解的,可以拿來練手,這裡推薦一下。

一、反調試保護

1. 調用 IsDebuggerPresent,判斷返回值eax==1被調試,eax==0沒有調試。

vmp3.0.9全保護拆分解析

vmp3.0.9全保護拆分解析

2. CheckRemoteDebuggerPresent,判斷buffer返回值是0還是1,1被調試,0沒有調試。

vmp3.0.9全保護拆分解析

3. NtQueryInformationProcess,ProcessInfoClass=0x1E 來獲取調試句柄,判斷是否被調試,調試句柄返回0且eax的返回值是0xC0000353

vmp3.0.9全保護拆分解析

vmp3.0.9全保護拆分解析

4. NtSetInformationThread,ThreadInfoClass=0x11,這個不是檢測調試,而是設置不把調試信息發送到調試器,可以直接把0x11修改為0x3或者其它數值就可以了。

vmp3.0.9全保護拆分解析

5. ZwQuerySystemInformation,SystemInfoClass=0x23(MACRO:SystemKernelDebuggerInformation),返回值是2字節的bool值,設置為0即可。

vmp3.0.9全保護拆分解析

6. ZwQuerySystemInformation,SystemInfoClass=0xB(MACRO:SystemModuleInformation),會去遍歷內核模塊,然後進行判斷,第一次是獲取需要存儲的buffer長度,第二次才是真正獲取信息,只要把buffer都置為0,就檢測不到調試了,至於buffer的位置會在第一次調用後使用LocalAlloc申請空間來存儲。

vmp3.0.9全保護拆分解析

vmp3.0.9全保護拆分解析

7. CloseHandle反調試,如果被調試了,那麼KiRaiseUserExceptionDispatcher 函數會被調用,走異常處理流程;如果是不被調試的狀態,不會走向異常流程。

vmp3.0.9全保護拆分解析

8. 檢測硬件斷點,是通過SEH異常來處理的

首先在SEH鏈中對當前模塊的SEH頭下一個軟件斷點

vmp3.0.9全保護拆分解析

然後把圖示中的Dr0、Dr1、Dr2、Dr3、Dr6、Dr7調試寄存器都修改為0

vmp3.0.9全保護拆分解析

然後F9再次到CALL eax的時候如果是 GetpRrocessAffinityMask 函數調用,說明反調試已經順利通過。

PS:上面對CALL eax下的是硬件斷點,注意不要下軟件斷點,因為前面ZwSetInformationThread 後(User-mode反調試)或者第三次最後一次NtQuerySystemInformation 後(Kernel-mode)反調試會有如下圖所示的軟件斷點檢測,其實vmp的內存保護一部分的原理和這個一致,代碼特徵幾乎都一樣,取出來的HEX字節也是存放在esi寄存器中。所以為了方便,最好下硬件斷點,因為硬件斷點檢查觸發的時機都是在SEH函數中,很好攔截。

vmp3.0.9全保護拆分解析

二、反虛擬機

1. CPUID判斷ECX最高位31位是否為1,如果是1那麼就是在虛擬機中,如果是0那就是在宿主機上。我自己加殼的這個樣本有兩個CPUID檢測點,等它執行後修改ecx最高位為0就行。

不過下面的貼圖演示的是使用修改虛擬機的.vmx配置文件的方式,更加方便。

vmp3.0.9全保護拆分解析

2. 使用 GetSystemFirewareTable 獲取系統固件信息,判斷其中有無下列字符串:VMware、VirtualBox、Parallels。注意大小寫,只需要等GetSystemFirewareTable執行完成後對內存搜索VMware字符串(因為我用的VMware虛擬機),然後填充為0就可以過虛擬機檢測了。下面我會貼一個腳本配合 OD+StrondOD+DrxProtect 使用的,主要就是填充VMware字符串。

三、IAT解密

1. 我沒有分析它是如何加密的,只是簡單的分析了調用函數的解密過程,其實十分簡單:進入解密函數後單步f7,當看到類似:lea register,dword ptr[register+imm](register:寄存器,imm:立即數)的語句,在執行完成後register中就是函數,再跟蹤幾步通過ret一類的就去執行真正的函數了

2. 不知有無遺漏......

四、內存保護

1. 內存保護和上面分析的軟件斷點幾乎一樣,對你修改的內存下硬件訪問斷點,就可以看到在取HEX字節然後運算,不再貼圖了,只要把取出來的esi的數值替換為原來的數值就行了

2. 不知有無遺漏......

原文鏈接:[原創]vmp3.0.9全保護拆分解析-『加殼脫殼』-看雪安全論壇


分享到:


相關文章: