?

基于符號執行和N-scope復雜度的代碼混淆度量方法

2022-02-04 06:23肖玉強郭云飛王亞文
網絡與信息安全學報 2022年6期
關鍵詞:嵌套度量復雜度

肖玉強,郭云飛,王亞文

基于符號執行和-scope復雜度的代碼混淆度量方法

肖玉強,郭云飛,王亞文

(信息工程大學,河南 鄭州 450001)

代碼混淆可有效對抗逆向工程等各類MATE攻擊威脅,作為攻擊緩和性質的內生安全技術發展較為成熟,對代碼混淆效果的合理度量具有重要價值。代碼混淆度量研究相對較少,針對代碼混淆彈性的度量方法與泛化性、實用性度量方法相對缺乏。符號執行技術廣泛應用于反混淆攻擊,其生成遍歷程序完整路徑輸入測試集的難度可為混淆彈性度量提供參考,然而基于程序嵌套結構的對抗技術可顯著降低符號執行效率,增加其混淆彈性參考誤差。針對上述問題,提出結合符號執行技術和-scope復雜度的代碼混淆度量方法,該方法首先基于程序符號執行時間定義程序混淆彈性;其次提出適配符號執行的-scope復雜度,定義程序混淆強度同時增強符號執行對多層嵌套結構程序的混淆彈性度量魯棒性;進而提出結合動態分析與靜態分析的混淆效果關聯性分析,通過對程序進行符號執行與控制流圖提取量化混淆效果。面向C程序構建了該度量方法的一種實現框架并驗證,實驗對3個公開程序集及其混淆后程序集約4000個程序進行混淆效果度量,度量結果表明,提出的度量方法在較好地刻畫混淆效果的同時擁有一定的泛化能力與實用價值;模擬真實混淆應用場景給出了該度量方法的使用樣例,為混淆技術使用人員提供有效的混淆技術度量與技術配置參考。

代碼混淆;混淆度量;符號執行;-scope

0 引言

代碼混淆是以對抗軟件面臨的逆向工程和篡改攻擊等威脅為目的,對程序進行等價語義轉換的安全技術。近年來,軟件技術的發展與軟件市場需求的擴大帶來了巨大的經濟效益,攻擊者和安全人員隨之進行相應的安全博弈和技術更新,代碼混淆技術作為軟件安全技術受到了關注。具體來說,以軟件篡改和逆向攻擊為代表的MATE(man-at-the-end)[1]攻擊建立在軟件和主機的使用權限之上,其多樣性的攻擊形式難以被預測,使傳統的防御形式難以招架,而代碼混淆作為內生安全技術,在不改變軟件功能的情況下更改軟件的內容與結構,以增加MATE攻擊的難度和成本,受到安全攻守兩方的重視并廣泛應用。

代碼混淆技術發展了近30年,研究人員開發了包括控制流混淆[2]、關聯混淆[4]、數據混淆[5]、布局混淆[7]等方法在內的眾多混淆技術,以Tigress、LLVM-obfuscator、VMProtect等為代表的各類混淆集成工具,為具有軟件安全需求的用戶提供了多樣化選擇。值得注意的是,代碼混淆本質上并非絕對安全,而是混淆者與反混淆者基于資源的技術博弈,研究表明擁有充足資源的攻擊者在足夠長時間內可以攻破絕大多數混淆[8]。盡管代碼混淆的各類技術趨于成熟,除對混淆技術進行邏輯說明[9]外,目前對混淆效果的相關度量方法與研究仍相對較少,缺乏實用性混淆度量方法,使混淆使用者無法較準確地評價混淆效果[10],造成為求安全“貪得無厭式”疊加大量混淆方法或為保效率“投鼠忌器式”少加或不加混淆的窘境[11]。從目的而言,不論逆向工程、篡改攻擊或復制攻擊,都需要對程序完整或部分邏輯進行分析,即對程序“理解”。最早由Collberg等[12]定義的3個經典度量指標中:Potency強度指基于人類理解能力的程序混淆復雜度,Resilience彈性指基于機器反混淆技術的混淆抵抗力,Cost開銷指混淆帶來的額外資源開銷?,F有的混淆效果度量研究主要針對混淆強度, 而針對混淆彈性的度量相對較少,各種度量研究大致可分為以下4類。

1) 其他度量指標的遷移:研究人員?;诮浀滠浖攘恐笜伺c混淆強度的概念相似或出于經驗使用信息論度量指標定義混淆強度指標。如Anckaert等[13]提出了一種遷移一系列軟件復雜度指標,建立評估二進制程序指令、控制流、數據流和數據在內的復合度量方法,通過每個對象的對應指標綜合評價混淆強度;Kirk等[14]提出基于信息論的混淆度量方式,將Kolmogorov復雜度遷移應用到二進制文件上進行混淆效果計算;Mohsen等[15]則進一步用約束的Kolmogorov復雜度確定代碼混淆的規律性并給出代碼混淆的相應規范化定義,進而度量無自動化工具影響下的混淆強度。

