原創|其它|編輯:郝浩|2012-11-13 16:36:16.000|閱讀 2170 次
概述:VMProtect 是新一代的軟件保護系統,不像其它常見的保護系統,VMProtect 可以修改應用程序的源代碼。過對應用程序代源碼的修改,來實現對軟件的保護。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
代碼保護利器VMProtect在線訂購315特惠,個人授權專享折扣立即購買>>
是一款虛擬機保護軟件,是目前最為流行的保護殼之一,與其他類型保護軟件不同的是,它使用的是虛擬機保護技術,側重點在于保護所指定的函數,增加逆向分析的復雜度。
虛擬機其實就是一個字節碼解釋器,它循環的讀取指令并執行,并且它只有一個入口和一個出口(vm_exit)。通過靜態分析,我們可以分析出整個執行引擎的完整代碼。
將所有選項全部開啟后的結果如圖:
這時大量的fakejcc(虛假跳轉)和垃圾指令使原來十分簡單的代碼變得非常復雜。
如果要對加了殼的程序做一些處理,比如設定一些規則,將虛假分支清除后,流程圖就會和未加殼時一樣清晰了。如果再清除掉垃圾指令,那就會更清晰了。經過處理后,新的流程圖分析起來難度就會降低很多。如圖:
VMP是基于堆棧的虛擬機(Stack-Based VirtualMachine),然而虛擬機指令并不顯式的使用某個參數,而是先將參數壓入堆棧,然后直接從堆棧中讀取。例如:
表達式:
Add eax,ecx
可以翻譯為:
Push ecx
Push eax
Add
Pop eax
無論push進來的是誰,Add指令總是讀取并彈出堆棧中存放的值。
匯編指令在轉換到虛擬機的指令體系的過程中,被最大限度的化簡和歸類了,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))
VMP將所有寄存器都存放在了堆棧的結構中(VM_CONTEXT),結構中的每一項代表一個寄存器或者臨時變量。但在運行過程中,其中的項所映射的真實寄存器都是不固定的,可以把它比作一個齒輪,每做完一個動作,部分項的映射就互換了一下位置,或者執行完一段指令,齒輪就按不固定的方向和度數轉動一下,然后全部的項映射就改變了。VMP在生成字節碼的過程中,維護了一份結構中每一項所映射的真實寄存器,但這只存在于編譯過程,而在運行時是沒有明確的信息的。這直接導致了分析和識別的難度。
VMP把解碼算法分布到了Dispatch和每個Handler中,只有在取指令和取數據時才會解密,而每個解碼的算法也都是不同的,并且它的Seed每次解密都會變化的。 要寫出字節碼的逆算法不是不可以,但是復雜度太高,有些得不償失。所以如果想要修改數據,還是使用HOOK的方式比較輕松。 |
![]() |
但是HOOK的方式得解決代碼檢測的問題,VMP注冊版除了會加密字節碼以外,還會隨機對一段代碼做檢測,如果有錯將無法運行。 VMP注冊版中有一條叫指令( calchash),就是用來做檢測的。VMP會在編譯好的字節碼中加一些自己的指令,每次執行都會隨機對一段代碼生成一個Hash結果,然后與另一個隨機的數相加,結果必須為0,否則就會出錯。如果要爆破或者修改VMP的代碼,還需要處理這個過程。
是新一代的軟件保護系統,不像其它常見的保護系統,VMProtect 可以修改應用程序的源代碼。通過對應用程序代源碼的修改,來實現對軟件的保護。總而言之VMP 的設計原則就是用最簡單的正向設計導致最難的逆向分析。本文僅介紹VMprotect軟件保護的底層原理機制,以便大家對VMProtect的了解更加深入。
代碼保護利器VMProtect在線訂購315特惠,個人授權專享折扣立即購買>>
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn