謝 鑫 向 飛
1(湖南信息學院 湖南 長沙 410151)2(信息工程大學 河南 鄭州 450000)
伴隨著人工智能、大數(shù)據(jù)、物聯(lián)網(wǎng)、區(qū)塊鏈等新興技術的迅速發(fā)展,大量基于這些新興技術的軟件得到開發(fā)和應用,人們在使用這些頁面美觀、交互良好和操作便捷的軟件之時,卻往往忽略了軟件的安全性。提升軟件安全性是在軟件生命周期之中進行,如對軟件架構(gòu)進行安全設計,對代碼進行安全性分析,對軟件進行安全性測試以及對軟件進行保護等。而軟件保護一般是在編碼中或者開發(fā)完成后采用若干安全技術對軟件進行保護,防止攻擊者的逆向分析和惡意篡改。
現(xiàn)有主流的軟件保護技術有代碼混淆技術(Code Obfuscation)、軟件水印技術(Software Watermarking)、軟件防篡改技術(Software Tampering)和軟件胎記技術(Software Birthmarking)等。代碼混淆技術通過對源代碼或二進制代碼進行等價變形,使得代碼形態(tài)、結(jié)構(gòu)和內(nèi)容對于逆向分析變得難以理解,從而大大增加攻擊時間和經(jīng)濟開銷,迫使逆向分析者放棄攻擊的一種軟件保護技術。技術發(fā)展之初,學者Collberg將代碼混淆技術分為布局混淆、數(shù)據(jù)混淆、控制混淆和預防混淆,隨著近些年對于該技術的研究深入,研究熱點主要集中在采用虛擬機框架對軟件安全性進行保護。
2002年國外軟件安全研究人員公開了虛擬機保護技術的設計框架,并從C/C++編碼角度給出了實現(xiàn)原理[1]。隨后國內(nèi)的看雪、吾愛破解等論壇上對該技術的討論和交流日益增多,緊接著越來越多基于虛擬機保護技術的商業(yè)工具被開發(fā)出來,并應用于各種軟件的安全保護之中,如VMProtect、CodeVirtualizer和Themida等。除此之外,軟件安全人員不斷對虛擬機框架的安全性進行改進,主要成果有:Fang等[2]設計了一種多層級的虛擬機強度增強方法,該方法首先對軟件中需要保護的指令序列進行虛擬機化,生成一系列虛擬指令序列和虛擬指令解釋函數(shù),然后再對Handler中的若干指令進行虛擬機化,再次生成新的Handler,反復迭代該過程生成最終用于保護關鍵代碼的虛擬機保護框架。楊明等[3]在單重虛擬機保護框架基礎上引入嵌套思想,基于多個不同強度的虛擬機保護框架嵌套保護軟件關鍵代碼,若逆向攻擊者沒有完全分析清楚前一重虛擬機保護機制時,則無法開展對下一重虛擬機保護機制的分析。房鼎益等[4]為提升虛擬機框架安全性,首先在虛擬機保護中引入了基于扭曲變形的加密模塊,然后加入了基于時間多樣性思想[5]的保護技術,構(gòu)造了多條等價執(zhí)行路徑,可以使軟件在每次執(zhí)行時路徑發(fā)生隨機改變,方法能有效抵御累積攻擊。之后又對Handler模塊進行數(shù)據(jù)流混淆,對謂詞進行隱藏,用雙進程對虛擬機框架進行保護,增強了框架抵御語義逆向攻擊的性能[6]。王懷軍等[7]為改進框架的保護強度,首先引入寄存器輪轉(zhuǎn)指令和防調(diào)試指令,然后基于路徑多樣化構(gòu)造語義等價的變形Handler模塊,從而提升Handler模塊的整體強度[8-9]。張麗娜等[10]通過對字節(jié)碼進行加解密實現(xiàn)虛擬機強度改進。吳偉民等[11]在虛擬指令中嵌入虛擬花指令,并運用模糊變換技術提升虛擬指令系統(tǒng)的復雜程度。湯戰(zhàn)勇等[12]通過對虛擬機的指令集進行隨機化,使得受保護軟件的代碼呈現(xiàn)多樣化的形態(tài)。謝鑫等首先提出了將軟件中核心代碼進行并行化,然后基于多種虛擬機對不同的并行代碼片段進行保護[13],逆向攻擊者只有分析清楚并行算法和不同虛擬機機理才能獲取受保護代碼的語義。之后又對Handler模塊進行多樣化,變長切分和隨機亂序,用跳轉(zhuǎn)表對指令片段進行重組[14]。另外,還在虛擬機框架上引入了多種不同加解密算法,實現(xiàn)了基于Handler模塊的動態(tài)加解密保護方法[15]。
針對虛擬機保護的一般攻擊方法為:首先對虛擬機代碼入口進行定位[16],分析出虛擬機Dispatcher模塊的起始和終止位置,其次根據(jù)Dispatcher模塊的調(diào)度算法逐條讀取虛擬指令,分析每條虛擬指令對應Handler模塊的功能,最后對所有執(zhí)行的虛擬指令序列進行優(yōu)化,還原程序功能[17]?,F(xiàn)有對于虛擬機保護的研究主要集中在虛擬指令和Handler模塊的改進上,對Dispatcher模塊的增強保護研究較少,如Kuang等[18]提出了一種多Dispatcher虛擬機保護框架,赫朝輝[19]提出了一種混合式多層次Dispatcher結(jié)構(gòu),抗攻擊性得到了一定提升,但強度依然不高。針對Dispatcher模塊隱蔽性低和抵御靜、動態(tài)逆向攻擊強度不高的問題,提出一種基于增強型調(diào)度器的虛擬機軟件保護方法。
基于虛擬機的軟件保護方法主要采用虛擬化技術對軟件中關鍵算法所對應的指令序列進行虛擬化,然后通過嵌入軟件中的解釋器模塊對這些虛擬機指令進行解釋執(zhí)行,從而完成軟件的正常運行。虛擬機框架核心為虛擬指令集和解釋器模塊,虛擬指令集需要能對本地x86匯編指令集進行完整表示,一條x86匯編指令一般對應一條或多條虛擬指令。解釋器模塊主要包括:用于保存臨時寄存器環(huán)境中寄存器值的虛擬機上下文結(jié)構(gòu)(VMcontext),用于對虛擬指令進行解釋執(zhí)行的Handlers模塊,用于對Handlers進行循環(huán)調(diào)用的Dispatcher模塊,用于表示虛擬指令序列的驅(qū)動數(shù)據(jù)(VMdata)以及環(huán)境初始化(VMinit)和退出模塊(VMexit)等。
若要運用虛擬機技術對程序進行保護,首先需定位程序需保護的核心算法,抽取目標指令序列,然后構(gòu)建完備的虛擬指令集,對目標指令序列進行虛擬化,生成虛擬指令序列,再將虛擬指令序列轉(zhuǎn)化為字節(jié)碼形式的驅(qū)動數(shù)據(jù),寫到原始程序空間之中,最后將VMcontext,Handlers和Dispatcher等模塊嵌入到需要保護的PE程序之中,生成保護后程序,基本原理如圖1所示。
圖1 基于虛擬機保護的基本原理
基于虛擬機保護后的軟件執(zhí)行過程主要分為如下步驟:
1) 軟件開始執(zhí)行,當代碼執(zhí)行到保護代碼時,則轉(zhuǎn)向受保護軟件中嵌入的解釋器模塊執(zhí)行。
2) 運用解釋器模塊中的初始化代碼對現(xiàn)場環(huán)境進行保存,如:將真實寄存器值保存到Vmcontext中,對某些寄存器賦初值等。
3) 執(zhí)行Dispatcher模塊,從VMdata之中讀取字節(jié)數(shù)據(jù),對字節(jié)碼數(shù)據(jù)進行解碼,得到虛擬指令對應的Handler索引值。
4) 通過索引值計算Handler函數(shù)在軟件中的地址,并轉(zhuǎn)向Handler函數(shù)代碼進行執(zhí)行。
5) 執(zhí)行完Handler指令序列后轉(zhuǎn)向步驟3,循環(huán)執(zhí)行步驟3-步驟5,直到完成所有VMdata數(shù)據(jù)的解釋執(zhí)行。
6) 還原虛擬機框架現(xiàn)場,跳出解釋器,執(zhí)行程序后面未保護的代碼序列。
逆向攻擊者若要理解基于虛擬機保護的程序功能,則需分析清楚解釋器及相關模塊的工作機理和每一條虛擬指令的功能?,F(xiàn)有一些方法對虛擬指令和Handler強度進行了改進,使對于這些模塊的逆向分析變得困難,Dispatcher模塊成為了整個虛擬機保護框架中的短板,容易受到“動態(tài)跟蹤,靜態(tài)分析”的攻擊。針對Dispatcher模塊安全性不高的問題,提出一種對Dispatcher模塊安全性增強的方法,基本思想為:首先采用多樣化技術生成多種語義等價但形態(tài)各異的Dispatcher模塊指令序列,再按照語義將其切分成若干指令序列片段,隨機選擇指令序列片段進行加密和控制流迭代混淆處理,然后采用隨機函數(shù)將不同的指令片段進行連接,最后將新生成的指令序列以及加解密分散嵌入到受保護程序之中,Dispatcher模塊安全性增強框架如圖2所示,具體步驟如下:
1) 將Dispatcher代碼分成三部分:Dispatcher入口代碼序列I,Dispatcher核心代碼序列C和Dispatcher出口代碼序列O。
2) 將Dispatcher核心代碼序列C隨機劃分成長度各異的指令片段,記做C=(C1,C2,…,Cn)。
3) 采用等價指令替換和花指令插入等方法[14]對C中的所有指令片段進行多樣化,生成m種與C語義等價但形式不同的指令序列,記作S={S1,S2,…,Sm},其中Si=(A1i,A2i,…,Ani),且A1i和C1、A2i和C2、A3i和C3、…、Ani和Cn語義等價。
圖2 Dispatcher模塊安全性增強框架
4) 在多樣化代碼片段中隨機挑選若干指令序列,如A11、A2m、A22、A33、An1、Anm等,基于插入不透明謂詞的方法[20]對其進行k次控制流迭代混淆,具體原理如圖3所示。
圖3 基于不透明謂詞的k次迭代控制流混淆示意
5) 基于步驟4所生成的指令序列集合,再次隨機挑選指令序列片段,如A1m、A23、A32、An2、A11、A22等,運用多種不同的密碼算法對其進行加密處理。
6) 用隨機函數(shù)對每一層指令序列片段進行連接,如集合{A(i)1,A(i)2,…,A(i)m}中的每一個指令序列片段可隨機選擇執(zhí)行其下一層指令序列集合{A(i+1)1,A(i+1)2,…,A(i+1)m}中任意一個片段,最后生成網(wǎng)狀結(jié)構(gòu)的代碼路徑。
7) 將新生成的Dispatcher代碼和所有Handler函數(shù)代碼進行連接,并將新生成的Dispatcher模塊和用于程序動態(tài)執(zhí)行的隨機、加密和解密函數(shù)分散嵌入到程序空間之中,如圖4所示。
圖4 Dispatcher模塊和加解密函數(shù)分散嵌入程序空間
強度分析為基于增強型Dispatcher的虛擬機抵御靜動態(tài)逆向分析攻擊的能力。原始虛擬機Dispatcher模塊代碼通常以未加密狀態(tài)存放在程序新增的區(qū)塊之中,攻擊者可以通過內(nèi)存斷點方式找到模塊入口,并通過內(nèi)存轉(zhuǎn)儲和反匯編等方法理解代碼執(zhí)行流程和調(diào)度方式。而安全性增強的Dispatcher模塊代碼采用了多樣化技術,基于不透明謂詞對控制流進行了迭代混淆,而且對部分指令片段進行動態(tài)加解密處理。
若設原始虛擬機Dispatcher模塊執(zhí)行路徑為1,通過指令多樣化技術可以生成m種語義等價且形式不同的指令序列,將所有語義等價的指令序列分為n層,并采用隨機函數(shù)對不同層指令序列進行連接,形成網(wǎng)狀結(jié)構(gòu)。若攻擊者采用指令動態(tài)追蹤方法對Dispatcher模塊指令序列進行記錄,理論上共可得到mn種不同的程序執(zhí)行路徑,大大增加了攻擊者動態(tài)跟蹤分析的難度。
安全性增強的Dispatcher模塊在生成多樣化指令序列時,基于不透明謂詞對若干指令片段進行控制流迭代混淆。若每進行一次控制流迭代混淆,控制流邊數(shù)目增加一倍,當?shù)鷎次時,單個指令序列的控制流邊數(shù)目變成2k個,若隨機挑選i個指令序列進行混淆,則控制流邊數(shù)目將增長為i×2k個,極大增加了通過構(gòu)建代碼控制流圖進行靜態(tài)逆向分析的難度。
另外,方法還對Dispatcher模塊中部分指令片段進行了加密處理,只有在程序動態(tài)運行時才解密運行。在程序未執(zhí)行時,這些指令片段為加密狀態(tài)保存在程序中,直接采用靜態(tài)逆向分析方法對其解析將出現(xiàn)亂碼指令,同樣增加了受保護程序的分析難度。
開銷分析為混淆前后程序時間和空間對比分析?;谠鰪娦虳ispatcher模塊的虛擬機保護框架相比原始虛擬機保護框架增加了多層隨機函數(shù),控制流迭代混淆中的不透明謂詞以及指令序列片段加解密三部分時間開銷。
3.2.1 時間開銷分析
1) 若將多樣化Dispatcher模塊劃分成n個指令片段,每一次隨機函數(shù)運行的平均時間為q,則時間開銷增長q×(n-1);
2) 若在Dispatcher模塊單次執(zhí)行序列的n個指令片段中隨機選擇e1個指令片段進行k次控制流迭代,每次迭代插入的不透明謂詞運行平均時間為d,則時間開銷增長k×d×e1;
3) 若在Dispatcher模塊單次執(zhí)行序列的n個指令片段中隨機選擇了e2個指令序列進行加密,每個指令片段解密平均時間為u,則時間開銷增長e2×u。由此可得,三部分總的時間開銷增長理論值為q×(n-1)+k×d×e1+e2×u。
若原始程序運行在某個計算環(huán)境下的時間開銷為X1。改進后的虛擬機保護框架中未引入加密方法時,則運用該框架對原始程序進行保護后的時間開銷為X2,該值一般為X1的1.5~10倍左右[5,12]。基于上述分析,若在現(xiàn)有虛擬機保護框架上再單獨對Dispatcher模塊進行安全性增強,則時間開銷將進一步增長,其增長的時間理論值為Z1=q×(n-1)+k×d×e1+e2×u。若Z值相比X2沒有大大增長,由于現(xiàn)有軟件和硬件計算能力不斷發(fā)展,本文增強方案將不會給受保護程序的正常運行造成影響。但如果Z1值相比X2得到大幅度增長,權(quán)衡時間開銷和安全性來說,Dispatcher模塊增強方案是一種性價比不高的選擇。因此,在對Dispatcher模塊進行安全性增強時,在保證方法具有一定強度的同時,要盡可能選擇運行速度快的隨機函數(shù)、加解密函數(shù)和不透明謂詞,控制指令片段e1、e2和迭代次數(shù),以此降低整個調(diào)度器增強方案對于虛擬機原始保護框架時間開銷增長的影響。
3.2.2 空間開銷分析
空間開銷的增長主要包括隨機函數(shù)代碼空間,基于控制流迭代的不透明謂詞和冗余代碼空間,以及加解密函數(shù)代碼空間。設隨機函數(shù)有f1個,平均代碼空間為r1;進行了k次控制流迭代,插入f2個不透明謂詞,f3段冗余代碼,平均代碼空間為r2和r3;引入的f4個加解密函數(shù)平均代碼空間為r4,總空間開銷增長理論值為f1×r1+f2×r2+f3×r3+f4×r4。
若原始程序所占存儲空間為Y1。運用改進后的虛擬機保護框架對原始程序進行保護后所占存儲空間Y2一般為Y1的1.5~2倍左右[5,12]?;谏鲜龇治?,若在現(xiàn)有虛擬機保護框架上再單獨對Dispatcher模塊進行安全性增強,則空間開銷還將增長,其增長的理論值為Z2=f1×r1+f2×r2+f3×r3+f4×r4。若Z2值相比Y2沒有大大增長,由于現(xiàn)有內(nèi)存和硬盤等存儲能力的提升,則本文增強方案將不會給受保護程序的存儲開銷帶來影響。但如果Z2值相比Y2大幅度增長,權(quán)衡空間開銷和安全性來說,Dispatcher模塊增強方案仍需進一步優(yōu)化。因此,在對Dispatcher模塊進行安全性增強時,在保證方法具有一定強度的同時,要盡可能選擇占用存儲空間小的隨機函數(shù)、加解密函數(shù)和不透明謂詞,并且要對冗余代碼數(shù)目,迭代次數(shù)進行控制,以此降低空間開銷增長的影響。
針對基于增強型Dispatcher模塊的虛擬機保護框架的反混淆攻擊,一般首先對增強型Dispatcher模塊進行代碼定位,然后采用反混淆技術對Dispatcher模塊代碼進行處理。
原始虛擬機保護框架由于Dispatcher模塊集中存儲在受保護程序中的特定空間,逆向攻擊者基于斷點跟蹤較為容易對其進行定位,并進行分析和理解。而在改進的虛擬機保護框架中將單一Dispatcher模塊轉(zhuǎn)化成多種語義等價且形式不同的Dispatcher模塊,并將代碼分散嵌入在整個程序空間的內(nèi)部,這種方式增加了Dispatcher模塊的隱蔽性。而對于攻擊者而已,若要成功理解Dispatcher模塊,首先需對分散在整個程序空間的代碼進行定位,然后進行代碼語義整合,最后對多種不同形式的Dispatcher進行語義分析,極大增加了分析難度。
若要準確定位出多樣化后的Dispatcher代碼,則需采用反混淆技術對代碼進行處理?,F(xiàn)有反混淆方法主要基于優(yōu)化技術,典型方法有:等價指令整合、常量傳播和折疊、循環(huán)壓縮、流程優(yōu)化等[21]。這些技術能在一定程度上能對指令進行約簡,對冗余流程進行去除,對代碼結(jié)構(gòu)進行優(yōu)化。但在安全增強型Dispatcher模塊中,不僅對代碼進行了多樣化處理,還挑選了一些代碼片段進行控制流膨脹,并采用加解密技術對部分指令片段進行了處理。若要對其進行反混淆,先要對加密指令片段進行解密,然后對控制流膨脹后的代碼進行定位、分析和約簡,最后對多樣化Dispatcher指令序列進行語義歸一化處理,而代碼解密,膨脹控制流結(jié)構(gòu)約簡和代碼語義歸一都將大大增加攻擊者分析代價。
驗證實驗基本環(huán)境如下:
1) Intel(R) Core(TM) i3 CPU M380 2.53 Hz雙核處理器。
2) Windows 7 SP1 32位旗艦版操作系統(tǒng),內(nèi)存容量2 GB。
3) 運用Visual Studio2008對開源虛擬機框架(原始VM)[22]進行編譯,并基于該框架進行Dispatcher模塊安全性增強。
4) 基于C語言和標準插入排序(InsertionSort)、希爾排序(ShellSort)、快速排序(QuickSort)和冒泡排序(BubbleSort)算法實現(xiàn)了四款測試程序,以及4組(每組500個)隨機測試數(shù)據(jù)。
5) 在操作系統(tǒng)目錄C:WindowsSystem32下,挑選網(wǎng)絡功能控制臺應用程序ping.exe, route.exe和圖形化應用程序notepad.exe, regedt32.exe和mspaint.exe作為典型應用場景下的實際應用測試程序。
生成四款排序測試程序,并在不同參數(shù)條件下,運用Dispatcher模塊安全性增強虛擬機框架對測試程序進行保護,運用生成的基準測試程序和受保護程序?qū)y試數(shù)據(jù)進行排序,對比保護前后測試程序的時間和空間開銷。
4.1.1 Dispatcher指令序列多樣化
基于原始VM虛擬機框架,運用等價指令替換和花指令隨機嵌入等方法對Dispatcher指令序列進行多樣化,添加Dispatcher入口代碼,Dispatcher其他代碼不進行增強變換,將多樣化后語義等價Dispatcher數(shù)目記為M。當M=1為原始VM,不同M下測試程序時間和空間開銷如表1和表2所示。由表1和表2可知,原始VM框架對測試程序進行保護后,會給程序引入一定的時間和空間開銷。由于多樣化后不同路徑的Dispatcher指令序列規(guī)?;疽恢拢擠ispatcher路徑數(shù)目增多時,保護后程序空間開銷將會線性增長,而無論有多少種Dispatcher路徑,受保護程序每次執(zhí)行時,都只選Dispatcher模塊中一條路徑執(zhí)行,因此當M的值為1~5之間時,受保護程序的時間開銷基本穩(wěn)定。
表1 不同Dispatcher數(shù)目下測試程序時間開銷
表2 不同Dispatcher數(shù)目下測試程序空間開銷
4.1.2 Dispatcher指令序列分片
基于Dispatcher參數(shù)M=4時的虛擬機保護框架,對指令序列進行分片,在每一層分片指令序列末尾采用隨機函數(shù)對分片代碼進行連接,而Dispatcher其他部分不進行安全性增強變換。將單個Dispatcher模塊執(zhí)行序列的分片數(shù)目記為N,在不同分片數(shù)目下測試程序的時間和空間開銷,實驗數(shù)據(jù)如表3和表4所示。由表可知,向多樣化Dispatcher模塊中插入路徑隨機選擇函數(shù)時,將給受保護程序引入一定的時間和空間開銷。增長的時間開銷主要為連接不同指令片段間隨機選擇函數(shù)的執(zhí)行時間,由于Dispatcher模塊在選擇調(diào)度執(zhí)行Handler時,會被程序反復調(diào)度,因此Dispatcher模塊中指令分片數(shù)目越多,受保護程序所執(zhí)行的時間開銷就越大。而增長的空間開銷是由于不同指令分片間所插入的隨機選擇函數(shù)占用空間決定的。當參數(shù)M=4、N=2時,表示在Dispatcher模塊中插入4個隨機選擇函數(shù),當M=4、N=3時,插入4×2=8個隨機選擇函數(shù),以此類推。
表3 不同分片數(shù)目下測試程序時間開銷
表4 不同分片數(shù)目下測試程序空間開銷
4.1.3 Dispatcher指令片段控制流迭代
基于Dispatcher參數(shù)M=4、N=4時的虛擬機保護框架,隨機選擇6個指令片段進行控制流迭代混淆,根據(jù)3.2中的理論分析,實驗設計和選擇運行速度快,所占存儲空間小,安全性高的基于二維超混沌映射方程組的不透明謂詞來對控制流進行迭代混淆[20],Dispatcher模塊中其他部分不進行安全性增強變換。記單個指令片段迭代次數(shù)為K,K=0時為虛擬機保護框架未進行控制流混淆的初始狀態(tài),不同迭代次數(shù)下的測試程序時間和空間開銷如表5和表6所示。隨著迭代次數(shù)的增加,基于不透明謂詞的迭代控制流混淆方法將使得受保護程序的控制流循環(huán)復雜度[23]不斷增加,提升了虛擬機整體語義混淆能力。
表5 不同迭代次數(shù)下測試程序時間開銷
表6 不同迭代次數(shù)下測試程序空間開銷
4.1.4 Dispatcher指令片段加密
基于Dispatcher參數(shù)M=4、N=4和基于6個指令片段K=4時的虛擬機保護框架,隨機選擇Dispatcher模塊中的4個指令碎片進行加密,記為D=4,根據(jù)軟件保護有效性評估指標[23]和3.2中的理論分析,從算法簡單、實現(xiàn)便捷、加解密速度快、占用存儲空間小以及具有一定安全性的角度出發(fā),實驗在虛擬機保護框架中嵌入了TEA、RC4和Xor三種不同形式的加解密函數(shù)模塊,記為X=3,運用該參數(shù)下的虛擬機框架(MNKDX_VM)對測試程序進行保護,并對比測試程序在商業(yè)虛擬CV和VMP保護下的時間和空間開銷。
一般虛擬機保護框架中,當Handler函數(shù)要執(zhí)行時都要通過Dispatcher模塊對其進行調(diào)度執(zhí)行。由于MNKDX_VM的Dispatcher模塊中引入了多種加密函數(shù)對指令片段進行加密處理,當Dispatcher模塊需執(zhí)行時,首先要對該模塊中部分加密指令片段進行解密,然后再解密指令片段運行結(jié)束后,再次進行加密。該種方式將使程序運行時間大度增加,尤其在反復需要對Dispatcher模塊進行調(diào)度的排序程序之中,具體實驗數(shù)據(jù)如表7和表8。由此可得,在運用本文提出的Dispatcher安全性增強方法時,需要權(quán)衡保護強度和性能開銷,合理調(diào)整M、N、K、D和X五個參數(shù),通常只對軟件中關鍵算法或模塊進行保護。
表7 不同虛擬機下測試程序時間開銷
表8 不同虛擬機下測試程序空間開銷
對比不同虛擬機框架下受保護程序,相關信息如表9所示。商業(yè)級虛擬機框架CV和VMP中Handler數(shù)目比原始VM和MNKDX_VM要多,由于MNKDX_VM是基于原始VM框架的Dispatcher模塊強度升級,因此兩者Handler數(shù)目和指令序列狀態(tài)一致,MNKDX_VM中Dispatcher模塊中的指令狀態(tài)根據(jù)D數(shù)目部分或全部為密文。MNKDX_VM相比原始VM、CV和VMP在Dispatcher模塊強度上進行了改進,增加的加解密、隨機選擇和不透明謂詞等函數(shù)大幅度增加了逆向攻擊者的分析難度。
表9 不同虛擬機下測試程序信息比較
為了測試本文方法在實際場景下針對典型應用程序的真實效果,在Win7操作系統(tǒng)下選取實驗材料5)中五款程序,分別采用CV、VMP和MNKDX_VM對其進行保護,相關實驗測試結(jié)果如表10和表11所示。由數(shù)據(jù)可得,未受到保護時的原始程序都可以正常運行,而且啟動時間都小于0.5秒,當采用VMP虛擬機保護軟件對其進行保護時,notepad和regedt32兩款圖形化程序依然可以正常運行,啟動時間小于1秒,而其他三款程序都不能正常啟動。當采用CV虛擬機保護軟件對應用程序進行保護時,本文分別選擇了其中速度最快的虛擬機引擎tiger32_red和復雜程度最高的虛擬機引擎eagle32_black;當采用CV對實際應用程序進行保護時,除了regedt32依舊能夠在較大的時間開銷(tiger32_red為3秒左右,eagle32_black為8秒左右)下正常運行,其他應用程序都不能夠正常啟動。而在設定M=4、N=4、K=4、D=4和X=3,采用本文虛擬機框架對這些應用程序進行保護時,五款程序都能夠正常運行,而且增長的時間開銷控制在一個較為合理的范圍。另外從實際場景下的應用程序所占系統(tǒng)空間來看,本文方法保護后的程序所占系統(tǒng)空間相比CV和VMP有較大幅度的降低。
表10 不同虛擬機下應用程序運行狀態(tài)
續(xù)表10
表11 不同虛擬機下應用程序空間開銷
本文針對現(xiàn)有虛擬機保護框架中Dispatcher模塊抗逆向攻擊安全性不高的問題,提出一種Dispatcher模塊安全性的增強方法,提升了虛擬機保護框架中Dispatcher模塊代碼對靜態(tài)反匯編、內(nèi)存斷點和優(yōu)化等逆向分析難度,提升了虛擬機保護框架的整體安全性。該方法同樣適用于現(xiàn)有其他虛擬機Dispatcher模塊的強度升級。但在強度提升的同時,將給受保護程序引入一些額外的函數(shù)及運行控制信息,會帶來一定的時間和空間開銷。在實際使用本文方法時,需要合理對不同參數(shù)進行設置,以平衡保護強度和性能開銷。下一步將對控制流迭代混淆和加解密方案進行優(yōu)化,并在大量具有不同結(jié)構(gòu)的程序基礎上,對本文相關參數(shù)的最優(yōu)選擇問題進行深入研究。