2) 基于控制流圖的度量:控制流混淆在一些度量指標中取得較高的混淆強度、彈性得分[16],而基于控制流圖的度量方法可以較準確地描繪程序邏輯,表現出與程序語義的強相關性。Tsai等[18]將控制流混淆分解為一系列原子操作符并對眾多控制流混淆算法進行形式化,提出了基于控制流圖的距離度量方案MGE并結合基于嵌套級別的混淆強度度量-Scope作為混淆效果的度量方案;Gao等[19]提出一種結合符號執行與定理證明器的圖同構技術對程序控制流進行分析,從而對比二進制文件的語義差異;Luo等[20]通過構建符號執行與定理證明器檢測二進制基本塊的等價語義,以等價基本塊為基本元素計算混淆程序與原程序線性獨立路徑的最長公共子序列,并將其比例作為路徑得分,從而計算函數與程序的相似性。

3) 基于抽象語義的度量:Pucella等[21]通過對混淆防御能力及其面臨攻擊進行精確定義,給出以多樣性為防御前提的攻擊性質描述,通過類比展示了類型系統與混淆器的良好近似能力;Dalla等[22]推導了一個基于抽象解釋的格點隱藏性質進行混淆效能度量的理論模型,通過抽象指標比較攻擊者,從而進一步通過對比抽象解釋的隱藏屬性對代碼混淆的強度進行測量,同時對代碼混淆度量模型進行了一般性推廣,即任意程序轉換都可能作為潛在的代碼混淆器使用。

4) 基于具體攻擊的度量:Viticchi′e等[23]對代碼混淆應用的真實攻擊進行對比實驗,通過比較攻擊混淆和原程序時間、攻擊成功效率對代碼混淆彈性進行度量;Ceccato等[24]模擬真實逆向場景,實驗中被測試人員理解經過混淆后被反編譯與未經過混淆反編譯的兩種Java代碼,反映出代碼混淆對抗逆向的有效程度以及緩解基于系統特性攻擊的價值;Banescu等[25]通過對比混淆前后符號執行遍歷程序所有路徑執行時間,來模擬自動化攻擊與動態分析場景,描述混淆程序對抗符號執行攻擊的代碼混淆彈性;Majumdar等[26]對防御切片技術的切片混淆方法提出了5個度量指標并證明切片混淆的有效性。

各種度量方式有其優點和缺點,如其他度量指標的遷移展現出與混淆強度有較強的相關性,然而對混淆彈性的刻畫則可能存在較大偏差;基于控制流圖的度量通過結合基本塊符號執行可以較好地刻畫程序間靜態相似性,然而該方法實際操作過程中需要遍歷程序不同路徑對基本塊一一比較,方法消耗的資源巨大,因此實際場景中不適合直接用作混淆度量,基于抽象語義的度量可將復雜混淆轉換通過語義近似及抽象屬性進行描述,但該方法在使用時需根據實際情況進行語義精確匹配,尚不能實際應用該類方法;基于具體攻擊的度量對真實攻擊場景進行了良好的復現,然而人力的攻擊度量無法大規模應用且度量結果較依賴于攻擊人員的水平。

本文提出一種基于符號執行-scope復雜度的代碼混淆度量方法,結合對程序的動態執行與靜態基本塊級控制流分析,通過計算程序-scope復雜度度量混淆強度與符號執行評估混淆強度彈性,將這二者相互補充,能夠較好地描述混淆效果,實現真實場景下考慮自動化分析的混淆效果度量方法。本文度量方法對總數超過4 000個混淆程序的程序集進行了充分評估,表明該度量方法能較好刻畫混淆效果的同時擁有一定的泛化能力與實用價值。

1 度量方法的提出

1.1 基于符號執行的混淆彈性度量

符號執行技術是通過符號值代替真實值作為程序輸入執行程序的技術,當執行到分支語句,則添加約束分別執行分支路徑,盡可能遍歷所有路徑之后利用約束求解器及可達性推理求解程序各路徑輸入與路徑信息,達到進一步分析程序與獲取程序執行結果的目的。

在分析大規?;煜绦驎r,對分析工具的時間成本與泛化分析能力有一定要求,通過符號執行技術可以較高效地尋找系統漏洞[27],其動態分析的特性提供了優秀的泛化分析能力并使一部分代碼混淆技術無效化,因而符號執行被廣泛應用于程序測試分析、二進制分析及漏洞挖掘等安全相關領域,尤其對MATE攻擊者而言,代碼混淆作為其面對的主要防御手段之一,有重要的實用價值。例如,一些先進的自動化攻擊經常針對如控制流混淆和代碼虛擬化等代碼混淆防御手段實現對抗措施,這些自動化攻擊依賴于以程序有效輸入為先決條件的動態分析,因此符號執行通過生成測試集遍歷完整代碼路徑的能力是這些分析技術的前提,其執行程序并生成完整測試集的難度可以作為混淆彈性指標。

