• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于模式切換的ARM匯編代碼混淆算法

      2021-09-26 10:43:28樂德廣龔聲蓉
      計算機工程與應(yīng)用 2021年18期
      關(guān)鍵詞:控制流寄存器復(fù)雜度

      樂德廣,趙 杰,龔聲蓉

      1.常熟理工學(xué)院 計算機科學(xué)與工程學(xué)院,江蘇 常熟215500

      2.蘇州同程網(wǎng)絡(luò)科技股份有限公司,江蘇 蘇州215123

      ARM架構(gòu)的處理器以其高速度、低功耗等許多優(yōu)異的特性而在智能手機中得到非常廣泛的應(yīng)用。目前大部分的安卓智能手機都采用ARM處理器。與此同時,ARM應(yīng)用程序的數(shù)量每年呈現(xiàn)指數(shù)式的增長。2019年,全球手機APP下載量高達2040億次[1],在休閑、娛樂、社交、辦公、投資、購物、生活和醫(yī)療等方面都有手機APP的身影,它們不僅影響著人們的日常生活,而且推動著經(jīng)濟發(fā)展。

      在各類ARM應(yīng)用呈井噴式增長,為用戶帶來便利和促進經(jīng)濟增長的同時,針對ARM架構(gòu)的程序攻擊日益突出,如ARM指令形式化變換逆向工程、靜態(tài)分析和動態(tài)調(diào)試等[2],帶來了巨大的隱私信息泄露的隱患,也造成各種惡意軟件和盜版應(yīng)用泛濫。因此,如何保護基于ARM處理器的應(yīng)用程序,成為軟件安全研究的重點。

      代碼混淆是一種保留語義的程序變換技術(shù),其目的是使程序邏輯變得難以理解,增加逆向工程的難度,從而有效保護軟件[3]。文獻[4]在分析安卓軟件遭受惡意攻擊的基礎(chǔ)上,提出一種基于Java的安卓應(yīng)用代碼混淆技術(shù),旨在提高安卓應(yīng)用代碼的隱蔽性,進而使安卓應(yīng)用得到更有效的保護。但是該技術(shù)工作在Java層,很容易被逆向反編譯。文獻[5]通過研究市場上流行的軟件混淆技術(shù),開發(fā)了一種主要針對Smali代碼的混淆算法,研究其控制流混淆,變量混淆和虛假代碼的注入,通過分析反編譯工具的弱點,其混淆之后的代碼可以免受反編譯工具的靜態(tài)分析。文獻[6]通過對原DEX文件進行重構(gòu)和加密,將其關(guān)鍵Java函數(shù)屬性改為Native(C/C++屬性),并通過Hook技術(shù)和反射機制隱式恢復(fù)并執(zhí)行原Java函數(shù),可以有效抵御靜態(tài)分析攻擊,獲取高強度的保護效果。

      以上ARM程序混淆方法都是從高級語言(如Java或C/C++)層面,或者中間語言(如Smali)層面對程序進行混淆,沒有從底層匯編指令層面進行考慮,并充分利用ARM指令集的工作模式及寄存器間接尋址等特性對程序進行混淆。而目前針對底層匯編ARM指令的混淆,尚未有適當(dāng)理論方法來指導(dǎo)生成多模式切換的指令混淆以準(zhǔn)確測試ARM應(yīng)用安全充分性、達到更全面的代碼指令安全。

      為此,本文研究如何從混淆底層ARM匯編指令方式的角度,提高ARM程序安全性,并提出一種基于模式切換的ARM匯編代碼混淆算法。該算法通過ARM處理器的多指令集工作模式建立新的模式切換模型,描述ARM指令切換行為的全貌和邏輯規(guī)律,提高指令混淆中考慮模式切換的全面性,建立指令混淆的新型指令模式切換混淆方式,并提出對應(yīng)的指令切換混淆算法。此外,在對ARM指令集中數(shù)據(jù)處理和切換指令進行分析的同時,結(jié)合ARM體系結(jié)構(gòu)寄存器尋址特征,提出基于寄存器間接尋址跳轉(zhuǎn)的ARM寄存器混淆和虛假指令混淆的優(yōu)化方法,使得ARM應(yīng)用中關(guān)鍵代碼的安全性在ARM平臺上進一步的提升。

      1 ARM匯編指令安全性分析

      ARM是一種低功耗、高性能的RISC處理器架構(gòu)。ARM體系結(jié)構(gòu)采用定長指令,指令格式和尋址方式也相對簡單,大大降低了體系結(jié)構(gòu)的復(fù)雜性。為兼容數(shù)據(jù)總線寬度為16位的應(yīng)用系統(tǒng),ARM體系結(jié)構(gòu)除了支持執(zhí)行效率很高的32位ARM指令集以外,同時支持16位的Thumb指令集[7]。與ARM指令集相比較,Thumb指令集中的數(shù)據(jù)處理指令的操作數(shù)和指令地址仍然是32位,但Thumb指令集為實現(xiàn)16位的指令長度,并舍棄了ARM指令集的一些特性,如ARM指令大多數(shù)都是有條件執(zhí)行的,而Thumb指令則是無條件執(zhí)行。此外,大多數(shù)的Thumb數(shù)據(jù)處理指令的目的寄存器與其中一個源寄存器相同。因此,與等價的32位指令相比,Thumb指令集在保留32指令優(yōu)勢的同時,大大地節(jié)省了系統(tǒng)的存儲空間。

      在ARM應(yīng)用程序的編寫過程中,只要遵循一定調(diào)用的規(guī)則,Thumb子程序和ARM子程序可以互相調(diào)用[8]。當(dāng)處理器在執(zhí)行ARM程序段時,稱ARM處理器處于ARM工作模式,當(dāng)處理器在執(zhí)行Thumb程序段時,稱ARM處理器處于Thumb工作模式。和X86程序一樣,ARM程序面臨逆向攻擊。在程序逆向分析中,一般以反匯編技術(shù)為基礎(chǔ)通過分析二進制文件,利用線性掃描或遞歸遍歷算法反匯編整個可執(zhí)行程序,將機器碼翻譯成匯編代碼[9],并通過分析和處理匯編指令發(fā)現(xiàn)其內(nèi)部的行為和特征。文獻[10]提出一種結(jié)合具體路徑執(zhí)行和遞歸遍歷算法的反匯編技術(shù),用于更好地針對自修改和重疊指令的逆向工程分析。文獻[11]根據(jù)所有可能的基本塊可以通過推測恢復(fù)的原理,提出一種二進制代碼的推測性反匯編技術(shù)。該技術(shù)結(jié)合重疊沖突分析和控制流圖沖突分析提煉基本塊來確定匯編指令。文獻[12]利用演繹驗證和有界模型檢測,提出一種基于反向有界動態(tài)符號執(zhí)行的反匯編方法實現(xiàn)對混淆代碼的動態(tài)精確反匯編分析。文獻[13]通過增加成功的反匯編樣本,并基于SVM進行對它們進行訓(xùn)練和分類,然后結(jié)合線性掃描算法建立一種輕量反匯編方法,有效反匯編出代碼混淆后的指令操作碼。文獻[14]通過對程序運行時的能耗側(cè)信道泄露監(jiān)測和結(jié)合機器學(xué)習(xí)算法確定其匯編指令,并提出一種側(cè)信道反匯編器用于固件逆向工程。文獻[15]通過模擬二進制程序分析中的不確定性提出一種概率反匯編技術(shù)。該技術(shù)基于融合一組能到達地址的不確定特征計算代碼空間中每個地址的概率,用于指示該地址表示真正指令的可能性,并進行相應(yīng)的反匯編,從而實現(xiàn)對反匯編代碼的求精,即在避免漏報的同時,具有很低的誤報率。

      因此,通過反匯編對ARM程序進行逆向分析與利用,引起ARM程序的破解和盜版、隱私數(shù)據(jù)泄露和知識產(chǎn)權(quán)竊取等安全問題。

      2 ARM匯編代碼混淆算法

      在ARM反匯編中,因為ARM和Thumb指令集切換的不明晰而導(dǎo)致切換信息丟失并且造成反匯編出現(xiàn)錯誤。因此,在下面提出的ARM匯編代碼混淆算法中,結(jié)合Thumb模式與ARM模式,首先通過指令等價變換將Thumb模式中的指令序列變換成ARM模式下的指令序列。其次,利用切換指令在Thumb模式和ARM模式之間進行切換混淆,使程序的控制流復(fù)雜化,并利用寄存器間接尋址混淆進一步隱藏切換信息,導(dǎo)致在反匯編中漏解析本來可達的分支流程或者錯解析本來不可達的分支流程。此外,通過虛假指令對反匯編工具的混淆作用,在程序中構(gòu)造虛假分支,來迷惑反匯編器,達到代碼保護的目的。算法總體架構(gòu)如圖1所示。

      圖1 算法總體架構(gòu)Fig.1 Architecture of algorithm

      在圖1中,首先預(yù)處理待保護的Thumb指令,定位關(guān)鍵指令序列ST,然后對關(guān)鍵指令序列進行等價變形SA指令序列。接著,在原始Thumb模式中添加新ARM模式,并將變形處理后新生成的SA指令序列保存在新的ARM模式中。然后,利用切換指令對程序指令進行模式切換,當(dāng)程序執(zhí)行到關(guān)鍵指令序列時,會切換至ARM模式中執(zhí)行變形處理后的指令序列,并利用MT寄存器混淆保護模式切換地址。同時,在模式切換過程中加入QT虛假指令序列填充ST指令序列空間。根據(jù)圖1算法架構(gòu),基于模式切換的ARM匯編代碼混淆算法描述如下:

      步驟1在Thumb指令序列中選定一個分割位置P,設(shè)定分割位置后的待移動指令序列為ST,ST的結(jié)束位置為E。

      步驟2在分割位置P處,隨機選定可用的寄存器作為間接跳轉(zhuǎn)尋址的寄存器。

      步驟3將Thumb指令序列ST轉(zhuǎn)換為等價的ARM指令序列SA:AR M(SA)=Thumb(ST)。

      步驟4在ARM指令序列中選取一個新位置P1,將SA放在位置P1處。

      步驟5在Thumb指令集中構(gòu)造寄存器混淆指令序列MT,使得步驟2中選定的寄存器的計算結(jié)果為新的跳轉(zhuǎn)位置P1。

      步驟6在Thumb指令集中構(gòu)造切換指令,使MT之后的控制流跳轉(zhuǎn)到P1處,并將指令集切換至ARM模式。

      步驟7如果len(ST)-len(MT+1)>0,那么在切換指令之后構(gòu)造虛假指令序列QT,且len(QT)=len(ST)-len(MT+1)。

      步驟8在SA的最后構(gòu)造指令并使用切換指令跳轉(zhuǎn)至位置E,并將指令集切換至Thumb模式。

      算法中的模式切換使用ARM匯編指令集中的模式切換指令來進行構(gòu)造。其中,根據(jù)變形模板函數(shù)ARM()和變形參數(shù)等對指令序列ST進行變形,生成變形指令序列SA。而SA處的地址是寄存器間接選址,且寄存器值是通過間接計算指令序列MT混淆產(chǎn)生。在進行反匯編時,反匯編器無法直接判定寄存器值,所以不能確定模式切換路徑SA的執(zhí)行入口信息,造成遞歸掃描反匯編結(jié)果出錯。另外,通過在切換指令后插入不可執(zhí)行虛假指令序列QT構(gòu)建另一條分支路徑。因為添加的切換指令是合法的,且不可執(zhí)行虛假指令序列QT處的地址也是合法的目的地址,所以QT處的虛假指令序列一定會被反匯編器反匯編,從而將虛假指令QT與其后的原指令結(jié)合在一起,引起線性掃描反匯編出錯。

      根據(jù)上述算法描述,ARM匯編代碼混淆部分主要包含三方面研究內(nèi)容:(1)模式切換混淆,主要通過模式切換指令和設(shè)計指令變形的模板函數(shù)ARM(),利用模板函數(shù)對原始指令進行等價變形和模式切換。(2)寄存器混淆,通過寄存器隨機分配及間接選址計算,隱藏模式切換指令的真實地址。(3)虛假指令混淆,提供了在算法中利用虛假指令序列來實現(xiàn)對于線性掃描反匯編的重同步的延遲。下面重點介紹這些關(guān)鍵技術(shù)。

      2.1 模式切換混淆

      在ARM程序中有兩種方法可以實現(xiàn)程序控制流程的跳轉(zhuǎn),一種是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn),另一種是使用跳轉(zhuǎn)指令直接跳轉(zhuǎn)。其中,BX(Branch eXchange)是帶模式切換的跳轉(zhuǎn)指令,跳轉(zhuǎn)到指定的目標(biāo)地址執(zhí)行程序。ARM架構(gòu)支持在一個上下文中運行ARM和Thumb兩種指令集,它們可通過BX指令進行切換。BX指令格式如下所示:

      其中,BX需要一個目標(biāo)地址寄存器作為第一操作數(shù):BX寄存器(Rx)。如果目標(biāo)地址寄存器的[0]位為1,則跳轉(zhuǎn)時將當(dāng)前程序狀態(tài)寄存器(Current Program Status Register,CPSR)中的標(biāo)志T置位,即把目標(biāo)地址的代碼解釋為Thumb指令。如果目標(biāo)地址寄存器的[0]位為0,則跳轉(zhuǎn)時將CPSR中的標(biāo)志T復(fù)位,即把目標(biāo)地址的代碼解釋為ARM指令。因此,切換依據(jù)如下所示:

      在以上代碼中,如果需要跳轉(zhuǎn)的地址模2余1則表示跳轉(zhuǎn)到Thumb模式,否則就是ARM模式。如果原始程序是Thumb模式,那么就可以利用這個特性來混淆ARM匯編指令。例如,混淆前關(guān)鍵代碼如下所示:

      在以上混淆代碼中,同時存在Thumb和ARM兩種模式的指令序列時,反匯編工具在進行反匯編時需要準(zhǔn)確地識別出不同位置對應(yīng)的指令序列。但是在多模式指令混淆中,通過2次BX實現(xiàn)了跨指令集的來回切換,再配合其他等價變形指令[0x233C~0x2360],所以反匯編工具在執(zhí)行自動分析時往往容易出錯,包括無法識別和識別成錯誤模式。

      2.2 寄存器混淆

      為了進一步加強復(fù)雜度,需要對Rx寄存器混淆,從靜態(tài)和動態(tài)兩方面增加逆向分析的難度。寄存器混淆的核心思想是將寄存器隨機分配和間接化計算,同時保持程序指令及其行為相同,即把立即數(shù)賦值變換成間接賦值,并把一個指令的輸出值重新定位到一個任意的內(nèi)部寄存器,導(dǎo)致代碼中每次出現(xiàn)的指令版本都是不相同,大大增加動靜態(tài)分析難度。例如:

      在代碼片段[0x2236~0x2242]中,通過“ADD R6,R6,R5”計算最終的跳轉(zhuǎn)地址,它的結(jié)果依賴寄存器R5的值,而R5又是從內(nèi)存地址R4中讀取的,即需要再進一步向前分析向該內(nèi)存地址存儲寫數(shù)據(jù)的位置。這樣就實現(xiàn)了R5的一個間接賦值,從而使得其更難看出0x2242處BX R6實際的跳轉(zhuǎn)位置。

      2.3 虛假指令混淆

      由于虛假指令對反匯編工具的混淆作用,在本算法中利用虛假指令序列來實現(xiàn)對線性掃描反匯編的重同步的延遲。虛假指令本身對程序執(zhí)行并沒有影響,因此虛假指令序列的主體部分還需要無效指令和隨機數(shù)據(jù)的填充。為有效利用這部分填充的隨機數(shù)據(jù),在生成虛假指令序列時,就需要對這部分數(shù)據(jù)進行有目的的構(gòu)造,在隨機的數(shù)據(jù)中引用原程序中的元變量和對象(如寄存器和內(nèi)存地址等),通過寫內(nèi)存和加減法計算,然后根據(jù)指令長度選取指定數(shù)量指令形成虛假指令序列,進一步提升虛假分支的迷惑性,提高混淆強度。此外,為了使元數(shù)據(jù)更有效與虛假指令配合,元數(shù)據(jù)會經(jīng)過變形,誤導(dǎo)反匯編器的判斷,使得即使發(fā)現(xiàn)此處的指令,也無法確定指令的執(zhí)行邏輯。例如:

      其中,地址空間0x2242到0x2244是在添加了模式切換BX R6指令后,反匯編引擎對二進制數(shù)據(jù)進行的重新解讀所得出的反匯編虛假指令序列。這里,利用了寄存器R1和內(nèi)存地址[SP,#0x1C+var_10]作為元數(shù)據(jù)構(gòu)造虛假指令。盡管動態(tài)執(zhí)行無法執(zhí)行其原本的功能,但是仍然會進行靜態(tài)線性掃描反匯編,因為原本的二進制數(shù)據(jù)并未發(fā)生改變,因此更難看出[0x2242~0x2244]處的指令是虛假指令,使得逆向分析者無法進行正確的靜態(tài)分析。

      3 測試與分析

      本文實驗平臺選取Google Pixel XL硬件和Android 7.1.1操作系統(tǒng)。選用的測試程序來自arm mbedtls密碼庫,分別是MD5和SHA1哈希算法,及DES和AES加密算法程序[16],并參考Collberg提出的對代碼混淆的評價指標(biāo)[17],分別從強度、彈性和開銷三方面進行測試與分析。

      3.1 強度測試

      經(jīng)過本文算法混淆后匯編代碼塊的指令數(shù)量和跳轉(zhuǎn)指令的數(shù)量顯著增加,同時程序的控制流變得更加復(fù)雜。因此,本文以控制流循環(huán)復(fù)雜度作為強度測試指標(biāo),分析混淆前后控制流循環(huán)復(fù)雜度的變化??刂屏餮h(huán)復(fù)雜度記為V(G)[18],計算公式如公式(1)所示:

      其中,e表示控制流圖中邊的數(shù)量,n表示控制流圖中節(jié)點的數(shù)量。

      由于混淆前,程序的控制流僅涉及Thumb模式邏輯,而混淆后的程序控制流包含Thumb模式的原始邏輯和ARM模式的新增混淆兩種執(zhí)行邏輯。為降低分析的復(fù)雜度,首先把混淆前的ST執(zhí)行邏輯看作一個整體,其控制流循環(huán)復(fù)雜度表示為x?;煜?,SA的執(zhí)行邏輯部分的控制流循環(huán)復(fù)雜度為執(zhí)行ARM模式等價指令變換混淆部分的控制流循環(huán)復(fù)雜度,如3.1節(jié)所示,仍然把它看作一個整體,表示為y1。其次,SA的模式切換入口混淆指令變換部分的執(zhí)行代碼邏輯主要由MT和QT構(gòu)成,如3.2節(jié)和3.3節(jié)所示,其控制流循環(huán)復(fù)雜度分別表示為y2和y3。其中,y2為寄存器混淆的控制流循環(huán)復(fù)雜度,y3為虛假指令混淆的控制流循環(huán)復(fù)雜度。最后,通過模式切換指令在整個混淆后的匯編代碼的控制流中新增2條邊,即e=2。綜上,混淆前后程序的控制流循環(huán)復(fù)雜度比為VT/V=(y1+y2+y3+2)/x。根據(jù)ARM原始程序Thumb模式邏輯,在4個測試用例中分別選取MD5的mbedtls_md5_update_ret、SHA1的mbedtls_sha1_update_ret、AES的mbedtls_internal_aes_encrypt、DES的mbedtls_des_crypt_ecb作為測試函數(shù),計算其混淆前后的x和y1,y2,y3值,其測試結(jié)果如表1所示。

      表1 程序混淆前后控制流循環(huán)復(fù)雜度比較Table1 Comparison of cyclomatic complexity between two programs before and after obfuscation

      由表1可知,混淆后ARM應(yīng)用程序控制流循環(huán)復(fù)雜度遠大于混淆前,復(fù)雜度的增加主要是由于本文算法的寄存器混淆和虛假花指令混淆所產(chǎn)生,這部分復(fù)雜度遠大于原始ST的復(fù)雜度,所以會引起較大的增長率,說明本文混淆方法對ARM應(yīng)用程序的混淆強度大大提高。此外,本混淆算法的核心在于對原始ST控制流的破壞,且混淆后的yi,i=1,2,3是一個不確定量,使得像IDA Pro等常見的控制流分析工具難以準(zhǔn)確地分析其控制流循環(huán)復(fù)雜度。所以從這個角度看,它同樣提高了混淆的強度。

      3.2 彈性測試

      彈性的度量用于衡量本文算法能夠抵抗ARM反匯編逆向分析的能力。本文利用IDA Pro自動化分析逆向工具對指令模式切換混淆前后的程序進行比較,分析指令模式切換混淆抗逆向分析的效果。其中,在對MD5哈希算法中的mbedtls_md5_update_ret反匯編后,其混淆前后的局部控制流分別如圖2和圖3所示。

      圖2 mbedtls_md5_update_ret混淆前局部控制流圖Fig.2 Partial control flow graph of mbedtls_md5_update_ret before obfuscation

      圖3 mbedtls_md5_update_ret混淆后局部控制流圖Fig.3 Partial control flow graph of mbedtls_md5_update_ret after obfuscation

      在圖2中,混淆前的mbedtls_md5_update_ret局部控制流圖的基本塊“l(fā)oc_12C8C”原本在結(jié)束位置會通過跳轉(zhuǎn)指令跳轉(zhuǎn)至基本塊“l(fā)oc_12CA2”,該局部控制流圖被正確分析。從圖3混淆后的mbedtls_md5_update_ret局部控制流發(fā)現(xiàn),原本正確的控制流被截斷,基本塊“l(fā)oc_12C8C”被分析成以“BX R4”結(jié)尾,因此在ARM反匯編分析時,不能直觀地從控制流圖中得出其跳轉(zhuǎn)的信息,從而影響了其進一步準(zhǔn)確地分析完整的控制流。

      采用IDA Pro,Objdump和Radare等ARM逆向工具進一步對MD5、SHA1、DES和AES測試用例中的mbedtls_md5_update_ret、mbedtls_sha1_update_ret、mbedtls_internal_aes_encrypt和mbedtls_des_crypt_ecb關(guān)鍵函數(shù)進行逆向工程測試。表2顯示了所有測試用例的測試結(jié)果。

      表2 逆向工程測試結(jié)果Table 2 Test results of reverse engineering

      從表2的測試結(jié)果可以看出,ARM靜態(tài)逆向工程無法分析出被本文模式切換混淆過的關(guān)鍵函數(shù)。這是由于mbedtls_md5_update_ret、mbedtls_sha1_update_ret、mbedtls_internal_aes_encrypt和mbedtls_des_crypt_ecb函數(shù)的ST指令在Thumb模式中被切換混淆,而這些逆向編譯工具都是基于Thumb模式中對這部分指令進行分析的,所以這些工具都不能正確地逆向編譯出被模式切換混淆過的ARM匯編代碼。

      3.3 開銷測試

      下面對混淆前后,程序的開銷進行測試,測試指標(biāo)包含體積開銷和時間開銷。首先,對MD5、SHA1、DES和AES四個測試用例程序進行體積開銷測試,并與OLLVM混淆進行橫向比較。這里定義GRS為程序文件體積的增長率(%),S0為混淆前程序的文件大小,S1為混淆后程序的文件大小。這樣得到計算GRS的公式如公式(2)所示:

      ARM匯編指令為定長指令,為準(zhǔn)確衡量混淆前后程序大小的增加幅度,以匯編指令條數(shù)I量化體積大小,則對測試程序的體積性能開銷的測試數(shù)據(jù)對比,在靜態(tài)和動態(tài)情況下的結(jié)果分別如表3和表4所示。

      表3 靜態(tài)指令程序混淆前后體積開銷比較Table 3 Comparison of size cost between two static instruction programs before and after obfuscation

      從表3可以看出,本文方法混淆的程序靜態(tài)指令增長的絕對值波動較小,集中在40條左右,這主要與選擇的基本塊指令數(shù)量有關(guān),增長率則呈現(xiàn)出原始總質(zhì)量越多,增長率越低的情況。而OLLVM混淆后的程序靜態(tài)指令增長的絕對值波動較大,且其平均增長率為111.76%,是本文方法的14倍。動態(tài)指令是指在正確輸入的情況下,混淆前后在執(zhí)行時被執(zhí)行到的指令,從表4可以看出,本文方法混淆后的程序動態(tài)指令增長的規(guī)律與靜態(tài)指令一致,且比OLLVM混淆后的程序動態(tài)指令增長的絕對值和增長率都更低,因此本文方法的程序體積開銷更小。

      表4 動態(tài)指令程序混淆前后體積開銷比較Table 4 Comparison of size cost between two dynamic instruction programs before and after obfuscation

      時間開銷是衡量軟件保護技術(shù)的另一重要指標(biāo),定義程序運行時間增長率GRT:

      其中,T1表示本文混淆算法處理后程序的運行時間,T0表示程序原始運行時間。分別對16、32、64和128 Byte的隨機數(shù)進行MD5和SHA1哈希運算,以及DES和AES加密運算,其中DES和AES分別采用mbedtls中的測試密鑰。表5顯示了本文方法和OLLVM混淆前后的運算時間(ms)及其增長率(%)比較。

      從表5可以看出,本文方法混淆前后程序運行時間增長率在[1%,21%]之間波動,呈現(xiàn)出與體積增長一致的特征,且原始運行時間越長,增長率就越低,對原始程序的影響就越小。此外,OLLVM混淆前后程序運行時間的增長率在[7%,44%]區(qū)間,不論是增長的大小還是波動范圍都比本文方法大。因此,本文方法的時間開銷對于程序本身運行影響不大。

      表5 程序混淆前后時間開銷比較Table 5 Comparison of time cost between two programs before and after obfuscation

      4 結(jié)束語

      針對ARM反匯編和逆向分析引起的ARM二進制程序破解和盜版、隱私數(shù)據(jù)泄露和知識產(chǎn)權(quán)竊取等安全問題,提出了一種基于模式切換的ARM匯編代碼混淆算法,該算法對底層的匯編指令進行代碼混淆,使反匯編時得到的錯誤匯編指令在之后的逐級逆向分析中,會由于逐步積累而很難獲取有價值的結(jié)果。此外,由于模式切換和變形指令在變換混淆后,不論是在靜態(tài)執(zhí)行文件中,還是在內(nèi)存里動態(tài)調(diào)試中,都呈現(xiàn)不同的控制流,因此給傳統(tǒng)的靜態(tài)和動態(tài)反匯編分析方法帶來了極大挑戰(zhàn)。同時,還對本文提出的代碼混淆算法的強度、彈性和開銷進行了測試評價。實驗測試結(jié)果表明,該方法能有效地提升ARM程序的混淆強度和彈性,并且對于性能開銷的消耗比較少。在下一步工作中,將結(jié)合ARM指令集和Thumb指令集的切換特性,繼續(xù)擴展模式切換指令,進一步提高保護效果。在寄存器混淆中插入不透明謂詞。針對虛假指令混淆,研究隱藏有效數(shù)據(jù)和進行二次分支跳轉(zhuǎn)的條件,使虛假指令被更有效的利用。

      猜你喜歡
      控制流寄存器復(fù)雜度
      抵御控制流分析的Python 程序混淆算法
      工控系統(tǒng)中PLC安全漏洞及控制流完整性研究
      電子科技(2021年2期)2021-01-08 02:25:58
      抵御控制流分析的程序混淆算法
      Lite寄存器模型的設(shè)計與實現(xiàn)
      一種低復(fù)雜度的慣性/GNSS矢量深組合方法
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      求圖上廣探樹的時間復(fù)雜度
      某雷達導(dǎo)51 頭中心控制軟件圈復(fù)雜度分析與改進
      出口技術(shù)復(fù)雜度研究回顧與評述
      基于控制流隱藏的代碼迷惑
      盱眙县| 汝阳县| 望奎县| 德阳市| 马关县| 阜城县| 且末县| 曲麻莱县| 双鸭山市| 玛多县| 兰西县| 望都县| 吴桥县| 讷河市| 砚山县| 长垣县| 定安县| 兴文县| 罗江县| 汝州市| 衡阳市| 固始县| 罗源县| 永新县| 云和县| 阿拉善左旗| 永清县| 沂源县| 台安县| 阜康市| 寿宁县| 顺平县| 古田县| 久治县| 宁晋县| 恩平市| 大兴区| 虞城县| 茶陵县| 阿瓦提县| 米易县|