二進制代碼混淆的國內外研究現狀(共6頁)_第1頁
二進制代碼混淆的國內外研究現狀(共6頁)_第2頁
二進制代碼混淆的國內外研究現狀(共6頁)_第3頁
二進制代碼混淆的國內外研究現狀(共6頁)_第4頁
二進制代碼混淆的國內外研究現狀(共6頁)_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 二進制代碼混淆的國內外研究(ynji)現狀國內外研究(ynji)現狀南開大學(nn ki d xu) 賈春福 路徑模糊一種有效抵抗符號執行的二進制混淆技術提出了一種新的基于路徑模糊的軟件保護方法以抵抗符號執行的逆向分析:利用條件異常代碼替換條件跳轉指令來隱藏程序的路徑分支信息,通過系統的異常處理機制實現程序的跳轉,并使用不透明謂詞技術引入偽造的路徑分支來彌補程序在統計屬性上的差異。電子科技大學 吳適 基于二進制代碼混淆的軟件保護研究提出一種新的 C2D 轉換的混淆算法基于代碼-數據欺騙的混淆算法,該算法的目的是為了在靜態分析工具中隱藏目標基本塊及到目標基本塊的控制流,當反匯編器遇上條件跳轉指

2、令時,跳轉指令中的目標地址和跳轉指令緊接著的地址都會被解釋成指令。 令絕對跳轉指令(jmp,ret)后面的地址為 A,當使用遞歸遍歷算法時,若沒有其他指令跳轉到 A,則 A 不會被解釋成指令;當使用順序掃描算法時,A 地址處存在無法被解釋的指令,則會跳過對 A 的反匯編。利用這兩點規律,將真正的控制轉移隱藏在某條指令的數據部分中,還可以將指令隱藏在代碼段的靜態數據中。西北大學 王懷軍 基于變形的二進制代碼混淆技術研究研究并實現了二進制代碼混淆保護原型系統MEPE,MEPE 系統變形部分主要包含3 方面研究內容: 1) 指令等價變形,主要通過設計指令變形的模板函數,利用模板函數對原始指令進行等價

3、變形。2) 控制流混淆,通過打亂原來指令的物理順序,利用跳轉地址表管理指令執行順序; 3) 循環體中指令變形的控制,首先分析循環結構對時間開銷的影響,然后提出控制循環體中指令變形和控制流混淆的方法。南開大學 王志 二進制代碼路徑混淆技術研究提出了一種全新的線性代碼混淆策略,該策略將未解數學猜想引入到軟件的路徑信息中,將基于符號執行和約束求解技術的逆向工程難度等價到證明未解數學猜想的難度。在代碼混淆中只使用線性操作,不使用加密函數。多項式等價變換、收斂值變換、固定循環次數變換和相似控制流變換是基于未解數學猜想的路徑混淆所特有的變換方式,多態和變形技術是常用的代碼變換技術,由于基于未解數學猜想的路

4、徑混淆有很好的可擴展性,這些代碼變換技術可以直接應用到混淆后代碼中。Collberg A Taxonomy of Obfuscation Transformations.Department of Computer Science第一次針對 JAVA 程序提出了代碼混淆。Collberg 在其技術報告中提出了混淆轉換的定義、混淆算法的詳細分類及其有效性評估方法(fngf),該報告中根據其分類描述了混淆轉換的一般性算法,這些算法能夠應用于大部分流行的高級程序語言的代碼混淆。根據 Collberg 的分類,混淆轉換可以分為詞法結構混淆又稱布局混淆、控制流混淆、數據混淆以及針對特定反混淆器的預防性混