符號執行技術的目的在于完整的測試集生成,而路徑爆炸是其面臨的主要限制之一。具體來說,由于現實場景中軟件路徑數量龐大,執行單個路徑的開銷,導致有限時間內符號執行引擎僅能執行有限的路徑,從而降低符號執行引擎的測試集生成效率;另外,研究人員為對抗符號執行面向路徑爆炸特點的混淆算法,如Wang等[28]基于數學難題提出一種將符號值與循環邊界關聯的程序混淆方法,致使分析程序時符號執行引擎路徑爆炸,Banescu等[25]提出基于軟件多樣化方法的輸入相關等價分支構建混淆技術,有效降低符號執行效率?;谝陨涎芯?,對抗符號執行的混淆技術與程序中的循環結構存在較強的依賴或相關性,混淆技術研究者常借助該結構增加符號執行預測分支的數量和執行次數而達到降低符號執行效率的目的。

1.2 N-scope復雜度

-scope最早由Harrison和Megal[29]提出以程序的嵌套程度來計算連續程序的控制流圖復雜度,而嵌套程度與控制流圖的大小可以較恰當描述程序控制流混淆方法造成的控制流圖變化。具體來說,嵌套復雜度可以計算程序的不同層次中的循環數量和大小,在實際應用中研究人員給出了不同的定義方式[30]:采用以循環層數加權的循環計算方法作為嵌套值,將程序混淆前后嵌套差值與原程序嵌套值的比例作為嵌套復雜度的得分。

這種計算方式未考慮控制流平坦化等方法降低程序嵌套度的控制流混淆方法,在得分為負值時以零計算;文獻[18]將一個基本塊的scope復雜度則定義為:

1.3 代碼混淆效果度量方法

本文提出基于兩種關聯性指標的代碼混淆度量方法,在綜合符號執行混淆彈性度量和控制復雜度度量優勢的基礎上,針對性地提出改進的基于程序多層嵌套結構的-scope復雜度,完善了現有符號執行分析在代碼混淆彈性度量上的不足,同時給出符號執行作為彈性度量指標基于相對執行時間的規范性定義。

通過對兩種指標的關聯性分析,不僅能夠清晰刻畫程序混淆前后的混淆彈性變化與控制流復雜度變化趨勢,還可以解決單獨使用符號執行彈性度量對多層嵌套程序的度量限制問題,提高了對此類程序的度量準確性與度量效率。諸如-scope復雜度的程序控制流復雜度度量方法僅能對程序的靜態控制流進行評價分析,而符號執行作為動態程序分析技術可以為整體混淆度量提供更全面的關聯性分析參考,平衡此類靜態分析指標對控制流混淆技術的高敏感特征。

相對現有的單一代碼混淆度量方法存在的缺點和限制,組合具有關聯性指標的度量方法的評估更全面,如文獻[18]將-scope與混淆程序距離相結合,混淆距離計算提高了度量方法對程序執行路徑的變化敏感度,改善了-scope復雜度對某些混淆方法不敏感的特點。需要說明的是,研究人員多遵循Collberg等[12]定義代碼混淆的指標方法,即從混淆強度、混淆彈性、混淆開銷3個方面進行混淆效果度量框架設計,然而在實際場景中,攻擊者常將自動化代碼分析工具和人工逆向分析結合,現有的代碼混淆度量方法研究則缺少對此場景的適配度量方法,從實用的角度出發,混淆度量方法應對特定混淆有較好的適配性和敏感性,同時將度量開銷限制在合理范圍內。

復雜混淆程序在符號執行過程可能出現路徑爆炸等問題,導致符號執行時間過長或超時,使得到的程序混淆彈性失去參考意義,因而設置最大符號執行時間t為時間約束,得到約束的程序混淆彈性為

本文考慮符號執行在執行程序嵌套邏輯的路徑與循環體的多層嵌套結構,首先定義式(1)中基于控制流圖的程序嵌套值中嵌套層數為

算法1 DFS

輸入 控制流圖,當前節點v,初始節點0,當前循環path,所有循環路徑looplist

算法C_Nesting()計算了程序控制流圖中以基本塊為節點的程序嵌套值Cnesting,該問題可抽象為求解有向圖中所有環和計算環的嵌套度兩個子問題。本文首先對程序節點按照名稱排序并設置所有節點為未訪問狀態(算法2第3~5行),按此排序遍歷圖中節點,將自環加入循環路徑后(算法2第8~9行),以當前節點為根節點對圖進行深度優先搜索,在遍歷時只將排序大于根節點的鄰接點加入path中(算法1第1行),保證了DFS主循環只搜索最小節點為根節點的環,同時訪問狀態的約束與設置,保證了環內部不相交(算法1第2、7、11行),在求解得到所有環后對環列表遍歷計算每個環的被嵌套數,按此嵌套數對環長度加權求和得到程序的嵌套度。

