基本介紹
- 外文名:VMProtect
- 類型:軟體保護系統
- 功能:快速選擇需要保護的代碼
- 保護原理:虛擬化程式的代碼
什麼是VMP,什麼是VMProtect,VMProtect保護原理,如何使用,Mutationb,虛擬化,mutation+虛擬化,調試模式,隱藏衡量,動態創建線上命令,檢查VM對象的完整性,水印,項目名稱,軟體訂購,VMprotect原始碼保護底層原理機制,
什麼是VMP
什麼是VMProtect
VMProtect保護原理
與其它大部分的保護程式不同,VMProtect可修改程式的原始碼。VMProtect可將被保護檔案中的部分代碼轉化到在虛擬機(以下稱作VM)上運行的程式(以下稱作bytecode)中。您同樣可把VM想像為具備命令系統的虛擬處理器,該命令系統與Intel 8086處理器所使用的完全不同。例 如,VM沒有負責比較2個運算元的命令,也沒有有條件與無條件的移轉等。就象您現在看到的,黑客必須開發一款特定的工具以分析與反編譯bytecode, 而且還相當地耗時。可是,我們知道沒有無法破解的保護程式,這也是我們為什麼會將保護級別達到破解費用與購買費用相當(或破解費用甚至超過購買費用)的程度。不管怎么樣,請記住VMProtect是唯一一款能幫助您“隱藏”主要軟體保護機制的工具。
如何使用
如何使用VMProtect使用"File"-"Open"選單項載入工程。添加負責檢查工程密碼是否正確的程式:
VMProtect能根據所選的編譯類型以不同的方式處理被保護的代碼。
VMP功能
Mutationb
在處理器命令的程度上修改了執行檔案(修改了現有的命令,添加了所有類型的垃圾命令等)。該編譯類型無法充分地保護代碼。它只能避免破解、解析以及避免進行中的功能由簽名解析器確定(PEiD+KANAL、IDA+FLIRT等)。作為固定規則,我們並不需要保護庫功能不受破解以及解析,只需要更改它們的簽名就足夠保護在您應用程式中套用的庫(對破解與解析的保護程度不高,代碼的執行率很高)。
虛擬化
可執行代碼被轉化為由虛擬機執行的bytecode。該編譯類型應該套用到所有執行率非常重要的代碼的關鍵部分以防止破解與解析(對破解與解析的保護程度中等,代碼的執行率中等)。
mutation+虛擬化
調試模式
用來確認外部地址,尋找外部代碼參考的地址。
隱藏衡量
如果啟用該選項,就不能在打開的表格中找到變數地址或調用的功能。
動態創建線上命令
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)
- 將控制權交由虛擬機,由虛擬機來控制執行
- 轉換後的位元組碼非常難以閱讀,增加了破解的複雜性
將所有選項全部開啟後的結果如圖:
這時大量的fakejcc(虛假跳轉)和垃圾指令使原來十分簡單的代碼變得非常複雜。
VMP的Handler
表達式:
Add eax,ecx
可以翻譯為:
Push ecx
Push eax
Add
Pop eax
Add eax,ecx
可以翻譯為:
Push ecx
Push eax
Add
Pop eax
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))
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))
暫存器輪轉
VMP將所有暫存器都存放在了堆疊的結構中(VM_CONTEXT),結構中的每一項代表一個暫存器或者臨時變數。但在運行過程中,其中的項所映射的真實暫存器都是不固定的,可以把它比作一個齒輪,每做完一個動作,部分項的映射就互換了一下位置,或者執行完一段指令,齒輪就按不固定的方向和度數轉動一下,然後全部的項映射就改變了。VMP在生成位元組碼的過程中,維護了一份結構中每一項所映射的真實暫存器,但這隻存在於編譯過程,而在運行時是沒有明確的信息的。這直接導致了分析和識別的難度。
位元組碼加密和隨機效驗
VMP把解碼算法分布到了Dispatch和每個Handler中,只有在取指令和取數據時才會解密,而每個解碼的算法也都是不同的,並且它的Seed每次解密都會變化的。
要寫出位元組碼的逆算法不是不可以,但是複雜度太高,有些得不償失。所以如果想要修改數據,還是使用HOOK的方式比較輕鬆。