5、淆。Cohen Operating System Protection through Program Evolution論述了將代碼混淆作為一種技術用于增加軟件代碼的多樣性,其使用了重排指令順序,增加或者刪除跳轉指令和反內聯函數等方法,在不改變代碼語義的情況下對軟件的指令或指令序列進行替換,利用軟件代碼的多樣性增加攻擊者對軟件進行逆向(n xin)分析和篡改的難度。C WangA security architecture for survivability mechanisms:dissertation針對靜態逆向反編譯技術提出了基于控制流退化(degeneration of contro

6、l flow)的高級語言代碼混淆策略,通過間接跳轉對控制流重新(chngxn)整合,并在數據流中引入指針別名操作,有效地提高了軟件代碼的復雜度,并降低了靜態逆向反編譯的精度。Linn C Obfuscation of executable code to improve resistance to staticDisassembly等人針對靜態反匯編技術提出了一種二進制代碼混淆方案。反匯編技術是將二進制機器代碼轉換成匯編指令,是逆向分析和推理的基礎,常用的反匯編算法有線性掃描算法(linear sweep algorithm)和遞歸遍歷算法(recursivetraversal algorit

7、hm)。針對線性掃描算法難以區分代碼和數據的問題,Linn 等人提出了分支反轉(branch flipping)技術,在條件跳轉指令之后加入垃圾數據以阻止線性掃描算法的分析。針對遞歸遍歷算法以控制流為基礎進行反匯編的特點,Linn 等人提出了分支函數(branch functions)技術,將控制流中顯而易見的直接跳轉指令和函數調用指令隱藏在分支函數中,并引入不透明謂詞(opaquepredicates)和跳轉表欺騙(jump table spoofing)技術誤導反匯編的遞歸遍歷算法。Wang 和 Linn 等人的混淆策略都利用了靜態逆向分析難以處理指針別名的問題,將控制流的靜態逆向分析由線

8、性復雜度變成 NP 完全問題。 KanzakiExploiting Self-Modification Mechanism for Program Protection利用二進制代碼自修改機制(self-modifying mechanism)對軟件中的重要代碼進行偽裝。首先,用不可執行的垃圾指令對軟件原始的二進制指令進行偽裝;然后,在軟件執行中利用二進制代碼的自修改機制動態地生成原始指令并替換偽裝代碼;最后,將已經執行過的原始指令再次使用垃圾指令進行覆蓋。Birrer 利用程序碎片技術和跳轉表使混淆后的軟件二進制代碼具有變形能力。Kanzaki 和 Birrer 等人提出的兩種代碼混淆策略隱

9、藏了軟件代碼或控制流,使其在執行過程中才動態的展現出來,其混淆的對象是靜態反匯編和反編譯技術。多樣性是生物系統健壯的重要保證。當前軟件系統大部分是同構系統,缺乏多樣性。Forrest Building Diverse Computer Systems. Proceedings of the6th Workshop on Hot Topics in Operating Systems提出了利用混淆堆棧數據的方式增加軟件代碼的多樣性,在保持軟件的用戶(yngh)體驗、功能性和效率的基礎上,提高了軟件的抗攻擊能力。Bhatkar Address Obfuscation: an Efcient App

10、roach to Combat aBroad Range of Memory Error Exploits提出了地址混淆的策略,在 Forrest 等人的工作基礎上對軟件中的代碼(di m)和數據地址進行混淆變換,進一步提升了軟件代碼的健壯性。2007 年,Popov Binary obfuscation using signals. Proceedings of theUSENIX Security Symposium提出了一種基于Linux信號機制的二進制代碼混淆技術:使用各種產生異常信號的代碼替換程序中的 jmp、ret 和 call 等跳轉指令來混淆程序的執行過程。二進制代碼中讀寫內存

11、、算術運算和調用系統函數等操作,都有可能產生系統異常信號,因此,靜態逆向分析工具很難準確判定在執行過程中二進制代碼是否會產生異常信號。但是,該技術無法對二進制代碼的路徑分支進行混淆,因此,它不能緩解軟件執行過程中的信息(xnx)泄露問題。2008 年,Sharif Impeding malware analysis using conditional codeObfuscation等人提出了一種基于哈希函數代碼混淆策略,用哈希值替換路徑分支條件中的常量,利用哈希函數的單向性增加逆向工程的難度,但是,哈希函數不具有保序性,即無法保證當 x y 時,Hash(x) Hash(y)成立。因此,該混淆