算法2 C_Nesting

輸入 控制流圖

輸出 嵌套值Cnesting

本文提出的度量方法從混淆彈性和混淆強度兩個方面出發,結合動態分析與靜態分析對代碼混淆效果綜合度量,一方面結合符號執行在真實逆向等攻擊場景的常用性與代碼混淆中程序控制流的關鍵性,使本度量方法具有真實場景下的應用價值,另一方面針對單一度量方法的局限性,本度量方法使用符號執行技術反映程序路徑執行難度,提出適配符號執行的-scope復雜度算法,在準確表達程序嵌套度的同時,針對符號執行對抗技術依賴程序循環結構的特點,提高符號執行度量的魯棒性。

2 實驗與討論

2.1 度量方法實現

本文使用程序混淆工具Tigress學術版本對實驗程序進行混淆,采用LLVM9版本的KLEE符號執行引擎及與其適配的SMT約束求解器、klee-uclibc等作為本文實驗的符號執行環境,使用Jakstab開源二進制反編譯工具與python庫pydot作為混淆文件的-Scope計算接口,度量方法實現流程如圖1所示。本文使用的實驗環境為64位Ubuntu18.04操作系統,4核頻率為3.20 GHz的Intel Core i7-8700 CPU及4 GB物理內存,Window7操作系統,12核頻率為3.20 GHz的Intel Core i7-8700 CPU及16.0 GB物理內存。

Tigress為C語言的源碼混淆工具,具備防御靜態與動態逆向、反虛擬化攻擊等混淆功能,本文實驗主要使用程序控制流混淆相關功能,使在混淆后的靜態控制流或動態執行路徑產生變化,增加分析程序真實控制流的難度;KLEE是基于LLVM編譯框架開發的動態符號執行引擎,對LLVMbitcode進行操作,使用uclibc庫支持對常規C文件的符號執行,本實驗的符號執行時間通過其內置工具klee-stats獲得,實驗中KLEE的-sym-arg參數統一設置為3;Jaskstab是一個基于抽象解釋的反匯編和靜態分析集成框架,采用自定義指令譯碼,可應用于多種操作系統,基于x86處理器處理32位的WindowsPE或linuxELF可執行文件,基于此特性,本文使用Windows系統下MingW64支持的GCC將C語言源文件編譯為32位PE文件并交由Linux下Jakstab處理(如圖1所示)。Jakstab動態地將機器碼轉換為低級中間語言,同時對增加的控制流進行數據分析得到數據流信息,進而定位預測分支目標與代碼位置,本文實驗使用該工具分析32位可執行文件得到其.dot格式的控制流圖文件,進而使用python的pydot模塊對其進一步處理。

圖1 度量方法實現流程

Figure 1 Flow chart of measurement method implementation

本文使用該度量方法對兩個公開程序集及其對應的混淆程序集共約4 000個程序進行了度量,程序集1中程序為各種if分支和循環結構的簡單組合,程序集2為常見的基本算法,程序集3為使用Tigress混淆工具自動生成的程序集。由于混淆程序代碼量可能為原程序的幾倍至幾十倍,受限于實驗環境,程序集1、程序集2的原程序在100行以內,程序集3的原程序介于100行與200行之間,在防止程序集混淆版本程序過大導致本文實驗環境中符號執行引擎運行超時的前提下,保證了程序樣本的多樣性。

2.2 實驗結果分析

實驗1 不同結構原程序符號執行

使用程序集1具有不同結構的未混淆程序進行符號執行,實驗樣本結構主要由if和loop兩種結構進行疊加或嵌套組成(不同結構的程序樣本如圖2所示),同時為了保證符號執行的時間差異性,約30%的程序樣本與輸入無關,而按比例將約70%程序輸入與循環判斷條件及if分支判斷條件結合,增加符號執行時間。

圖2 不同結構的程序樣本

Figure 2 Program samples with different structures

如表1所示,不同結構程序符號執行時間展現出明顯差異,在無嵌套狀態下loop結構程序的平均符號執行時間約為if結構程序的2~5倍,而在有嵌套的狀態下if嵌套,loop中嵌套if與loop嵌套loop展現出數量級的遞增差異,表明loop結構及loop嵌套結構具有增加符號執行時間的顯著優勢。

當兩種結構的分支判斷語句與程序輸入相關聯時,if結構程序的符號執行時間變化可忽略,而執行loop結構程序的時間則有較大增加,表明與輸入相關聯的loop結構相比單一loop結構具有更強的抗符號執行能力。需要注意的是,在loop嵌套層數增加時,不同的loop結構執行時間將展現出更強的差異性,使標準差顯著增大。

表1 不同結構程序符號執行時間

實驗2 程序集1混淆與效果度量

