謝 鑫,羅莉霞,陳 敏
(湖南信息學(xué)院 計(jì)算機(jī)科學(xué)與工程學(xué)院,長沙 410151)
伴隨著全球通信產(chǎn)業(yè)鏈的不斷升級(jí),通信軟件在不斷革新和優(yōu)化的通信產(chǎn)業(yè)生態(tài)環(huán)境中,所處的地位變得越來越重要。但隨之而來的是,對(duì)于通信軟件的侵權(quán)及其漏洞的攻擊,也變得越發(fā)的頻繁。惡意攻擊者通過采用靜態(tài)和動(dòng)態(tài)的軟件逆向分析方法和工具,探查通信軟件內(nèi)部數(shù)據(jù)和代碼,明晰軟件內(nèi)部的安全保護(hù)機(jī)制,通過修改和控制通信軟件的內(nèi)部邏輯,繞過內(nèi)置安全保護(hù)機(jī)制,實(shí)現(xiàn)對(duì)于關(guān)鍵數(shù)據(jù),算法和功能模塊的獲取。
目前對(duì)于通信軟件的保護(hù)研究聚焦在于采用代碼混淆技術(shù),在保證通信軟件功能不變的前提下,對(duì)指令進(jìn)行變形和膨脹,對(duì)邏輯和結(jié)構(gòu)進(jìn)行復(fù)雜和模糊,或采用加密技術(shù)對(duì)關(guān)鍵代碼和數(shù)據(jù)進(jìn)行保護(hù)。而與代碼混淆和代碼加密不同的是,采用代碼虛擬化技術(shù)對(duì)通信軟件進(jìn)行保護(hù),既不是在原始代碼層面進(jìn)行功能等價(jià)變換,也不是提前將重要代碼或數(shù)據(jù)進(jìn)行加密,需要執(zhí)行時(shí)再在內(nèi)存中進(jìn)行解密。而是將目標(biāo)代碼翻譯成攻擊者不熟悉的其他類型中間語言,在原指令系統(tǒng)中又疊加了另一套指令系統(tǒng)。攻擊者要想正確理解目標(biāo)代碼,需要分析目標(biāo)代碼所對(duì)應(yīng)的指令系統(tǒng)框架和新疊加的虛擬指令系統(tǒng)。
針對(duì)單虛擬機(jī)框架內(nèi)部模塊安全的研究工作如下。虛擬指令解釋函數(shù)(Handler)模塊:采用模擬退火算法隨機(jī)化對(duì)Handlers進(jìn)行指令亂序[1];通過等價(jià)指令替換和切分亂序?qū)andlers進(jìn)行多樣化[2];對(duì)Handlers序列進(jìn)行動(dòng)態(tài)加解密[3];基于時(shí)間多樣性設(shè)計(jì)對(duì)Handlers進(jìn)行多樣化[4];采用數(shù)據(jù)混淆引擎對(duì)Handlers進(jìn)行變形[5]。虛擬指令調(diào)度器(Dispatcher)模塊:基于控制流迭代混淆和隨機(jī)切分加密方法的Dispatcher安全性增強(qiáng)[6];防止攻擊者對(duì)虛擬機(jī)進(jìn)行定位的Dispatcher模塊隱藏[7];增加程序多樣性的多Dispatchers程序控制單元插入[8]。虛擬機(jī)指令(Bytecode)模塊:采用虛擬花指令序列與虛擬指令模糊變換技術(shù)改進(jìn)虛擬機(jī)指令模塊強(qiáng)度[9];對(duì)虛擬指令字節(jié)碼進(jìn)行加解密[10]。虛擬機(jī)上下文(VMContext)模塊:基于多組寄存器值變形的虛擬機(jī)上下文復(fù)雜化[11]。
針對(duì)單虛擬機(jī)框架模塊連接安全的研究工作有:打亂字節(jié)碼指令的操作碼和處理程序之間的對(duì)應(yīng)關(guān)系的虛擬指令隨機(jī)化[12];減少靜態(tài)虛擬指令內(nèi)存暴露的基于多樣化調(diào)度器的虛擬代碼折疊[13]。
針對(duì)虛擬機(jī)整體框架安全的研究工作有:采用多虛擬機(jī)框架混淆從虛擬機(jī)操作碼到本地機(jī)器指令的映射[14];采用多套虛擬機(jī)環(huán)境隨機(jī)選擇和執(zhí)行所構(gòu)造的混淆基本塊和關(guān)鍵代碼[15];基于不同強(qiáng)度的多重虛擬機(jī)嵌套保護(hù)框架[16];基于多虛擬機(jī)的核心代碼并行化保護(hù)框架[17]。
上述研究工作從不同角度提升了虛擬機(jī)保護(hù)技術(shù)的安全性,但從虛擬機(jī)整體框架看,不同模塊間的連接結(jié)構(gòu)具有較強(qiáng)的固定性,攻擊者依舊較容易實(shí)現(xiàn):先從高維視角整體理解虛擬機(jī)保護(hù)框架,然后再進(jìn)一步分析各模塊內(nèi)部功能,從而實(shí)現(xiàn)保護(hù)機(jī)制的破解。本文針對(duì)虛擬機(jī)模塊連接的固定結(jié)構(gòu),提出一種基于圖變換的代碼虛擬化安全保護(hù)方法:首先對(duì)虛擬機(jī)基本結(jié)構(gòu)圖進(jìn)行變形,然后采用花指令嵌入、等價(jià)指令變換和代碼數(shù)據(jù)跳變方法對(duì)不同模塊內(nèi)部指令序列進(jìn)行變形,生成多樣化虛擬機(jī)集,最后對(duì)虛擬機(jī)不同模塊進(jìn)行嵌套變形。
攻擊者對(duì)受虛擬機(jī)保護(hù)的代碼分析流程為:先明晰虛擬機(jī)保護(hù)整體結(jié)構(gòu)和解釋執(zhí)行框架,再深入對(duì)各模塊功能進(jìn)行分析。為了增加虛擬機(jī)模塊間連接結(jié)構(gòu)和模塊內(nèi)部代碼的復(fù)雜性,提升虛擬機(jī)保護(hù)強(qiáng)度,基于圖的基本操作,對(duì)虛擬機(jī)的框架結(jié)構(gòu)進(jìn)行混淆,提出一種基于圖變換的虛擬機(jī)框架變形方法,如圖1。
基本思想為:首先構(gòu)建虛擬機(jī)結(jié)構(gòu)圖如圖1(a),然后通過增加不透明謂詞和邏輯分支將其轉(zhuǎn)化為正則圖如圖1(b),再運(yùn)用花指令嵌入、等價(jià)指令替換和代碼數(shù)據(jù)跳變方法,對(duì)正則圖節(jié)點(diǎn)中部分指令序列進(jìn)行等價(jià)變形如圖1(c),最后基于寬度和深度嵌套策略,對(duì)部分節(jié)點(diǎn)中的核心指令序列進(jìn)行多虛擬機(jī)保護(hù)如圖1(d)。
圖1 基于圖變換的虛擬機(jī)混淆
首先給出虛擬機(jī)結(jié)構(gòu)圖,虛擬機(jī)結(jié)構(gòu)圖混淆等相關(guān)定義如下。
定義1(虛擬機(jī)VM):在虛擬機(jī)框架VM中,VM={BC,HD,DP,JT,VMC,VMS,VME},BC表示字節(jié)碼,HD表示虛擬指令解釋函數(shù),DP表示虛擬指令調(diào)度器,JT表示跳轉(zhuǎn)表,VMC表示虛擬機(jī)上下文,VMS表示虛擬機(jī)入口代碼,VME表示虛擬機(jī)出口代碼。
定義2(虛擬機(jī)結(jié)構(gòu)圖VMG):由虛擬機(jī)框架VM各模塊構(gòu)成的結(jié)構(gòu)圖VMG,VM={V,E},V表示虛擬機(jī)VM所有模塊集合,E表示模塊間構(gòu)成的控制流關(guān)系集合,若結(jié)構(gòu)圖不含平行邊和環(huán),則稱有向簡單虛擬機(jī)結(jié)構(gòu)圖。
定義3(虛擬機(jī)結(jié)構(gòu)圖混淆OBVMG):設(shè)VM結(jié)構(gòu)構(gòu)成n階有向簡單圖,C為VM中的核心代碼,OBVMG(VM) =f1(f2,f1為將有向簡單虛擬機(jī)結(jié)構(gòu)圖VMG轉(zhuǎn)換為語義等價(jià)且每個(gè)頂點(diǎn)都鄰接到其余m-1個(gè)頂點(diǎn)上的m階有向完全虛擬機(jī)結(jié)構(gòu)圖的變換算法,f2為一種將C變換為語義等價(jià)的混淆代碼CO的代碼混淆算法。
定義4(多樣化虛擬機(jī)集OBVMS):用OBVMG對(duì)VM進(jìn)行混淆,生成多樣化虛擬機(jī)集OBVMS={VM1,VM2,VM3, …,VMn},對(duì)于(i,j(n,VMi=VMj,表示虛擬機(jī)VMi和VMj,表示虛擬機(jī)VMi和VMj功能等價(jià),|VMS|表示多樣化虛擬機(jī)的數(shù)量。
基于圖變換的虛擬機(jī)框架變形原理,對(duì)虛擬機(jī)框架VMG進(jìn)行混淆分三步進(jìn)行。首先采用虛擬機(jī)結(jié)構(gòu)圖變換算法對(duì)虛擬機(jī)框架進(jìn)行變形,再基于混淆策略生成多樣化虛擬機(jī)框架集OBVMS,最后進(jìn)行嵌套保護(hù)構(gòu)建GOB-VM保護(hù)框架,具體如下。
1)虛擬機(jī)結(jié)構(gòu)圖變換。
步驟1:基于虛擬機(jī)VM保護(hù)代碼構(gòu)建其結(jié)構(gòu)圖VMG;
步驟2:對(duì)VM={BC,HD,DP,JT,VMC,VMS,VME}代碼模塊進(jìn)行切分,每一模塊切分后子模塊數(shù)目分別記為{kBC,kHD,kDP,kJT,kVMC,kVMS,kVME};
步驟3:構(gòu)建切分后的虛擬機(jī)VM結(jié)構(gòu)圖VMG’= {V,E};
步驟4:將VMG’轉(zhuǎn)化為k=kBC+kHD+kDP+kJT+kVMC+kVMS+kVME階有向完全虛擬機(jī)結(jié)構(gòu)圖。
2)多樣化虛擬機(jī)框架集生成。
花指令嵌入策略:將對(duì)程序語義不產(chǎn)生影響的花指令,嵌入到目標(biāo)指令序列上下文中,花指令和目標(biāo)指令之間不產(chǎn)生依賴關(guān)系,嵌入前后的目標(biāo)指令序列語義不發(fā)生改變,如圖2(a)所示。
等價(jià)指令替換策略:采用等價(jià)指令模板對(duì)目標(biāo)指令序列進(jìn)行替換,目標(biāo)指令經(jīng)過混淆后不出現(xiàn)在混淆指令序列之中,替換后的指令片段相互之間具有依賴關(guān)系,如圖2(b)所示。
圖2 花指令嵌入和等價(jià)指令替換
代碼數(shù)據(jù)跳變的基本過程,如圖3所示。
圖3 基于Mealy機(jī)膨脹的代碼數(shù)據(jù)跳變
步驟1:設(shè)原始指令序列為(c1,c2,c3,…,ck),將其表示為十六進(jìn)制數(shù)據(jù)序列,記為D;
步驟2:將D進(jìn)行隨機(jī)切分,切分后的序列記為(d1,d2,d3,…,dl);
步驟3:將(d1,d2,d3,…,dl)轉(zhuǎn)化為能輸出對(duì)應(yīng)數(shù)據(jù)序列的Mealy自動(dòng)機(jī)代碼,記為(M1,M2,M3,…,Ml);
步驟4:對(duì)(M1,M2,M3,…,Ml)進(jìn)行(m1,m2,m3,…,ml) 次迭代膨脹變形[18],轉(zhuǎn)化為(M1’,M2’,M3’,…,Ml’)對(duì)應(yīng)的代碼模塊;
步驟5:對(duì)(M1’,M2’,M3’,…,Ml’)代碼模塊進(jìn)行拼接,使其能輸出數(shù)據(jù)序列D,并最終轉(zhuǎn)化為原始指令序列(c1,c2,c3,…,ck)。
3)虛擬機(jī)嵌套。
采用寬度或深度嵌套策略如圖4,對(duì)多樣化虛擬機(jī)集合中的單虛擬機(jī)核心代碼模塊進(jìn)行多虛擬機(jī)保護(hù)。
圖4 虛擬機(jī)框架核心代碼嵌套
寬度嵌套策略:針對(duì)單虛擬機(jī)VM1中的所有模塊,隨機(jī)選擇部分核心指令序列,采用生成的多樣化虛擬機(jī)集{VM2,VM3,…,VMd}對(duì)其進(jìn)行保護(hù)。
深度嵌套策略:針對(duì)單虛擬機(jī)VM1中的單個(gè)模塊,隨機(jī)選擇部分核心指令序列,采用虛擬機(jī)VM2對(duì)其進(jìn)行保護(hù),生成虛擬機(jī)VM1’模塊然后再采用虛擬機(jī)VM3對(duì)VM1’相同模塊進(jìn)行保護(hù),生成VM1’’,依次類推。
考慮到讓混沌系統(tǒng)具有更不確定的屬性和更復(fù)雜的相空間,選用二次映射混沌系統(tǒng)來構(gòu)造安全性更高的不透明謂詞集合{OP1,OP2,…,OPn},然后再從該集合中隨機(jī)選取不透明謂詞對(duì)虛擬機(jī)框架模塊進(jìn)行連接,實(shí)現(xiàn)m階有向簡單虛擬機(jī)結(jié)構(gòu)圖向m階有向完全虛擬機(jī)結(jié)構(gòu)圖的變換。
若該圖中m個(gè)節(jié)點(diǎn)所對(duì)應(yīng)的出度,分別為{o1,o2,…,om},則在每個(gè)節(jié)點(diǎn)和下個(gè)節(jié)點(diǎn)連接中,添加{m-o1-1,m-o2-1,…,m-om-1}個(gè)不透明謂詞,增加{2(m-o1-1), 2(m-o2-1),…, 2(m-om-1)}條控制連接邊,如圖5所示。
圖5 基于跳轉(zhuǎn)表的結(jié)構(gòu)圖連接
將基于不透明謂詞的虛擬機(jī)混淆結(jié)構(gòu)圖投射到內(nèi)存空間,在每一個(gè)不透明謂詞結(jié)束的地方,都會(huì)有類如jmpb1無條件或jnzb2, …,jgbn等有條件等指令;然后針對(duì)虛擬機(jī)變換后模塊中所有跳轉(zhuǎn)指令,構(gòu)建統(tǒng)一的跳轉(zhuǎn)表,采用統(tǒng)一的callf對(duì)其進(jìn)行控制流轉(zhuǎn)移,如圖6所示。若想進(jìn)一步增強(qiáng)跳轉(zhuǎn)表的安全性,可以將其嵌入到更大的隨機(jī)地址表空間中[2],從而實(shí)現(xiàn)基于跳轉(zhuǎn)表隱藏的結(jié)構(gòu)圖連接混淆。
圖6 基于跳轉(zhuǎn)表的結(jié)構(gòu)圖連接
Windows10家庭中文版64位操作系統(tǒng),CPU為Intel(R) Core(TM)i7-8700 CPU,內(nèi)存為16 GB,主頻為3.2 GHz。
采用IDA7.2對(duì)6款測試程序進(jìn)行分析,獲取程序的大小和所包含的函數(shù)個(gè)數(shù),并采用Local Windows Debugger調(diào)試器,對(duì)以mspaint.exe畫圖程序的圖片粘貼關(guān)鍵代碼段圖7為例的所有測試程序進(jìn)行跟蹤分析,獲取執(zhí)行指令數(shù)目以及執(zhí)行時(shí)間,基本信息如表1所示。
表1 測試用例描述
圖7 畫圖程序分析信息
首先構(gòu)建虛擬機(jī)代碼保護(hù)原型系統(tǒng)M-VM,然后再運(yùn)用基于圖變換的虛擬機(jī)保護(hù)方法對(duì)原型系統(tǒng)M-VM進(jìn)行混淆增強(qiáng)變換生成GOB-VM虛擬機(jī)。變換過程中:設(shè)定模塊切分參數(shù)為2,數(shù)據(jù)和代碼跳變中隨機(jī)切分片段數(shù)目為2,進(jìn)行3次迭代膨脹變形,嵌套深度和寬度次數(shù)為1次,并采用二次映射混沌系統(tǒng)所構(gòu)造出來的多樣化不透明謂詞進(jìn)行模塊邏輯的連接。
然后基于表1中的測試程序,分別采用M-VM,GOB-VM,以及商用軟件Code Virtualizer(CV),VMProtect對(duì)其進(jìn)行保護(hù),其中CV版本號(hào)為3.0.8.0使用的虛擬機(jī)類型為Tiger32 White;VMP版本號(hào)為3.5,采用默認(rèn)設(shè)置策略進(jìn)行虛擬機(jī)保護(hù)。表2為保護(hù)前后軟件大小的變化,表3為保護(hù)前后關(guān)鍵代碼指令執(zhí)行時(shí)間的變化。由于每次執(zhí)行時(shí)間都有所不同,因此圖表中執(zhí)行時(shí)間為20次執(zhí)行時(shí)間的平均值。
從表2和3可得,通過不同虛擬機(jī)框架對(duì)程序進(jìn)行保護(hù),保護(hù)后的程序無論在程序大小還是在運(yùn)行時(shí)間上都會(huì)有較大的增長,如果采用虛擬機(jī)框架對(duì)程序進(jìn)行保護(hù),一般只對(duì)程序核心代碼和核心數(shù)據(jù)進(jìn)行保護(hù)。GOB-VM與商用保護(hù)軟件進(jìn)行對(duì)比:其空間和時(shí)間的增長開銷與CV基本持平,但遠(yuǎn)高于商用軟件VMP和原型虛擬機(jī)系統(tǒng)M-VM。在實(shí)際使用GOB-VM對(duì)軟件進(jìn)行保護(hù)的時(shí)候,如果要提高其安全強(qiáng)度,需要提升模塊切分參數(shù)值,數(shù)據(jù)和代碼跳變中隨機(jī)切分片段數(shù)目,迭代膨脹變形次數(shù),虛擬機(jī)嵌套深度和寬度次數(shù),以及挑選安全強(qiáng)度更高的混沌不透明謂詞,這樣會(huì)使得程序的空間和時(shí)間開銷有進(jìn)一步的增長。
表2 保護(hù)前后程序大小
表3 保護(hù)前后關(guān)鍵代碼執(zhí)行時(shí)間
如果要降低虛擬機(jī)保護(hù)帶給程序的時(shí)間開銷,增強(qiáng)虛擬機(jī)保護(hù)的應(yīng)用性,則需要降低模塊切分參數(shù)值,數(shù)據(jù)和代碼跳變中隨機(jī)切分片段數(shù)目,迭代膨脹變形次數(shù),控制虛擬機(jī)嵌套層次,以及挑選能夠?qū)崿F(xiàn)快速運(yùn)算的混沌不透明謂詞。
本文針對(duì)虛擬機(jī)核心模塊連接結(jié)構(gòu)的固定性,提出一種基于圖變換的虛擬機(jī)安全性增強(qiáng)方法,方法基于虛擬機(jī)結(jié)構(gòu)圖變換算法,三策略組合的多樣化虛擬機(jī)框架集生成算法,以及虛擬機(jī)嵌套算法,在算法實(shí)現(xiàn)過程中,采用混沌不透明謂詞對(duì)變換后的結(jié)構(gòu)進(jìn)行連接,并運(yùn)用跳轉(zhuǎn)表對(duì)連接結(jié)構(gòu)進(jìn)行隱藏,基于等價(jià)變換規(guī)則的復(fù)合生成多樣化代碼?;贛-VM原型虛擬機(jī)實(shí)現(xiàn)了加固型GOB-VM虛擬機(jī)系統(tǒng),通過相關(guān)分析和測試表明:基于圖變換的虛擬機(jī)混淆方法,能夠大大提升虛擬機(jī)系統(tǒng)內(nèi)部結(jié)構(gòu)理解的難度,對(duì)于核心代碼和數(shù)據(jù)能夠有更高的保護(hù)強(qiáng)度,可以極大的提高數(shù)據(jù)安全性。
在實(shí)際虛擬機(jī)系統(tǒng)的變換實(shí)現(xiàn)過程中,由于涉及到多種不同的參數(shù),如果為了更進(jìn)一步提升保護(hù)的安全性,可以將模塊切分更細(xì)粒度,迭代次數(shù)更多,嵌套層數(shù)更深,但隨時(shí)將帶來程序時(shí)間開銷極大的增加,導(dǎo)致虛擬機(jī)保護(hù)方法應(yīng)用性大大降低,但如果粗粒度切分,降低迭代次數(shù)和嵌套層數(shù),會(huì)導(dǎo)致虛擬機(jī)保護(hù)方法安全性的降低。因此,下一步工作是虛擬機(jī)混淆保護(hù)方法的開銷和安全性的平衡問題,并進(jìn)行更大規(guī)模測試用例和參數(shù)的相關(guān)實(shí)驗(yàn)。