12、策略具有局限性,只能保護等于關系的路徑分支條件。2011 年,Falcarin Exploiting Code Mobility for Dynamic BinaryObfuscation等人將軟件核心代碼放到網絡上的一個可信實體中,該實體在攻擊者的控制之外,利用代碼的流動性使軟件在執行過程中動態獲得這些代碼,減少攻擊者對軟件整個二進制代碼的能見度,從而限制攻擊者的知識并阻止其逆向工程。2011 年,Ceccato Remote Software Protection Using Orthogonal Replacement 等人提出了基于正交替換(orthogonal replacement

13、)的客戶端混淆策略,通過設置客戶端代碼的有效期,軟件客戶端在運行過程中與遠程可信服務器進行頻繁的代碼替換,使軟件代碼不斷的更新,增加攻擊者進行逆向工程的難度。Falcarin 和 Ceccato 提出的混淆策略都是基于網絡交互的,在不可信主機上運行的軟件代碼都是不完整的,軟件的執行過程需要由遠程可信服務器決定,而且每次執行的代碼都是定制的,這樣迫使攻擊者不斷面對軟件的變化,增加逆向工程的復雜度。而且,本地代碼的不完整性也干擾了攻擊者對軟件行為的靜態預測能力。但是,由于網絡帶寬和延遲的限制,應用程序與可信的遠程服務器的頻繁交互過程將致使軟件的運行效率遠遠低于本地執行,因此大部分軟件還是以二進制本

14、地代碼形式發布,服務器端運行保護(protection byserver-side execution)并非對所有應用程序都適用。二代碼(di m)混淆技術的分類Collberg 等人根據各種代碼混淆技術變換對象的不同將混淆分為四類(s li):布局混淆、數據混淆、控制混淆和預防混淆。布局(bj)混淆布局混淆(layout obfuscation)是指刪除或者混淆軟件源代碼或者中間代碼中與執行無關的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。軟件源代碼中的注釋文本、調試信息可以直接刪除,用不到的方法和類等代碼或數據結構也可以刪除,這樣即可以使攻擊者難以理解代碼的語義,也可以減小軟件體積,提高

15、軟件裝載和執行的效率。軟件代碼中的常量名、變量名、類名和方法名等標識符的命名規則和字面意義有利于攻擊者對代碼的理解,布局混淆通過混淆這些標識符增加攻擊者對軟件代碼理解的難度。標識符混淆的方法有多種,例如哈希函數命名、標識符交換和重載歸納等。哈希函數命名是簡單地將原來標識符的字符串替換成該字符串的哈希值,這樣標識符的字符串就與軟件代碼不相關了;標識符交換是指先收集軟件代碼中所有的標識符字符串,然后再隨機地分配給不同的標識符,該方法不易被攻擊者察覺;重載歸納是指利用高級編程語言命名規則中的一些特點,例如在不同的命名空間中變量名可以相同,使軟件中不同的標識符盡量使用相同的字符串,增加攻擊者對軟件源代

16、碼的理解難度。布局混淆是最簡單的混淆方法,它不改變軟件的代碼和執行過程。由于攻擊者通常無法直接獲取軟件的源代碼,因而布局混淆的保護能力較弱。布局混淆常用于 Java 字節碼和.Net 中間代碼 MSIL 的混淆,例如 Crema、SourceGuard、yGuard和 Jaurora等。數據混淆數據混淆是指在不影響軟件功能的前提下,變換軟件代碼中的數據或數據格式,增加軟件代碼的復雜度。根據混淆方式不同,數據混淆可以分為存儲和編碼變換、聚集變換和次序變換等。存儲和編碼變換通過混淆軟件代碼中變量的存儲方式和編碼方式來消除變量的含義,使它們的操作和用途變得晦澀難懂。主要的混淆方法包括以下幾種:(1)

17、分割變量,把一個二進制變量v拆分成兩個二進制變量p和q,然后通過函數建立 p、q 與 v 之間的映射關系,并建立基于新的變量編碼結構的運算規則。(2)將簡單的標量變成復雜的對象結構,例如,在 Java 語言中可以將整型變量變成與整型相關的對象結構。(3)改變變量的生命周期,例如,將一個局部變量變成一個全局變量。(4)將靜態數據用函數表示,例如,軟件代碼中的字符串常量用一個函數來動態構造等。(5)修改編碼方式,例如,用更復雜的等價的多項式替換數組變量原始的下標表達式等。聚集變換是指通過將多個數據聚集在一起形成新的數據結構,實現隱藏原始數據格式的目的。聚集變換常用于混淆面向對象的高級語言,聚集方式