為驗證本文混淆效果度量方法并探究不同混淆技術在本度量方法下的表現,本文使用tigress混淆工具對程序集1進行混淆,由于本文度量算法側重于對程序的符號執行難度與控制流進行評估,同時為了保證混淆程序與klee引擎的兼容性,選取5種Tigress混淆技術(如表2所示)并對其進行排列組合共24種混淆方案,由于tigress混淆需指定函數名的特點,函數拆分僅單獨使用或作為后置技術與其他技術組合使用。

表2 Tigress混淆技術介紹

實驗中對程序集1進行混淆得到約1 000個混淆程序,將這些程序按照使用的混淆方法分類,ubuntu實驗環境下使用klee進行符號執行,執行共計約30 h,設置最大執行時間為10 min,使用klee內置工具klee-stats統計符號執行時間并根據原程序執行時間對每種混淆方法下混淆程序集進行混淆彈性統計,程序集1各混淆彈性統計如圖3所示;將混淆程序置于Windows環境下編譯為32位PE可執行文件,在ubuntu下使用Jakstab得到控制流(.dot)文件,計算其-scope復雜度,各混淆方法程序集1-scope復雜度如圖4所示。為進一步分析不同混淆方法對混淆彈性與混淆強度關聯性的影響,按序將同種混淆方法的彈性與-scope復雜度進行逐一對比,如圖5所示。

圖3 程序集1混淆彈性統計

Figure 3 Obfuscation resilience statistics of assembly 1

圖4 程序集1 N-scope復雜度統計

Figure 4-scope complexity statistics of assembly 1

由于程序集與混淆技術使程序樣本中嵌套結構較多,為得到更清晰的-scope復雜度分布,調整參數將其設置為0.2,避免嵌套結構過多造成-scope復雜度差異性過小。由于使用的混淆技術特性,原程序的-scope復雜度與混淆程序最小-scope復雜度可視作相同。

圖5 程序集1混淆彈性與混淆強度關聯性

Figure 5 Assembly 1 obfuscation resilience and potency correlation

分析實驗結果如下。

1) 兩次代碼虛擬化的混淆彈性最高且遠高于其他混淆組合,其-scope得分亦最高,代碼虛擬化后函數內代碼以字節碼的形式由函數中解釋器執行,相當于程序內部代碼與解釋器構成了多層嵌套循環結構,而兩次虛擬化則使得循環執行路徑指數化增加,導致符號執行引擎時間的爆炸式增加。值得注意的是,雖然代碼虛擬化相關混淆-scope復雜度明顯高于其他混淆,然而其對混淆彈性的增益可能低于其他混淆(如AddO16-EncA),表明增加符號執行的路徑求解難度與增加程序嵌套度都可能對混淆彈性產生較大增益。

2) 應用單次混淆時,數學運算加密對混淆彈性的增益較為明顯,然而其對程序控制流影響較小,因而對-scope復雜度增益可忽略,而模糊謂詞技術雖然絕對意義上增加了程序分支數量,相比于其他控制流混淆技術對-scope的增益卻較為有限。

3) 應用混淆組合時,混淆組合的不同順序可能對混淆彈性和混淆強度產生不同影響。如Flat-AddO16與AddO16-Flat相比混淆彈性與-Scope復雜度均較低,而Virt-AddO16和AddO16- Virt則與單混淆技術具有相似的混淆效果。造成上述差異的原因可能是本程序集在程序分支數量提升時控制流平坦化,使增加代碼嵌套的能力更強,而代碼虛擬化解釋執行則對該變化不敏感。

4) 使用函數拆分作為后置混淆技術時,程序-Scope復雜度增加明顯,而程序混淆彈性則變化不一致。如與代碼虛擬化組合的混淆程序彈性有所提升,而控制流平坦化的混淆彈性則下降,說明函數拆分可能降低了控制流平坦混淆程序的路徑求解難度。

5) 隨著程序混淆彈性增加,混淆彈性的標準差呈現上升趨勢,表明具有多樣性結構的程序樣本在混淆彈性增加時其彈性差異隨之變大,即混淆方法提升的彈性在一定程度上依賴程序樣本的原有結構。

6)按序將同種混淆方法的混淆彈性與混淆強度進行關聯性分析可知,混淆強度與混淆彈性的相對變化存在多種情形,這些變化與混淆程序的符號執行求解路徑數量、路徑求解難度強相關,通過將符號執行時間與-scope復雜度進行關聯性分析歸納如下:①應用代碼虛擬化與控制流平坦的混淆程序中,混淆彈性與混淆強度都有明顯提升;②應用數學加密的混淆程序中,混淆彈性增加而混淆強度未見明顯變化;③應用模糊謂詞為后置混淆技術,混淆彈性無明顯增加而混淆強度增加明顯;④應用函數拆分為后置混淆技術時,混淆彈性表現與前置技術相關,而混淆強度有所提升;⑤應用數學加密為后置混淆技術時混淆強度普遍變化較小,而部分混淆程序彈性增加明顯。

