VMprotect简介
文章目錄
- VMP簡單介紹
- VMP的Handler
- VMP指令分類
- 邏輯運算指令
- 寄存器輪轉
- 字節碼加密和隨機效驗
- VMP作者原則
VMP簡單介紹
VMprotect是一款虛擬機保護軟件,是目前最為流行的保護殼之一,與其他類型保護軟件不同的是,它使用的是虛擬機保護技術,側重點在于保護所指定的函數,增加逆向分析的復雜度
虛擬機保護特征
虛擬機其實就是一個字節碼解釋器,它循環的讀取指令并執行,并且它只有一個入口和一個出口(VM_EXIT)。通過靜態分析,可以分析出整個執行引擎的完整代碼。
全部選項開啟后的結果:
大量的fake jcc(虛假跳轉)和垃圾指令使原來十分簡單的代碼變得十分復雜
VMP的Handler
VMP是基于堆棧的虛擬機(Stack-Based VirtualMachine)
虛擬機指令并不顯式的使用某個參數,而是先將參數壓入堆棧,然后直接從堆棧中讀取
表達式:
Add eax,ecx可以翻譯為:
Push ecx Push eax Add Pop eax無論push 進來的是誰,Add指令總是讀取并彈出堆棧中存放的值,然后Add算出結果再壓入堆棧
VMP指令分類
匯編指令轉換到虛擬機的指令體系的過程中,被最大限度的化簡和歸類了,VMP中的指令大體分為5類:
其中最復雜的是邏輯運算指令
邏輯運算指令
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,b),P(b,b)),P(a,b))寄存器輪轉
VMP將所有寄存器都存放在了堆棧的結構中(VM_CONTEXT結構中的每一項代表一個寄存器或者臨時變量。但在運行過程中,其中的項所映射的真實寄存器都是不固定的,可以把它比作一個齒輪,每做完一個動作,部分項的映射就互換了一下位置,或者執行完一段指令齒輪就按不固定的方向和度數轉動了一下,然后全部的項映射就改變了 )
VMP在生成字節碼的過程中,維護了一份結構中每一項所映射的真實寄存器,但這只是存在于編譯過程,而在運行時是沒有明確的信息的。這直接導致了分析和識別的難度。
字節碼加密和隨機效驗
VMP把解碼算法分布到了Dispatch和每個Handler中,只有在取指令和取數據時才會解密,而每個解碼的算法也都是不同的,并且它的Seed每次解密都會變化。
要寫出字節碼的逆算法不是不可以,但是復雜度太高,有些得不償失,所以如果想要修改數據,還是使用HOOK的方式比較輕松
HOOK注意點:
HOOK方式得解決代碼檢測問題,VMP注冊版除了會加密字節碼以外,還會隨機對一段代碼做檢測,如果有錯將無法進行
VMP注冊版中有一條叫指令(calchash),就是用來做檢測的,VMP會在編譯好的字節碼中加一些自己的指令,每次執行都會隨機對一段代碼生成Hash結果,然后與另一個隨機的數相加,結果必須為0,否則就會出錯。如果要爆破或者修改VMP 的代碼,還需要處理這個過程
VMP作者原則
最簡單的正向設計,導致最困難的逆向分析
總結
以上是生活随笔為你收集整理的VMprotect简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LLVM架构详述
- 下一篇: VMprotect静态跟踪 字节码反