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