實驗3 程序集2混淆與效果度量

為檢驗本文混淆度量方法的泛化能力,實驗3中使用經典算法程序集對其進行混淆與泛化度量,該數據集包含排序、字符串比較、計算公因數等40個經典算法,相比程序集1程序結構更加多樣化并有更高的實用價值。本實驗其余實驗配置與實驗2相同,經過混淆后得到其混淆彈性統計如圖6所示。-scope復雜度統計如圖7所示。從實驗結果看,對兩個程序集的混淆效果整體上差異較小,而程序集2的混淆彈性總體低于程序集1,其中幾種混淆技術的混淆效果有所不同。

1) 與程序集1相比,單次使用數學運算加密的混淆彈性較低,而單次使用控制流平坦、代碼虛擬化等提升-Scope復雜度較高的混淆時彈性提升較大,造成該現象的原因可能是本程序集中原有數學運算復雜性較強而程序嵌套度較低,使與后者相關的混淆技術在混淆彈性上表現較好。

2) 與程序集1相比,模糊謂詞對程序的混淆彈性提升更明顯,可能程序集2程序結構較復雜,導致符號執行路徑求解難度較大,因而在增加絕對分支數量時提升更高的混淆強度;然而由于程序本身嵌套結構較少及-Scope參數限制,模糊謂詞對-scope的增益不明顯。

3) 與程序集1中Flat與AddO16不同順序的技術組合產生顯著安全增益差異不同,程序集2中兩種組合的混淆彈性差異不十分明顯,前者-Scope甚至略高于后者,一方面是程序集差異導致的混淆技術使用效果差異,另一方面是在符號執行與控制流解析過程中可能存在一定誤差,導致混淆效果的度量偏差。

4) 按序將程序集2程序使用同種混淆方法的混淆彈性與混淆強度進行關聯性分析可知(如圖8所示),相同混淆技術對混淆程序的彈性與強度增益與程序集1的混淆增益方向基本一致,而在增益程度上表現出一定差異。

圖6 程序集2混淆彈性統計

Figure 6 Obfuscation resilience statistics of assembly 2

圖7 程序集2 N-scope復雜度統計

Figure 7-scope complexity statistics of assembly 2

圖8 程序集2混淆彈性與混淆強度關聯性

Figure 8 Assembly 2 obfuscation resilience and potency correlation

實驗4 程序集3混淆與效果度量

為模擬本文代碼混淆方法在實際場景中的應用,實驗4中使用Tigress混淆工具Random Function模塊隨機生成的100個具有不同結構的差異化程序集。這些差異化包括但不限于:控制流嵌套度、控制流語法樹節點數、基本塊數量、程序、函數、基本塊大小、程序輸入輸出類型、全局變量、局部變量、動態變量等各類型變量,分支條件與程序輸出是否依賴等。本實驗從Tigress超過40種混淆技術中隨機選取19組混淆組合對程序進行混淆,每組5種基礎混淆技術,Tigress混淆技術補充介紹如表3所示。

表3 Tigress混淆技術補充介紹

使用本文代碼混淆效果度量方法對混淆程序進行混淆,由于本實驗中使用混淆技術數量增加,故將-scope復雜度參數設置為0.01,設置最大符號執行時間t為4 min,其余設置與實驗2相同。程序集3混淆效果分析如表4所示。不同結構、使用不同混淆組合的混淆程序在本文度量方法上表現出較大差異,表明本文度量方法的良好泛化能力;符號執行時間標準差顯示程序集在同一混淆技術組合后的程序彈性增益較小,出現此現象一方面是多種混淆技術的使用使各程序的混淆彈性普遍較高,另一方面是程序集的實際代碼量差異不大,結構差異性在多次混淆后的彈性對比不明顯。

在實際應用場景中,通過分析不同混淆組合的混淆彈性與混淆強度指標,可以幫助混淆使用者更有效地對程序進行混淆。本實驗中推薦混淆強度與混淆彈性都較強的混淆技術組合,通常選擇較高的-scope復雜度與較長符號執行時間中位數,推薦混淆技術組合為序號1,3,6,7,8的混淆組合。專業安全人員根據各基礎混淆技術特性與安全需求可進一步進行選擇。

3 結束語

現有混淆度量方法缺少對混淆彈性度量,復雜控制流圖度量算法實現困難,抽象語義度量實用性不高,使得混淆技術使用者難以對混淆效果進行客觀評價并及時調整混淆策略,造成混淆技術過度累加導致的資源浪費。為解決上述問題,本文利用符號執行技術在真實代碼逆向、漏洞挖掘等攻擊場景中的常用性,結合-scope復雜度度量方法,對混淆程序進行動態的符號執行路徑遍歷與靜態的程序基本塊拓撲嵌套度分析,從混淆彈性和混淆強度兩個方向進行綜合度量,對超過4 000個混淆程序進行混淆度量的實驗結果表明,使用不同混淆方法的混淆程序在本代碼混淆度量方法中展現出差異化的混淆彈性與強度,同時在不同程序集上本方法表現出良好的泛化能力,可以為安全人員對混淆技術的評價以及混淆技術的組合提供合理參考。

