VMProtect

VMProtect

VMProtect 是新一代的軟體保護系統,將保護後的代碼放到虛擬機中運行,這將使分析反編譯後的代碼和破解變得極為困難。使用 MAP 檔案或內建的反編譯引擎,您可以快速選擇需要保護的代碼。

基本介紹

  • 外文名:VMProtect
  • 類型軟體保護系統
  • 功能:快速選擇需要保護的代碼
  • 保護原理:虛擬化程式的代碼
什麼是VMP,什麼是VMProtect,VMProtect保護原理,如何使用,Mutationb,虛擬化,mutation+虛擬化,調試模式,隱藏衡量,動態創建線上命令,檢查VM對象的完整性,水印,項目名稱,軟體訂購,VMprotect原始碼保護底層原理機制,

什麼是VMP

什麼是VMProtect

VMProtect是一個軟體保護軟體。通過這個軟體保護的代碼部分在虛擬機上執行,這使得被保護的程式很難被分析與破解。反彙編程式與MAP檔案的運用使您能快速選擇需要保護從而避免破解的代碼。

VMProtect保護原理

與其它大部分的保護程式不同,VMProtect可修改程式的原始碼。VMProtect可將被保護檔案中的部分代碼轉化到在虛擬機(以下稱作VM)上運行的程式(以下稱作bytecode)中。您同樣可把VM想像為具備命令系統的虛擬處理器,該命令系統與Intel 8086處理器所使用的完全不同。例 如,VM沒有負責比較2個運算元的命令,也沒有有條件與無條件的移轉等。就象您現在看到的,黑客必須開發一款特定的工具以分析與反編譯bytecode, 而且還相當地耗時。可是,我們知道沒有無法破解的保護程式,這也是我們為什麼會將保護級別達到破解費用與購買費用相當(或破解費用甚至超過購買費用)的程度。不管怎么樣,請記住VMProtect是唯一一款能幫助您“隱藏”主要軟體保護機制的工具。

如何使用

如何使用VMProtect使用"File"-"Open"選單項載入工程。添加負責檢查工程密碼是否正確的程式:
VMProtect
VMProtect能根據所選的編譯類型以不同的方式處理被保護的代碼。
VMP功能

Mutationb

在處理器命令的程度上修改了執行檔案(修改了現有的命令,添加了所有類型的垃圾命令等)。該編譯類型無法充分地保護代碼。它只能避免破解、解析以及避免進行中的功能由簽名解析器確定(PEiD+KANAL、IDA+FLIRT等)。作為固定規則,我們並不需要保護庫功能不受破解以及解析,只需要更改它們的簽名就足夠保護在您應用程式中套用的庫(對破解與解析的保護程度不高,代碼的執行率很高)。

虛擬化

可執行代碼被轉化為由虛擬機執行的bytecode。該編譯類型應該套用到所有執行率非常重要的代碼的關鍵部分以防止破解與解析(對破解與解析的保護程度中等,代碼的執行率中等)。

mutation+虛擬化

以處理器命令的程度修改可執行代碼,然後將它轉化為由虛擬機執行的bytecode。該編譯類型應該套用到執行率不重要的代碼(對破解與解析的保護程度高,代碼的執行率低)。

調試模式

用來確認外部地址,尋找外部代碼參考的地址。

隱藏衡量

如果啟用該選項,就不能在打開的表格中找到變數地址或調用的功能。

動態創建線上命令

VM解釋程式不能執行所有的Intel 8086命令,這就是為什麼這些命令會以它們在保護部分中展現的形式執行的原因。動態創建線上命令同樣讓針對bytecode的破解變得艱難。

檢查VM對象的完整性

當執行程式的時候,VM解釋程式會自動讀取當執行命令時被運用的程式、bytecode以及水印中任意部分的檢查結果。VM對象的完整性檢查可保護解釋程式、bytecode以及水印免遭修改。

水印

選擇您希望內置到被保護檔案中的水印。

項目名稱

