余祥 周元璞 李強(qiáng)
隨著信息化的不斷發(fā)展和深入,軟件給我們的生產(chǎn)生活方式帶來(lái)了巨大的變化,深刻地改變著社會(huì)生產(chǎn)、科技探索和戰(zhàn)爭(zhēng)形態(tài)等.軟件安全問(wèn)題也顯得愈發(fā)重要.尤其是指揮信息系統(tǒng)軟件等核心軟件一旦被非法攻擊、破解,進(jìn)而通過(guò)對(duì)軟件的逆向分析,掌握關(guān)鍵數(shù)據(jù)和重要情報(bào),甚至修改軟件運(yùn)行結(jié)果,從而給國(guó)家?guī)?lái)巨大損失.
軟件逆向分析是軟件安全威脅的重要原因.軟件逆向分析是指對(duì)二進(jìn)制文件反匯編的基礎(chǔ)上進(jìn)行理解和再現(xiàn)的過(guò)程.一方面,軟件逆向分析技術(shù)可以促進(jìn)軟件產(chǎn)業(yè)的發(fā)展;另一方面,這直接導(dǎo)致了軟件面臨嚴(yán)重的逆向分析威脅.因此,軟件抗逆向分析方面的研究也越來(lái)越受到人們的重視,用于抗逆向分析的軟件保護(hù)技術(shù)主要有軟件加殼[1]、代碼混淆[2]、軟件加密[3]、代碼隔離[4]和虛擬機(jī)技術(shù)[5]等.
隨著軟件攻擊手段的豐富和發(fā)展,單一的軟件保護(hù)技術(shù)已不足以保證軟件安全.將多種軟件保護(hù)技術(shù)結(jié)合使用是提高軟件安全的有效方法.本文提出一種基于虛擬機(jī)代碼隔離的軟件保護(hù)方法,將虛擬機(jī)技術(shù)和代碼隔離方法相結(jié)合,提高軟件抗逆向分析能力.
基于虛擬機(jī)代碼隔離的軟件保護(hù)方法的基本思想是將軟件的一部分從軟件整體中分隔開(kāi),軟件運(yùn)行時(shí)再組合成一個(gè)整體,從而提高軟件抗逆向分析能力.為保證軟件被分隔后運(yùn)行效率,分隔出的部分不宜過(guò)大,因此,只分隔軟件關(guān)鍵數(shù)據(jù)和關(guān)鍵代碼,將其從軟件中提取后,轉(zhuǎn)換為虛擬機(jī)代碼添加到重構(gòu)后的軟件文件或直接移植到加密鎖中.
本文主要研究關(guān)鍵數(shù)據(jù)和代碼的提取、轉(zhuǎn)換和移植方法.關(guān)鍵數(shù)據(jù)和代碼的提取主要包括用戶直接指定[6]、動(dòng)態(tài)調(diào)試定位[7]和靜態(tài)分析定位[8]3種.其中,用戶直接指定需要用戶對(duì)軟件源程序和匯編較為熟悉;動(dòng)態(tài)調(diào)試定位通過(guò)動(dòng)態(tài)執(zhí)行軟件獲取軟件的控制流和數(shù)據(jù)流,獲取軟件的關(guān)鍵數(shù)據(jù)和代碼;靜態(tài)分析定位不需要調(diào)試定位,通過(guò)關(guān)鍵字匹配、復(fù)雜度計(jì)算等方法定位關(guān)鍵代碼和數(shù)據(jù).
文獻(xiàn)[9?10]提出通過(guò)執(zhí)行軌跡差異定位關(guān)鍵代碼和數(shù)據(jù),即通過(guò)兩次運(yùn)行程序,給予程序不同輸入,使其一次執(zhí)行特定功能,另一次不執(zhí)行該功能,分別記錄程序運(yùn)行指令的軌跡,對(duì)比軌跡差異獲取關(guān)鍵代碼.
文獻(xiàn)[11]設(shè)計(jì)了WBRPE(White Box Remote Program Execution)白盒遠(yuǎn)程程序執(zhí)行架構(gòu),使程序執(zhí)行過(guò)程依賴于本地機(jī)器和服務(wù)器,文獻(xiàn)[12]對(duì)其進(jìn)行了改進(jìn),利用混淆器對(duì)傳至服務(wù)器的代碼或數(shù)據(jù)進(jìn)行了混淆.但這種基于服務(wù)器的保護(hù)方法將關(guān)鍵代碼或數(shù)據(jù)在服務(wù)器中執(zhí)行,對(duì)軟件性能影響較大,應(yīng)用環(huán)境有一定限制.
文獻(xiàn)[13?14]提出的基于虛擬執(zhí)行環(huán)境的保護(hù)方法都是基于指令動(dòng)態(tài)映射完成的,在這個(gè)過(guò)程中需要運(yùn)行時(shí)修改內(nèi)存,容易被定位分析,且由于構(gòu)造虛擬執(zhí)行環(huán)境時(shí)間開(kāi)銷較大,僅適用于保護(hù)分散的少量指令片段,效率和強(qiáng)度較低.
本文提出的關(guān)鍵代碼和數(shù)據(jù)提取方法基于動(dòng)態(tài)調(diào)試和控制流、數(shù)據(jù)流分析,相較于用戶直接指定的方法,對(duì)用戶要求較低;相較于靜態(tài)分析的方法以及通過(guò)關(guān)鍵字查找的方法,定位關(guān)鍵代碼更全面和準(zhǔn)確,但實(shí)現(xiàn)相對(duì)復(fù)雜.關(guān)鍵代碼和數(shù)據(jù)的轉(zhuǎn)換方法基于X86指令集系統(tǒng)進(jìn)行映射,成本開(kāi)銷相對(duì)較小,實(shí)現(xiàn)復(fù)雜度較低.關(guān)鍵數(shù)據(jù)和代碼移植基于硬件加密鎖的虛擬執(zhí)行環(huán)境,對(duì)軟件的性能影響較小,應(yīng)用環(huán)境也更自由.
關(guān)鍵數(shù)據(jù)和代碼是軟件最核心的部分,關(guān)鍵數(shù)據(jù)是軟件的核心參數(shù),關(guān)鍵代碼一般為軟件的核心算法.確定軟件關(guān)鍵數(shù)據(jù)或代碼的準(zhǔn)則有4條:
準(zhǔn)則1.去除數(shù)據(jù)或代碼后軟件的核心功能無(wú)法正常使用;
準(zhǔn)則2.去除數(shù)據(jù)或代碼后軟件的運(yùn)行結(jié)果不正確;
準(zhǔn)則3.數(shù)據(jù)或代碼被修改后軟件的核心功能無(wú)法正常使用;
準(zhǔn)則4.數(shù)據(jù)或代碼被修改后軟件的運(yùn)行結(jié)果不正確.
軟件關(guān)鍵代碼提取就是要獲取軟件關(guān)鍵代碼的地址信息,即待保護(hù)指令序列的起始地址信息;關(guān)鍵數(shù)據(jù)提取是指獲取軟件關(guān)鍵數(shù)據(jù)的值信息.提取軟件關(guān)鍵數(shù)據(jù)和關(guān)鍵代碼通過(guò)分析軟件運(yùn)行時(shí)的指令流和數(shù)據(jù)流,分析軟件代碼的行為特征,將指令流信息劃分為若干代碼塊,采用程序切片和特征匹配的方法獲取.
找到軟件關(guān)鍵代碼保護(hù)指令序列的起始位置,是進(jìn)行關(guān)鍵代碼提取和轉(zhuǎn)換的首要步驟.將軟件中的關(guān)鍵代碼轉(zhuǎn)換為虛擬機(jī)字節(jié)碼,也就是將源匯編代碼指令系統(tǒng)的可執(zhí)行代碼,轉(zhuǎn)換為自定義的虛擬機(jī)字節(jié)碼,并在其中通過(guò)代碼混淆等技術(shù)保護(hù)軟件.其工作過(guò)程如圖1所示.從源匯編代碼得到原始指令流,經(jīng)過(guò)隨機(jī)映射得到虛擬機(jī)編碼,與待保護(hù)的軟件關(guān)鍵代碼一起通過(guò)虛擬機(jī)編譯器編譯成虛擬機(jī)字節(jié)碼,即保護(hù)后的字節(jié)碼.指令處理函數(shù)通過(guò)變形引擎進(jìn)行指令轉(zhuǎn)換,轉(zhuǎn)換后的代碼通過(guò)解釋器進(jìn)行解釋執(zhí)行.
指令集是存儲(chǔ)在CPU內(nèi)部,對(duì)CPU運(yùn)算進(jìn)行指導(dǎo)和優(yōu)化的硬程序,一般包括基本指令和擴(kuò)展指令兩部分.基本指令是所有處理器、虛擬機(jī)或運(yùn)行環(huán)境都會(huì)提供的指令集,而擴(kuò)展指令一般只在真實(shí)處理器中.虛擬機(jī)指令集是虛擬機(jī)的基礎(chǔ),規(guī)定了虛擬機(jī)的運(yùn)行方式.
圖1 基于虛擬機(jī)的軟件保護(hù)過(guò)程示意圖
構(gòu)造用于保護(hù)軟件的虛擬機(jī)并不需要實(shí)現(xiàn)指令集所有指令的功能,部分指令的功能可以通過(guò)其他簡(jiǎn)單指令進(jìn)行運(yùn)算實(shí)現(xiàn).因此,定義一個(gè)簡(jiǎn)化的基本指令集作為虛擬機(jī)指令集可以有效避免復(fù)雜的指令系統(tǒng)帶來(lái)的性能損失.據(jù)此定義的虛擬機(jī)指令集如表1所示.
表1 簡(jiǎn)化的虛擬機(jī)指令集
其中,JMPF指令包括JMP、JLE、JL、JE等.虛擬機(jī)指令代碼由源匯編代碼指令轉(zhuǎn)換而來(lái),因此,每條虛擬機(jī)指令代碼應(yīng)包含指令碼、源操作數(shù)、目的操作數(shù).每條源匯編指令的長(zhǎng)度和操作數(shù)并不完全一致,為便于實(shí)現(xiàn),將虛擬機(jī)指令代碼設(shè)為定長(zhǎng),為源匯編代碼指令最長(zhǎng)字節(jié),通過(guò)隨機(jī)生成的方法進(jìn)行代碼轉(zhuǎn)換.所謂隨機(jī)生成是指對(duì)于某一條具體的虛擬機(jī)代碼指令存在不同的形式,如MOV AX,BX,可以出現(xiàn)在源匯編代碼指令字節(jié)的不同位置.通過(guò)處理增加分析和破解的難度.
編譯器是將一種語(yǔ)言翻譯成另一種語(yǔ)言的程序,通常是將高級(jí)語(yǔ)言翻譯成低級(jí)語(yǔ)言.虛擬機(jī)編譯器主要是完成可執(zhí)行程序的目標(biāo)代碼到虛擬機(jī)自定義指令的轉(zhuǎn)換過(guò)程,主要完成的功能有:
1)代碼提取:定位程序待保護(hù)關(guān)鍵代碼段,通過(guò)反匯編將關(guān)鍵代碼段二進(jìn)制數(shù)據(jù)翻譯成匯編級(jí)別的目標(biāo)平臺(tái)機(jī)器指令,為指令轉(zhuǎn)換做準(zhǔn)備.
2)指令轉(zhuǎn)換:將匯編級(jí)別的機(jī)器指令按照一定的映射關(guān)系轉(zhuǎn)換成虛擬機(jī)自定義指令,在每一次保護(hù)過(guò)程中隨機(jī)構(gòu)造指令映射關(guān)系.
3)指令編碼:對(duì)虛擬機(jī)自定義指令進(jìn)行編碼,按編碼規(guī)則將轉(zhuǎn)換后的自定義指令序列翻譯成二進(jìn)制數(shù)據(jù),在每一次保護(hù)過(guò)程中隨機(jī)生成指令編碼規(guī)則.
4)虛擬機(jī)生成:根據(jù)保護(hù)過(guò)程中的隨機(jī)映射關(guān)系和指令集得到源匯編代碼的指令解析代碼,并添加到虛擬機(jī)解釋器中.
5)文件重構(gòu):將虛擬機(jī)編譯器、解釋器和指令編碼后的代碼添加到程序源文件中,重新生成新的程序文件.
虛擬機(jī)編譯器的輸入是軟件反匯編得到的源匯編指令,輸出是虛擬機(jī)指令代碼.為簡(jiǎn)化代碼轉(zhuǎn)換規(guī)則和虛擬機(jī)解釋器的設(shè)計(jì),提高虛擬機(jī)執(zhí)行效率,基于表1所示指令集設(shè)計(jì)虛擬機(jī)指令集,使用基于寄存器的體系結(jié)構(gòu)并設(shè)置包含特殊寄存器的多寄存器,同時(shí)引入堆棧,提高虛擬機(jī)執(zhí)行效率.
虛擬機(jī)執(zhí)行虛擬機(jī)指令代碼主要有解釋執(zhí)行、即時(shí)編譯和二者結(jié)合3種方法.考慮到轉(zhuǎn)換的關(guān)鍵代碼內(nèi)容較少,為提高執(zhí)行效率,針對(duì)每一個(gè)指令碼設(shè)計(jì)對(duì)應(yīng)的解釋函數(shù),虛擬機(jī)解釋執(zhí)行指令時(shí)先根據(jù)條件找到對(duì)應(yīng)的解釋函數(shù)再解釋執(zhí)行.虛擬機(jī)解釋執(zhí)行示意圖如圖2所示.
圖2 虛擬機(jī)解釋執(zhí)行示意圖
簡(jiǎn)單和直接實(shí)現(xiàn)的指令分配方式是每一個(gè)指令碼對(duì)應(yīng)一個(gè)函數(shù),然后通過(guò)switch進(jìn)行分配,示例代碼是:
為降低函數(shù)調(diào)用的開(kāi)銷,將所有函數(shù)代碼放在一起,形成一個(gè)大的switch語(yǔ)句塊,可以避免頻繁的函數(shù)調(diào)用,提高虛擬機(jī)解釋執(zhí)行效率,示例如下:
但這樣執(zhí)行switch語(yǔ)句需要對(duì)每一條執(zhí)行的指令都進(jìn)行一次線性搜索,通過(guò)函數(shù)指針將每個(gè)指令碼對(duì)應(yīng)的操作寫(xiě)在單獨(dú)的函數(shù)中,然后將每個(gè)指令碼替換為對(duì)應(yīng)的函數(shù)指針,從而省去線性搜索提高效率.替換后的switch語(yǔ)句描述如下:
關(guān)鍵數(shù)據(jù)和關(guān)鍵代碼是軟件核心算法所對(duì)應(yīng)的代碼和重要參數(shù)對(duì)應(yīng)的數(shù)據(jù).關(guān)鍵數(shù)據(jù)和代碼的提取是通過(guò)分析軟件運(yùn)行時(shí)的指令流和數(shù)據(jù)流進(jìn)行定位和提取的.
軟件運(yùn)行時(shí)的指令流和數(shù)據(jù)流都是未經(jīng)解析的二進(jìn)制信息.為便于理解和分析,首先將其轉(zhuǎn)化為字符串信息.然后根據(jù)指令類型分別采用相應(yīng)的方法進(jìn)行分析,獲取關(guān)鍵代碼的地址信息.
靜態(tài)特征分析就是通過(guò)字符串匹配的方法,在指令流和數(shù)據(jù)流轉(zhuǎn)換后的字符串信息中查找已知的靜態(tài)特征.字符串匹配可以是多個(gè)條件的邏輯運(yùn)算.例如,以調(diào)用外部函數(shù)關(guān)鍵字“Shell”和線程函數(shù)“Thread”作為靜態(tài)特征分析軟件的功能,構(gòu)造邏輯表達(dá)式計(jì)算模糊查詢“Shell”和“Thread”的邏輯與運(yùn)算,根據(jù)匹配結(jié)果定位到代碼處,然后進(jìn)一步通過(guò)其他特征的分析,得到分析結(jié)果.
轉(zhuǎn)移指令是不按程序的語(yǔ)句流程執(zhí)行的指令.通過(guò)分析轉(zhuǎn)移指令可以分析出軟件多個(gè)代碼塊之間的相互調(diào)用關(guān)系和軟件代碼的執(zhí)行路徑,有助于理解代碼上下文之間的關(guān)系,從而分析軟件行為特征.
轉(zhuǎn)移指令分析可以通過(guò)構(gòu)建指令流的流程圖實(shí)現(xiàn).首先找出指令流信息中所有轉(zhuǎn)移指令,根據(jù)轉(zhuǎn)移指令位置將指令流劃分為多個(gè)代碼塊,并合并多次出現(xiàn)的相同代碼塊為一個(gè)模塊,根據(jù)轉(zhuǎn)移指令的跳轉(zhuǎn)關(guān)系,將代碼塊按順序組合構(gòu)建軟件運(yùn)行時(shí)的指令流的流程圖.
一個(gè)程序切片是軟件程序的部分語(yǔ)句和判定表達(dá)式所組成的集合[15].程序切分分析基于分治算法的思想,主要用于分解程序,將需要分析的問(wèn)題從復(fù)雜的程序中分隔開(kāi)單獨(dú)分析,有助于降低問(wèn)題復(fù)雜度,便于分析和解決.程序切片分析通過(guò)分析數(shù)據(jù)的依賴關(guān)系,計(jì)算出影響輸入的數(shù)據(jù)i的語(yǔ)句和判定表達(dá)式,將相關(guān)的指令和數(shù)據(jù)集合作為切片,進(jìn)行分析.程序切片輸入的數(shù)據(jù)i可以是指令、內(nèi)存地址、數(shù)據(jù)值或是寄存器信息等.對(duì)運(yùn)行時(shí)的指令流和數(shù)據(jù)流進(jìn)行程序切片分析,能在復(fù)雜的軟件程序中較快地提取關(guān)鍵信息并分析特征.由上,設(shè)計(jì)軟件關(guān)鍵代碼提取算法如下所示.
算法.關(guān)鍵代碼提取算法;
輸入.指令流和數(shù)據(jù)流信息起始語(yǔ)句Sentence,指令集合CommandSet,數(shù)據(jù)集合DataSet,指令集合與數(shù)據(jù)集合的部分映射關(guān)系MapRelation;
輸出.相關(guān)指令和數(shù)據(jù)集合ResultSet.
算法描述:
軟件的關(guān)鍵代碼轉(zhuǎn)換是將待保護(hù)軟件中的關(guān)鍵代碼轉(zhuǎn)換為虛擬機(jī)字節(jié)碼,也就是將x86指令系統(tǒng)的可執(zhí)行代碼轉(zhuǎn)換為用戶自定義的虛擬機(jī)字節(jié)碼代碼.轉(zhuǎn)換主要包括指令映射和指令編碼.指令映射是將匯編級(jí)別的機(jī)器指令按照一定的映射關(guān)系轉(zhuǎn)換為自定義的虛擬機(jī)指令,并保存在相應(yīng)的結(jié)構(gòu)和存儲(chǔ)單元中,每一次轉(zhuǎn)換過(guò)程中隨機(jī)構(gòu)造指令映射關(guān)系;指令編碼是對(duì)自定義的虛擬機(jī)指令進(jìn)行編碼,按照編碼規(guī)則將轉(zhuǎn)換后的自定義指令序列翻譯成二進(jìn)制數(shù)據(jù),每一次轉(zhuǎn)換過(guò)程中隨機(jī)生成指令編碼規(guī)則.其中,指令映射是核心.
軟件反匯編得到的一條匯編指令記為inm,所有匯編指令組成目標(biāo)指令結(jié)合T={in1,in2,···,inn},ini∈T,≤i≤n.將需要轉(zhuǎn)換的關(guān)鍵代碼指令記為insi,關(guān)鍵代碼指令集合P={ins1,ins2,···,insk},insi∈P,1≤i≤k,P?T.將用于解釋被保護(hù)指令的虛擬指令記為vi,其集合V={v1,v2,···,vw},vi∈V.一條指令可以被一條或多條虛擬指令解釋,解釋一條指令insi的虛擬指令序列記為其中,1≤j≤w.如VI(ins2)={v2,v4,v5}表示通過(guò)v2,v4,v53條虛擬指令解釋指令ins2.轉(zhuǎn)換函數(shù)表示虛擬指令和關(guān)鍵代碼指令的轉(zhuǎn)換關(guān)系,記為T(mén)Fi.轉(zhuǎn)換函數(shù)序列TF(ins)表示解釋指令insi的處理函數(shù)序列,其集合記為T(mén)FSet(insx)={TF(ins1),TF(ins2),···,TF(insc)}由此,設(shè)計(jì)關(guān)鍵代碼轉(zhuǎn)換算法如下所示.
算法.關(guān)鍵代碼轉(zhuǎn)換算法
輸入.關(guān)鍵代碼指令集合P={ins1,ins2,···,insk};
輸出.虛擬指令序列VI.
算法描述:
1)定義虛擬指令序列為空集合,即VI=?;
2)for eachinsi∈P
3)計(jì)算轉(zhuǎn)換函數(shù)序列TF(insi)={hd1···hdn}
4)for eachhdm∈TF(insi)
5)計(jì)算虛擬指令vi
6)將虛擬指令vi加入虛擬指令序列VI;
7)end each
8)end each
關(guān)鍵數(shù)據(jù)和代碼隔離是將軟件關(guān)鍵數(shù)據(jù)存儲(chǔ)在加密鎖中,或?qū)㈥P(guān)鍵代碼轉(zhuǎn)換為加密鎖內(nèi)可執(zhí)行的編譯語(yǔ)言代碼,并將編譯生成的文件寫(xiě)入加密鎖中.
關(guān)鍵數(shù)據(jù)和代碼在寫(xiě)入加密鎖前,需要進(jìn)行加密處理,常用的加密算法包括3DES、SM4等,軟件調(diào)用關(guān)鍵數(shù)據(jù)或關(guān)鍵代碼時(shí),通過(guò)與加密鎖的通信接口獲取加密鎖獲取存儲(chǔ)在加密鎖中的關(guān)鍵數(shù)據(jù)或關(guān)鍵代碼的運(yùn)行結(jié)果并調(diào)用解密算法將數(shù)據(jù)解密后使用.從而將軟件和加密鎖捆綁為一個(gè)整體,通過(guò)基于硬件的方式隱藏關(guān)鍵數(shù)據(jù)和代碼,實(shí)現(xiàn)代碼隔離.軟件關(guān)鍵數(shù)據(jù)和代碼隔離原理示意圖如圖3所示.應(yīng)用軟件小圓圈A即為要隔離的關(guān)鍵數(shù)據(jù)或代碼,軟件“芯”加密鎖小圓圈B即為隔離處理后隱藏在加密鎖中個(gè)關(guān)鍵數(shù)據(jù)或代碼.
圖3 關(guān)鍵數(shù)據(jù)和代碼隔離原理示意圖
軟件關(guān)鍵數(shù)據(jù)和代碼隔離是從軟件程序中“切分”出關(guān)鍵代碼片段或關(guān)鍵數(shù)據(jù),通過(guò)基于硬件的方式隱藏所切分的關(guān)鍵數(shù)據(jù)或代碼,將關(guān)鍵數(shù)據(jù)或代碼隱藏在加密鎖中,從而使軟件主程序和關(guān)鍵代碼或數(shù)據(jù)相分離,難以通過(guò)逆向分析獲取軟件關(guān)鍵數(shù)據(jù)或核心算法.
加密鎖內(nèi)移植多個(gè)關(guān)鍵代碼塊后,通過(guò)計(jì)算時(shí)間間隔可以判斷是否處在動(dòng)態(tài)調(diào)試環(huán)境,從而有效提高軟件抗逆向分析的能力.若加密鎖中包含關(guān)鍵代碼塊S1,S2···Sn,軟件P運(yùn)行時(shí)需要按順序調(diào)用S1和S2,即:S1→S2,則執(zhí)行S1和S2之間的時(shí)間間隔在一個(gè)固定時(shí)間范圍T內(nèi)(范圍值T可以通過(guò)軟件測(cè)試計(jì)算獲得),在軟件P調(diào)用S1時(shí),獲取加密鎖時(shí)間T1,在P調(diào)用S2時(shí),獲取加密鎖時(shí)間T2,計(jì)算T0=T2?T1,若T0>T,則可認(rèn)為是軟件正在被調(diào)試,可以通過(guò)銷毀加密鎖內(nèi)關(guān)鍵數(shù)據(jù)等方法使軟件P無(wú)法正常使用,防止軟件被逆向分析.由此,通過(guò)加密鎖調(diào)用關(guān)鍵代碼判斷動(dòng)態(tài)調(diào)試的算法設(shè)計(jì)如下所示.
算法.加密鎖關(guān)鍵代碼調(diào)用判斷動(dòng)態(tài)調(diào)試算法
輸入.無(wú)
輸出.判斷結(jié)果
算法描述:
將多種軟件保護(hù)手段相結(jié)合共同保護(hù)軟件能有效提高軟件破解和攻擊的難度.本文提出的基于虛擬機(jī)代碼隔離的軟件保護(hù)方法,通過(guò)分析和設(shè)計(jì)虛擬機(jī)指令集、編譯器和解釋器,確定了關(guān)鍵數(shù)據(jù)和代碼的提取準(zhǔn)則和轉(zhuǎn)換方法,通過(guò)代碼隔離的方法將軟件關(guān)鍵數(shù)據(jù)和關(guān)鍵代碼分別隔離在構(gòu)建的虛擬機(jī)和硬件加密鎖中,從而使軟件不再是一個(gè)完整的整體,難以通過(guò)逆向分析獲取軟件關(guān)鍵數(shù)據(jù)和核心算法,有效提高了軟件攻擊的復(fù)雜度.
在多個(gè)項(xiàng)目軟件中對(duì)本文提出的方法進(jìn)行了使用,目前軟件運(yùn)行穩(wěn)定,未發(fā)現(xiàn)軟件被攻擊的情況.下一步考慮進(jìn)一步完善虛擬機(jī)技術(shù)的相關(guān)理論,擴(kuò)充虛擬機(jī)指令集,提高虛擬機(jī)編譯和解釋執(zhí)行的效率.
1王建民,王朝坤,余志偉.軟件保護(hù)技術(shù)[M].北京:清華大學(xué)出版社,2013.
2 COLLBERG C,THOMBORSON C.A taxonomy of obfuscationg transformations[R].Auckland:Department of Computer Science,University of Auckland,1997.
3 段剛.加密與解密[M].北京:電子工業(yè)出版社,2003:16?23.
4 MAUDE T,MAUDE D.Hardware protection against software piracy[J].Communications of the ACM,1984,27(9):950?959.
5 AVERBUCHA,KIPERBERGM,ZAIDENBERGN J.Truly-Protect:An efficient vm-based software protection[J].IEEE Systems Journal,2013,3(7):455?466.
6許廣蓮,房鼎益,王懷軍,等.一種白盒環(huán)境中抗動(dòng)態(tài)攻擊的軟件保護(hù)方法[J].小型微型計(jì)算機(jī)系統(tǒng),2015,36(9):2062?2066.
7王妮.基于攻擊建模的軟件保護(hù)有效性評(píng)估方法研究[D].西安:西北大學(xué),2012.
8崔寶江,梁曉冰,王禹,等.基于回溯與引導(dǎo)的關(guān)鍵代碼區(qū)域覆蓋的二進(jìn)制程序測(cè)試技術(shù)研究[J].電子與信息學(xué)報(bào),2012,34(1):108?113.
9康緋,王乾,肖亞南,等.基于軟件執(zhí)行軌跡差異比對(duì)的關(guān)鍵函數(shù)定位技術(shù)研究[J].通信學(xué)報(bào),2013,9(34):177?184.
10 LIU D,ARCUS A,POSHYVANYYK D.Feature location via information retrieval based filterin of a single scenario execution trace[R].New York:IEEE,2007.
11 HERZBERG A,SHULMAN H,SAXENA A,et al.Towards a theory of white-box security[M].Berlin:Springer Berlin Heidelberg,2009:342?352.
12 HERZBERG A,SHULMAN H.Robust combiners for software hardening[M].Berlin:Springer Berlin Heidelberg,2010:282?289.
13 SHARIF M,LANZI A,GIFFLN J,et al.Automatic reverse engineering of malware emulators[C]//Oakland,California:Washington:IEEE Computer Society,2009.
14謝鑫,劉粉林,蘆斌,等.一種基于代碼并行化和虛擬機(jī)多樣化的軟件保護(hù)方法[J].小型微型計(jì)算機(jī)系統(tǒng),2015,11(36):2588?2593.
15 HORWITZ S,REPS T,BINKLEY D.Interprocedural slicing using dependence graphs[J].Acm Transactions on Programming Languages and Systems,1990,12(1):26?28.