本文設計的基于符號執行和-scope復雜度的混淆度量方法目前僅在有限的程序集與特定混淆技術上展開驗證,且本度量方法在使用上要求使用者具備一定程度的相關知識,如設置參數并分析混淆彈性和-scope復雜度,未來希望在更多樣化的程序集中和混淆技術上探究本度量方法的普適性與準確性并加以改進,同時基于機器學習等方法對程序集的混淆度量結果進行更全面的分析并制定推薦混淆策略。

表4 程序集3混淆效果分析

[1] AKHUNZADA A, SOOKHAK M, ANUAR N, et al. Man-at-the-end attacks: analysis, taxonomy, human aspects, motivation and future directions[J]. Journal of Network and Computer Applications, 2015, 48(6):44-57.

[2] VAN DEN BROECK J, COPPENS B, DE SUTTER B. Flexible software protection[J]. Computers & Security, 2022, 10(2): 6-36.

[3] 耿普, 祝躍飛. 一種基于分支條件混淆的代碼加密技術[J]. 計算機研究與發展, 2019, 56(10): 2183-2192.

GENG P, ZHU Y F. A code encrypt technique based on branch condition obfuscation[J]. Journal of Computer Research and Development, 2019, 56(10): 2183-2192.

[4] 陳喆, 王志, 王曉初, 等. 基于代碼移動的二進制程序控制流混淆方法[J]. 計算機研究與發展, 2015, 52(8): 1902-1909.

CHEN Z,WANG Z, WANG XC, et al. Using code mobility to obfuscate control flow in binary codes[J]. Journal of Computer Research and Development, 2015, 52(8): 1902-1909.

[5] AHIRE P, ABRAHAM J. Mechanisms for source code obfuscation in C: novel techniques and implementation[C]//2020 International Conference on Emerging Smart Computing and Informatics. 2020.

[6] PIZZOLOTTO D, FELLIN R, CECCATO M. OBLIVE: seamless code obfuscation for Java programs and Android Apps[C]//2019 IEEE 26th International Conference on Software Analysis, Evolution and Reengineering. 2019.

[7] VAN DEN BROECK J, COPPENS B, DE SUTTER B. Obfuscated integration of software protections[J]. International Journal of Information Security, 2021, 20(1): 73-101.

[8] CECCATO M, ANDREA C, PAOLO F, et al. A large study on the effect of code obfuscation on the quality of Java code[J]. Empirical Software Engineering, 2015, 20(6): 1486–1524.

[9] LARSEN P, HOMESCU A, BRUNTHALER S,et al. SoK: automated software diversity[C]//Symposium on Security and Privacy. 2014.

[10] XU H, ZHOU Y, MING J, et al. Layered obfuscation: a taxonomy of software obfuscation techniques for layered security[J]. Cybersecurity, 2020, 3(1): 1-18.

[11] PENG Y, CHEN Y, SHEN B. An adaptive approach to recommending obfuscation rules for java bytecode obfuscators[C]//2019 IEEE 43rd Annual Computer Software and Applications Conference. 2019.

[12] COLLBERG C, THOMBORSON C, LOW D. A taxonomy of obfuscating transformations[R]. 1997.

[13] ANCKAERT B, MADOU M, DE SUTTER B, et al. Program obfuscation: quantitative approach[C]//ACM Workshop on Quality of Protection, 2007.

[14] KIRK SR, JENKINS S. Information theory-based software metrics and obfuscation[J]. Journal of Systems and Software, 2004, 72(2):179-186.

[15] MOHSEN R, PINTO AM. Evaluating obfuscation security: A quantitative approach[C]//International Symposium on Foundations and Practice of Security. 2016.

[16] MOHSEN R. Quantitative measures for code obfuscation security[D]. London: Imperial College London, 2016.

[17] RODRíGUEZ-VELIZ M, NU?EZ-MUSA Y, LIMA R S. Call graph obfuscation and diversification: an approach[J]. IET Inf Secur, 2020, 14(2): 241-252.

[18] TSAI HY, HUANG YL, WAGNER D. A graph approach to quantitative analysis of control-flow obfuscating transformations[J]. IEEE Transactions on Information Forensics and Security, 2009, 4(2): 257-267.

[19] GAO D, REITER MK, SONG D. BinHunt: automatically finding semantic differences in binary programs[C]//International Conference on Information and Communications Security. 2008.

[20] LUO L, MING J, WU D, et al. Semantics-based obfuscation-resilient binary code similarity comparison with applications to software plagiarism detection[C]//ACM Sigsoft International Symposium on Foundations of Software Engineering. 2014.