能為即將被寫入VM解釋程式與bytecode的新項目指定名稱
移除fixup元素(只針對EXE檔案
編譯程式(尤其象Delphi)會為EXE檔案創建一個fixup元素列表。當載入EXE檔案時,作業系統不會使用這些元素。如果您啟用該選項,VM將使用被fixup元素列表所包含的部分。
在指定完所有必要的選項後,開始編譯工程。在編譯完成後,在工程檔案(例如,TEST.EXE)旁邊會創建一個新檔案(例如,TEST.VMP.EXE)。指定的程式將在虛擬機的該檔案中運行。

軟體訂購

該軟體為付費軟體,網上流傳的多為試用版的破解版和公開的正式版,
如需商業加密建議購買正版

VMprotect原始碼保護底層原理機制

虛擬機保護特徵:
  • 將由編譯器生成的本機代碼(Native Code)轉換成位元組碼(Bytecode)
  • 將控制權交由虛擬機,由虛擬機來控制執行
  • 轉換後的位元組碼非常難以閱讀,增加了破解的複雜性
虛擬機其實就是一個位元組碼解釋器,它循環的讀取指令並執行,並且它只有一個入口和一個出口(vm_exit)。通過靜態分析,我們可以分析出整個執行引擎的完整代碼。
VMProtect
將所有選項全部開啟後的結果如圖:
VMProtect
這時大量的fakejcc(虛假跳轉)和垃圾指令使原來十分簡單的代碼變得非常複雜。
如果要對加了殼的程式做一些處理,比如設定一些規則,將虛假分支清除後,流程圖就會和未加殼時一樣清晰了。如果再清除掉垃圾指令,那就會更清晰了。經過處理後,新的流程圖分析起來難度就會降低很多。如圖:
VMProtect
VMP的Handler
VMP是基於堆疊虛擬機(Stack-Based VirtualMachine),然而虛擬機指令並不顯式的使用某個參數,而是先將參數壓入堆疊,然後直接從堆疊中讀取。例如:
表達式:
Add eax,ecx
可以翻譯為:
Push ecx
Push eax
Add
Pop eax
VMProtect
無論push進來的是誰,Add指令總是讀取並彈出堆疊中存放的值。
VMP指令分類
彙編指令在轉換到虛擬機的指令體系的過程中,被最大限度的化簡和歸類了,VMP中的指令大體分五類:
  • 算術運算和移位運算
  • 堆疊操作
  • 記憶體操作
  • 系統相關(無法模擬指令)
邏輯運算指令
Vmp中的邏輯運算只有一條指令:nor。這個指令在電路門中叫NOR門,它由三條指令組成,即not not and,與NAND門一樣,用它可以模擬not and xor or這四條邏輯運算指令。
轉換公式 :
P(a,b) = ~a & ~b
not(a) = P(a,a)
and(a,b)= P(P(a,a),P(b,b))
or(a,b) = P(P(a,b),P(a,b))
xor(a,b)= P(P(P(a,a),P(b,b)),P(a,b))
VMProtect
暫存器輪轉
VMP將所有暫存器都存放在了堆疊的結構中(VM_CONTEXT),結構中的每一項代表一個暫存器或者臨時變數。但在運行過程中,其中的項所映射的真實暫存器都是不固定的,可以把它比作一個齒輪,每做完一個動作,部分項的映射就互換了一下位置,或者執行完一段指令,齒輪就按不固定的方向和度數轉動一下,然後全部的項映射就改變了。VMP在生成位元組碼的過程中,維護了一份結構中每一項所映射的真實暫存器,但這隻存在於編譯過程,而在運行時是沒有明確的信息的。這直接導致了分析和識別的難度。
位元組碼加密和隨機效驗
VMP把解碼算法分布到了Dispatch和每個Handler中,只有在取指令和取數據時才會解密,而每個解碼的算法也都是不同的,並且它的Seed每次解密都會變化的。
要寫出位元組碼的逆算法不是不可以,但是複雜度太高,有些得不償失。所以如果想要修改數據,還是使用HOOK的方式比較輕鬆。
但是HOOK的方式得解決代碼檢測的問題,VMP註冊版除了會加密位元組碼以外,還會隨機對一段代碼做檢測,如果有錯將無法運行。 VMP註冊版中有一條叫指令( calchash),就是用來做檢測的。VMP會在編譯好的位元組碼中加一些自己的指令,每次執行都會隨機對一段代碼生成一個Hash結果,然後與另一個隨機的數相加,結果必須為0,否則就會出錯。如果要爆破或者修改VMP的代碼,還需要處理這個過程。

相關詞條

熱門詞條

聯絡我們