18、有數組聚集和對象聚集兩種,聚集方法有以下幾種:(1)合并標量變量,將多個變量 V1,Vn合并成一個變量 Vm,例如將兩個32 位的整數變量 x 和 y 合并成一個 64 位的整數變量 z,其合并函數是 z = 2 32x +y。(2)重新構造數組來混淆(hnxio)數組運算,重構數組的方法有很多種,例如,將一個數組分割成兩個小的數組,將多個數組合并成一個大數組,將一維數組“折疊(zhdi)”成多維數組,將多維數組“壓平(y pn)”成一維數組等。(3)修改類的繼承關系也可以增加代碼的復雜度,可以把兩個無關的類進行聚集,生成一個新的無意義的父類,也可以把一個類拆分成兩個類,其關鍵是要增加軟件代碼

19、中類的繼承深度,因為軟件的復雜度與類的繼承深度成正比。3.控制流混淆控制混淆的目的是增加軟件中控制流的復雜度,其不修改代碼中的計算部分,只是對控制結構進行修改,根據對控制流的修改方式不同可以將控制流混淆分為聚集變換、次序變換和計算變換等類型。聚集變換是指通過破壞代碼間的邏輯關系實現控制流混淆,其基本思想是把邏輯上相關的代碼拆分開,把它們分散到程序的不同地方,或者把不相關的代碼聚集到一起,例如,聚集到一個函數中,其主要混淆方法有以下幾種:(1)內嵌函數的方法,用函數體內部的代碼去替換程序中該函數的調用語句,這樣就可以減少一個函數的定義,其內部代碼整體的語義也就變的不如之前清晰了。外提函數的方法,

20、該方法與內嵌函數正好相反,它把沒有任何關系的代碼合在一起創造一個新的函數,該函數沒有任何實際意義,但是,在程序執行過程中卻被多次調用,從而使攻擊者產生誤解,使他認為該函數很有意義。(3)克隆函數的方法,將一個函數克隆成多個函數,新生成函數的功能是一致的,但是名稱和實現的細節有些不同,可以調用其中的任何一個函數來替換原來的函數,這樣可以有效增加攻擊者逆向分析的工作量。(4)循環變換是指通過對循環退出條件的等價變換使循環的結構體變得復雜,例如循環的模塊化、循環展開和循環分裂等。(5)交叉合并方法的基本思想是把不同功能的函數合并成一個函數,隨著函數功能的不斷增加,其代碼整體的意義就變得越來越模糊不清

21、了,由此增加了攻擊者的理解難度。其實現方式比較簡單,可以通過增加一個標識參數來區分不同的功能。通常語義相關的代碼在源代碼中的物理位置也相近,例如功能相似或有依賴關系的函數會連續的放在同一個文件中或同一段代碼中,這樣有利于代碼的閱讀和理解。次序變換的目的是將語義相關的代碼分散到不同的位置,盡量增加代碼的上下文無關性,實現方法包括對文件中的函數重新排序,循環體或函數體內部的語句塊重新排序,以及語句塊內部的語句重新排序等。計算混淆是指引入混淆計算代碼來隱藏真實的控制流,該方法的應用效果和保護強度都很好,其實現方法包括引入不透明謂詞、插入垃圾代碼、擴展循環條件、代碼并行化和跳轉表等。另一種重要的控制流

22、混淆技術就是不透明謂詞技術(opaquepredicate)。Collberg 等人首先對不透明謂詞技術在代碼混淆中的應用做了比較完整的描述。如果在程序中的某一點,一個謂詞的輸出對于混淆者是可知的(基于先驗知識),而對于其他人卻是難以獲知的,則稱該謂詞為不透明謂詞。不透明謂詞技術所引入的路徑分支并不影響代碼的實際執行順序,新插入的路徑分支條件恒為真,或者恒為假,因此,這些路徑分支不改變軟件代碼的語義,只是使代碼的控制流變得復雜且難以分析。插入垃圾代碼是指利用不透明謂詞技術,在其不可達分支上插入垃圾代碼,增加代碼靜態分析的復雜度。因為,在程序執行過程中,這些垃圾代碼永遠不會被執行到的,因此,垃圾代碼與軟件的語義無關,并不影響軟件的執行結果。擴展循環條件的基本思想是在循環的退出條件中,加入恒為真或者恒為假的不透明謂詞PT和PF,使循環結構變得更為復雜和難以分析。實際上,這些不透明謂詞并不影響循環的實際執行次數,因此,也不會改變程序的語義。將可歸約控制流圖轉化為不可歸約控制流圖是指利用高級語言與低級語言表達能力上的差異,引入一些高級語言沒有對應表達方式的控制流結構來增加攻擊者

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論