[21] PUCELLA R, SCHNEIDER FB. Independence from obfuscation: a semantic framework for diversity[J]. Computers & Security, 2010, 18(5):701-749.

[22] DALLA M, GIACOBAZZI R. Semantic-based code obfuscation by abstract interpretation[C]//International Colloquium on Automata, Languages, and Programming. 2005.

[23] VITICCHIE A, REGANO L, TORCHIANO M, et al. Assessment of source code obfuscation techniques[C]//International Working Conference on Source Code Analysis and Manipulation. 2016.

[24] CECCATO M, DI PENTA M, NAGRA J, et al. The effectiveness of source code obfuscation: an experimental assessment[C]//International Conference on Program Comprehension. 2009.

[25] BANESCU S, COLLBERG C, GANESH V, et al. Code obfuscation against symbolic execution attacks[C]//Annual Conference on Computer Security Applications. 2016.

[26] MAJUMDAR A, DRAPE S, THOMBORSON C. Metrics-based evaluation of slicing obfuscations[C]// International Symposium on Information Assurance and Security. 2007.

[27] MOLNAR D, LI XC, WAGNER DA. Dynamic test generation to find integer bugs in x86 binary linux programs[C]//USENIX Security Symposium. 2009.

[28] WANG Z, MING J, JIA C, GAO D. Linear obfuscation to combat symbolic execution[C]//European Symposium on Research in Computer Security. 2011.

[29] ZUSE H. Software complexity: measures and methods[R]. Berlin, Walter de Gruyter GmbH & Co KG, 1991.

[30] KARNICK M, MACBRIDE J, MCGINNIS S, et al. A qualitative analysis of Java obfuscation[C]//IASTED International Conference on Software Engineering and Applications. 2006.

Metrics for code obfuscation based on symbolic execution and-scope complexity

XIAO Yuqiang, GUO Yunfei, WANG Yawen

Information Engineering University, Zhengzhou 450001, China

Code obfuscation has been well developed as mitigated endogenous security technology, to effectively resist MATE attacks (e.g. reverse engineering). And it also has important value for the reasonable metrics of code obfuscation effect. Since symbolic execution is widely used in anti-obfuscation attacks, metrics for code obfuscation resilience can refer to the efforts of generating input test set for executing all program paths. However, some adversarial techniques could reduce the symbol execution efficiency significantly based on the nested structure of the program and increase the error of the resilience reference. To solve the above problems, a metrics for code obfuscation was proposed based on symbolic execution and N-scope complexity. The obfuscation resilience was defined with symbolic execution time and obfuscation potency was defined based on the proposed N-scope complexity for better robustness in measuring the resilience of multi-nested structure programs. Furthermore, the correlation analysis of obfuscation effect was proposed and the effect was quantified by symbolic execution and control flow diagram extraction of programs. Over 4000 obfuscated programs from 3 open-sourced assemblies were evaluated with proposed metrics in the experiment, which indicated the generalization performance and practicality of the metrics. And an example of this metrics application was presented in a simulated obfuscation scenario which provided references of obfuscation technology metrics and obfuscation configuration for obfuscation users.

code obfuscation, obfuscation metrics, symbolic execution,-scope

TP393

A

10.11959/j.issn.2096?109x.2022085

2021?07?07;

2022?05?11

肖玉強,516162560@sjtu.edu.cn

國家重點研發計劃(2021YFB1006200,2021YFB1006201),國家自然科學基金(62072467)

The National Key R&D Program of China (2021YFB1006200, 2021YFB1006201), The National Natural Science Foundation of China(62072467)

肖玉強, 郭云飛, 王亞文. 基于符號執行和-scope復雜度的代碼混淆度量方法[J]. 網絡與信息安全學報, 2022, 8(6): 123-134.

XIAO Y Q, GUO Y F, WANG Y W. Metrics for code obfuscation based on symbolic execution and-scope complexity[J]. Chinese Journal of Network and Information Security, 2022, 8(6): 123-134.

肖玉強(1997?),男,吉林遼源人,信息工程大學碩士生,主要研究方向為網絡空間安全、代碼混淆、機器學習。

郭云飛(1963?),男,河南鄭州人,信息工程大學教授、博士生導師,主要研究方向為云安全、電信網絡安全、網絡安全。

王亞文(1990?),男,河南鄭州人,信息工程大學講師,主要研究方向為云計算、入侵容忍、網絡安全。

猜你喜歡
嵌套度量復雜度
鮑文慧《度量空間之一》
兼具高自由度低互耦的間距約束稀疏陣列設計
代數群上由模糊(擬)偽度量誘導的拓撲
突出知識本質 關注知識結構提升思維能力
一種低復雜度的慣性/GNSS矢量深組合方法
度 量
論電影嵌套式結構的內涵與類型
嵌套交易如何實現逆市盈利
求圖上廣探樹的時間復雜度
巧用嵌套交易實現逆市盈利
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合