耿普,祝躍飛
路徑分支混淆研究綜述
耿普,祝躍飛
(戰略支援部隊信息工程大學,河南 鄭州 450001)
代碼混淆是一種便捷、有效的軟件保護方法,能夠較好地對抗以逆向分析為基礎的MATE攻擊,隨著以符號執行為基礎的自動程序分析技術的發展,出現了能夠抵抗符號執行的新代碼混淆方法——路徑分支混淆。依據路徑分支信息的構成,以及分支信息在對抗符號執行分析上的差異,對分支混淆技術進行了分類,并給出了分支信息泄露與符號執行的聯系;按照分支混淆的分類,對當前分支混淆的研究進展進行了介紹和總結,分析了各類分支混淆的優缺點;最后,對分支混淆技術的發展進行了展望。
逆向工程;代碼混淆;符號執行;路徑分支混淆
隨著互聯網和信息技術的發展,網絡信息技術已經滲入社會生產和生活的各個角落,與社會生產和生活的結合日趨緊密,對社會發展產生了較大影響,計算機軟件作為信息處理和人之間交互的載體也在不斷發展壯大。由于互聯網架構的開放性和商業軟件的分發性,互聯網安全和軟件安全成為當前研究的熱點和難點問題,特別是在MATE(man at the end)攻擊環境下,攻擊者完全掌控軟件的運行環境和運行狀態,能夠對運行環境和運行狀態進行任意的查看和修改,通過軟件逆向工程技術對軟件進行分析、測試,獲取軟件的執行邏輯、私密算法和數據,利用軟件漏洞挖掘及利用、軟件盜版、軟件篡改和軟件私密算法及數據竊取等攻擊手段攫取了巨大的非法利益,給軟件行業的發展帶來了重大損失,也給信息和網絡安全帶來了極大挑戰。MATE攻擊描述如圖1所示。

圖1 MATE攻擊描述
Figure 1 The description of MATE attack
針對軟件逆向工程和MATE攻擊,軟件保護研究者提出了代碼混淆[1-4]的軟件保護方法。通過對程序進行語義等價變換,變換后的程序更加難以理解,能更好地對抗逆向分析技術,從而增加攻擊者達成目標的時間和經濟成本,降低攻擊收益,迫使攻擊者放棄攻擊,達成軟件保護的目的。近年來,隨著計算和存儲能力的爆發式增長,以符號執行為基礎,結合污點分析、動態插樁、約束條件獲取和約束條件求解等技術的軟件自動分析方法得到了長足進步,并且在漏洞挖掘與利用、軟件測試、測試用例生成和代碼重用等方面的應用取得了較好的效果。由于分支信息是程序執行邏輯和算法的基礎,而符號執行的前提是對分支信息進行分析,獲取約束條件進行求解,因此安全研究者提出了一種防止分支信息泄露代碼混淆技術——路徑分支混淆。路徑分支混淆對分支信息進行隱藏和保護,實現程序執行邏輯的隱藏,對抗符號執行[5-18]和程序自動分析,達成軟件保護的目的。
符號執行是一種使用符號代替變量實際值進行代碼執行分析的程序分析方法,通過在條件跳轉處,使用符號值列出不同路徑的約束條件,最后對每條路徑上的約束條件進行求解,得到執行該路徑的輸入符號對應的實際值,為下一步的程序分析和測試提供良好的條件。
當前符號執行技術按照約束條件的獲取方式,可以分為傳統符號執行、混合符號執行和選擇符號執行。其中,傳統符號執行是在一次符號執行分析中,得到所有路徑的約束條件集。混合符號執行則在使用實際值執行的過程中對條件跳轉指令和污染分析,對當前執行路徑上的所有分支列出對應的約束條件集。選擇符號執行則是一種獲取特定路徑的輸入符號值的程序分析方法。
Collberg[1]等在對混淆變換的分類研究中,對代碼混淆給出了較為明確的定義,并給出了代碼混淆評價指標的描述。
定義1 代碼混淆


圖2 代碼混淆描述
Figure 2 The description of code obfuscation

路徑分支混淆是一種阻礙分支信息泄露的代碼混淆技術,其通過阻礙分支信息泄露,抵抗符號執行。從符號執行的介紹可知,符號執行需要使用程序的分支信息來獲取約束條件,并對約束條件進行求解得到對應路徑的輸入符號值。因此,通過隱藏條件跳轉指令、復雜分支條件、阻斷分支選擇等方式,保護分支信息,從而阻礙符號執行對約束條件的獲取和求解。路徑分支混淆正是通過破壞約束條件獲取和加大約束條件求解難度,從而對抗符號執行和隱藏程序執行邏輯。
路徑分支混淆通過對分支信息進行變換,在保持程序語義的同時,通過隱藏獲取約束條件所需的分支信息、增加約束求解的難度甚至使約束不可解、切斷符號執行的路徑選擇等方式,抵抗符號執行對程序進行分析。在結構上,分支信息包括分支控制指令、分支條件、分支目標地址3個部分,如圖3所示。其中,分支控制指令用于對分支選擇進行控制,根據分支條件的結果選擇對應的分支代碼執行;分支條件是分支選擇的基礎,根據分支條件計算的結果實現對分支選擇的控制;分支目標地址是供分支選擇的下一步執行地址,根據分支條件取值的不同,具有不同的分支目標地址。分支控制指令、分支條件和分支目標地址構成一個完整的分支信息。
按照分支信息的構成,把分支混淆分為3類,分別是分支控制方式混淆、分支條件混淆和分支目標地址混淆。

圖3 分支信息結構
Figure 3 The construction of branch information
分支控制方式混淆是一種對分支選擇的控制方式進行混淆變換的代碼混淆技術。在抵抗符號執行方面,該類混淆技術通過變換隱藏條件跳轉指令,對抗符號執行的約束條件獲取過程。由于當前的符號執行工具均是在條件跳轉指令處,通過分析當前標志寄存器與輸入符號之間的污染約束信息、跳轉指令使用的標志寄存器位置信息,從而獲取當前指令處不同分支選擇的約束條件。因此,若對分支控制方式進行混淆變換,隱藏條件跳轉指令,則當前大多數的符號執行工具無法列出正確的約束條件,從而使符號執行分析得不到正確的路徑信息,對程序的分析得到錯誤結果。
分支條件混淆是當前分支研究的熱點問題,其混淆變換的是分支信息中的分支條件。通過混淆變換,在保持程序語義的同時,程序執行時能夠快速計算每個分支輸入對應的分支條件取值,但通過分支條件取值難以逆向分析出對應的分支輸入集合。分支條件混淆通過復雜化、單向化分支條件的計算過程,使當前的求解器無法完成對應路徑的約束條件的求解,導致符號執行對程序的分析得不到結果,即分支條件混淆是一種對抗求解器求解能力的混淆方式。
分支目標地址混淆通過對分支目標地址的識別進行混淆變換,通過變換隱藏分支目標地址。符號執行在分支處通過對目標地址的定位,決定當前路徑的下一條執行指令地址,若分支目標地址被隱藏,則符號執行由于不知道下一條指令地址而無法繼續執行,從而中斷符號執行的分析過程。當然,在混合符號執行過程中,由于程序使用實際值執行,指令地址不可隱藏,且在分支點處獲取約束條件用不到分支目標地址信息,因此分支目標地址混淆難以對抗混合符號執行。
分支信息是程序執行邏輯的重要體現,也是程序控制權的轉移依據,特別是隨著以符號執行為基礎的程序自動分析技術在逆向分析方面的發展,分支信息成為需要保護的重要信息,隱藏程序執行邏輯、阻礙分支信息泄露、對抗符號執行的分支混淆技術逐漸成為軟件保護研究領域的熱點問題。當前,在分支混淆研究領域已經取得一些較好的成果,在保護分支信息、對抗符號執行和隱藏程序執行邏輯等方面具有較好的軟件保護效果。下面按照分支混淆技術的分類介紹其研究進展。
分支控制信息是分支信息的重要組成部分,其決定著程序執行控制權的轉移方式,當前最常見的控制轉移方式是顯式的條件跳轉指令方式。程序源代碼的控制邏輯經過編譯器編譯后大多使用條件跳轉指令實現分支選擇,如jz、jne、jb、jg等指令,這是一種顯式的分支選擇控制方式。通常,針對現有的符號執行工具通過顯式的條件跳轉指令分析,定位分支信息和獲取約束條件,分支控制混淆通過異常處理、信號機制和指令副作用等多種方式實現控制權的隱式轉移,避開顯式的條件跳轉指令,實現分支控制方式的混淆變換,使符號執行工具難以定位分支信息和獲取約束條件。因此,分支控制方式混淆是一種顯式控制到隱式控制的變換,分支控制方式的混淆變換如下。
1) 利用代碼自修改方式實現條件跳轉指令隱藏,保護分支信息,對抗反匯編技術和符號執行。使用垃圾數據對需要混淆的跳轉指令進行覆蓋,同時在該地址的前支配路徑上添加自修改代碼,使跳轉指令在執行前被恢復,并在執行后重新使用垃圾數據覆蓋跳轉指令。垃圾數據不能反匯編的特點使程序具有對抗靜態反匯編的功能;同時由于條件跳轉指令被垃圾數據覆蓋,靜態代碼與實際執行的代碼不一致,導致使用靜態代碼作為輸入的靜態分析技術得出錯誤結論,因此,該分支混淆方法能夠對抗使用靜態代碼進行分析的傳統符號執行和控制流圖生成。Balachandran等[6]提出的代碼混淆方法就是一種使用代碼自修改實現的靜態分支混淆技術。
2) 利用異常處理實現控制權轉移,替代條件跳轉指令,隱藏分支信息,對抗符號執行。當程序執行過程中發生異常時,操作系統會獲取程序控制權進行異常處理,實現控制權在程序和系統之間的轉移,代碼混淆正是利用異常發生的控制權轉移實現控制方式的混淆變換。分支混淆首先構造一段在特定條件下會產生異常的代碼——條件異常代碼,并使用條件異常代碼替換跳轉指令;通過注冊異常處理函數,在控制權轉移過程中把控制權轉移到分支目標地址,實現分支混淆。由于條件異常代碼是由常見的非跳轉指令構成的,因此隱藏了條件跳轉指令,使分支混淆能夠隱藏執行邏輯和控制流、對抗傳統符號執行。Popov[19]、Lin[7]和賈春福[8]都使用異常處理分別提出了自己的分支混淆方法。Popov在Linux系統下使用自陷指令替代無條件跳轉指令產生信號,使預先注冊的信號處理函數對控制權轉移進行干涉,使分支目標地址能夠正確獲取執行控制權;使用不可反匯編的垃圾數據覆蓋無條件跳轉指令,對抗反匯編技術。Lin和賈春福在Popov的基礎上,使用常見的mov等普通指令構造條件異常代碼,并替換條件跳轉指令;通過異常處理函數處理控制權轉移,實現分支混淆,對抗符號執行。
分支控制方式混淆使用隱式控制轉移替代顯式控制轉移,阻礙符號執行工具對約束條件的獲取,即只是增加了獲取的難度,并非使獲取約束條件成為不可能。因此,通過修改符號執行工具的分支信息定位方式和分支信息分析方式,可以獲取被混淆分支的約束條件。因此,其后續的研究重點應該在如何提高混淆強度和增強混淆的隱蔽性上。只有通過增強混淆的隱蔽性,提高修改符號執行工具獲取被混淆分支地址的難度,才能提高分支混淆對抗符號執行和逆向分析的強度。例如,使用異常處理替代條件跳轉分支混淆,如果用于混淆的異常處理和正常使用的異常處理被區分開,即可以通過代碼動態插樁的方式,在異常發生處和異常返回程序空間地址處獲取分支信息,實現混淆還原。
分支條件混淆是一種對分支條件進行變換的代碼混淆技術,當前的分支條件混淆主要是基于哈希和加密算法的分支輸入驗證法和基于機器學習的分支輸入分類法。基于哈希函數和密碼算法的分值輸入驗證法則是利用哈希函數和密碼算法的單向特性和復雜性,阻礙分支信息泄露和對抗約束求解;基于機器學習的分值輸入分類法利用機器學習結果的復雜性和不可理解性,實現程序執行邏輯隱藏和約束條件復雜化,對抗符號執行和逆向工程。分支條件的混淆變換如下。
1) 使用哈希函數和加密算法對分支條件進行語義等價的不可逆混淆變換,實現分支條件混淆和程序執行邏輯隱藏。哈希函數和加密算法都具有相當的復雜性,且哈希函數具有良好的單向特性。基于哈希函數和加密算法的混淆分支對應的約束條件求解難度等同于解密和通過哈希值求解哈希輸入的難度,當前條件下,約束求解器難以完成此類約束條件的求解。因此,基于哈希函數和加密算法的分支混淆方法具有非常高的混淆強度和混淆彈性,且解密和哈希計算的速度相對較快,使分支混淆的消耗較為低廉,具備較高的執行效率。在該類分支混淆技術中,Sharif[9]使用哈希值相等替代原等于條件實現分支條件混淆,并且使用分支輸入作為密鑰對條件代碼進行加密,實現了能夠對抗惡意分析的代碼保護方法。Wang[12]等使用保留前綴加密算法和哈希函數對分支的輸入集合進行處理,通過加密前綴匹配替代分支條件,實現了分支條件混淆從等于分支到大小比較分支的擴展。
2) 基于機器學習訓練分值輸入分類器,使用分類器替代分支條件,利用分類器的復雜性和不可理解性隱藏程序執行邏輯,實現分支條件混淆。機器學習是當前研究的熱點問題,通過使用多層神經網絡、支持向量機等各種方法對數據分類進行訓練,得到的分類器具有較優的分類效果。但分類器的運行邏輯卻難以被理解,這在機器學習是一個缺點,但在對抗逆向分析中則是優點。Zong[13]、Ma[14]和陳喆[15]等分別基于支持向量機、神經網絡和隨機森林對分支輸入進行分類訓練,并使用分類器替代分支條件,實現分支混淆;Ma[16]等進一步使用分支條件混淆實現了抗分析攻擊的軟件指紋嵌入,提升了軟件追溯盜版復制的能力。
3) 基于代碼分離的分支條件混淆。上述兩類分支條件混淆是對分支條件的邏輯進行混淆,通過邏輯變換對抗約束求解。而基于代碼分離的分支條件混淆則是一種物理隔離的代碼保護方法,通過把分支條件的執行邏輯移動到遠端可信實體,不可信實體則通過與可信實體的通信獲取分支條件的執行結果。Wang等[17]通過該方法實現了分支條件混淆,并結合分支控制方式混淆,使用垃圾數據覆蓋條件跳轉指令,對抗反匯編技術。
分支目標地址是決定符號執行下一條指令地址的關鍵信息,通過分支目標地址隱藏可以對抗傳統符號執行。由于混合符號執行使用實際值運行程序,單純的目標地址混淆對混合符號執行不造成影響,因此分支目標地址混淆的相關研究較少。當前的目標地址混淆主要是通過代碼移動方式實現的,如陳喆等[18]把控制邏輯和分支目標地址移動至可信實體執行,實現分支條件和分支目標地址的混淆。
分支控制方式混淆優點如下。①混淆后程序具有非常高的執行效率,幾乎與混淆前的執行效率相當。②能較好地對抗反匯編技術。由于控制方式的變換導致跳轉指令消失,容易通過增加垃圾數據對抗反匯編技術。③增加約束條件獲取難度。缺點是:①混淆彈性有待提高,難以抵抗程序動態分析技術;②使用動態分析手段容易還原出被混淆的分支信息,實現混淆恢復。
分支條件混淆的優點如下。①具有較好的混淆強度和混淆彈性。混淆本身基于變換的不可逆性和難以理解性,因此混淆后的分支條件難以被理解和還原。②對抗符號執行的效果較好。混淆針對的是求解器的求解能力,而非符號執行工具的運行方式,因此該混淆是一種治本的方法。③抗逆向分析效果好。難以理解和單向性保證了分析者獲取信息的難度。其缺點是執行效率相對較低。特別是基于機器學習的分類器方法,在執行時間和數據、代碼空間的消耗上還需要進一步優化。
分支目標地址混淆的優點是:①實現簡單,能對抗傳統符號執行;②能對抗控制流圖生成。其缺點是:①難以抵抗混合符號執行;②使用IO通信導致執行效率相對較低。
當前在分支混淆研究方面已經有了一些較好的成果,并且一些成果具有較好的實際應用效果,較好地提升了代碼保護的功效,為軟件、信息和網絡安全做出了貢獻。但當前對分支混淆的研究還不夠充分和深入,需要更多的科研工作者和更多的科研精力投入。分支混淆主要解決分支信息泄露問題,阻礙符號執行技術對程序進行分析;同時增加逆向分析者對混淆后代碼的理解難度,消耗攻擊者在程序分析過程中消耗的資源。為更好地使用分支混淆技術實現代碼保護,今后分支混淆在以下幾個方面值得深入研究。
1) 基于不同類別的分支混淆具有不同的優缺點。因此,研究不同類別的分支混淆技術的融合,揚長避短,可以提高分支混淆的執行效率、混淆彈性和混淆強度。
2) 分支混淆僅僅是代碼混淆技術中的一個分支,其保護對象僅限于分支信息,局限了代碼保護的范圍。因此,需要研究分支混淆和其他代碼混淆技術的融合,提高混淆技術的保護范圍。
3) 加強分支條件混淆的研究。分支控制方式混淆和分支目標地址混淆針對的是符號執行工具的運行方式,并沒有從根本上解決分支信息泄露的問題。針對約束求解器能力,則從根本上解決約束不可解的問題。因此,分支條件混淆在隱藏執行邏輯和對抗符號執行上具有更高的混淆強度和混淆彈性,具備更好的研究價值。
因此,在下一步的研究中,可以針對分支條件混淆方向采取重點研究,提高執行效率和混淆強度;同時融合不同類別分支混淆技術的優點,以及結合其他混淆技術的優點,進行綜合研究,更好地發揮代碼混淆的優勢,提高軟件保護能力,為軟件、信息和網絡的安全提供保障。
分支混淆通過對代碼中的分支信息進行保護,提升獲取路徑約束和約束求解的難度,從而使以符號執行技術為基礎的程序分析技術失效,達成代碼保護和對抗符號執行的目的。
本文綜合分析了當前分支混淆技術的研究內容,針對分支混淆技術研究的側重點和混淆目標的不同,對分支混淆進行了分類;按照本文提出的分支混淆分類,詳細介紹了當前分支混淆研究的內容和進展情況,分析和總結了每類分支混淆技術的優缺點;最后,總結了分支混淆的研究內涵,展望了分支混淆技術的發展方向,為下一步的分支混淆技術研究提供參考。
[1] COLLBERG C, THOMBORSON C, LOW D. A taxonomy of obfuscating transformations[R]. Department of Computer Science, The University of Auckland, New Zealand, 1997.
[2] MAVROGIANNOPOULOS N, KISSERLI N, PRENEEL B. A taxonomy of self-modifying code for obfuscation[J]. Computers & Security, 2011, 30(8): 679-691.
[3] AVIDAN E, FEITELSON D G. From obfuscation to comprehension[C]//2015 IEEE 23rd International Conference on Program Comprehension. 2015: 178-181.
[4] 楊宇波. 代碼混淆模型研究[D]. 北京: 北京郵電大學, 2015.
YANG Y B. Research on code obfuscation model[D]. Beijing: Beijing University of Posts and Telecommunications, 2015.
[5] BANESCU S, COLLBERG C, GANESH V, et al. Code obfuscation against symbolic execution attacks[C]//The 32nd Annual Conference on Computer Security Applications. 2016: 189-200.
[6] BALACHANDRAN V, EMMANUEL S. Potent and stealthy control flow obfuscation by stack based self-modifying code[J]. IEEE Transactions on Information Forensics and Security, 2013, 8(4): 669-681.
[7] LIN H, ZHANG X, YONG M, et al. Branch obfuscation using binary code side effects[C]//International Conference on Computer, Networks and Communication Engineering (ICCNCE 2013). 2013.
[8] 賈春福, 王志, 劉昕, 等. 路徑模糊: 一種有效抵抗符號執行的二進制混淆技術[J]. 計算機研究與發展, 2011, 48(11): 2111-2119.
JIA C F, WANG Z, LIU X, et al. Branch obfuscation: an efficient binary code obfuscation to impede symbolic execution[J]. Journal of Computer Research and Development, 2011, 48(11): 2111-2119.
[9] SHARIF M I, LANZI A, GIFFIN J T, et al. Impeding malware analysis using conditional code obfuscation[C]//NDSS. 2008.
[10] 王志. 二進制代碼路徑混淆技術研究[D]. 天津: 南開大學, 2012.
WANG Z. Research on binary code obfuscation[D]. Tianjin: Nankai University, 2012.
[11] 王志, 賈春福, 劉偉杰, 等. 一種抵抗符號執行的路徑分支混淆技術[J]. 電子學報, 2015, 43(5): 870-878.
WANG Z, JIA C F, LIU W J, et al. Branch obfuscation to combat symbolic execution[J]. Acta Electronica Sinica, 2015, 43(5): 870-878.
[12] WANG Z, MING J, JIA C F, et al. Linear obfuscation to combat symbolic execution[C]//European Symposium on Research in Computer Security. 2011.
[13] ZONG N, JIA C F. Branch obfuscation using" black boxes"[C]//2014 Theoretical Aspects of Software Engineering Conference. 2014: 114-121.
[14] MA H, MA X, LIU W, et al. Control flow obfuscation using neural network to fight concolic testing[C]//International Conference on Security & Privacy in Communication Systems. 2014.
[15] 陳喆, 賈春福, 宗楠, 等. 隨機森林在程序分支混淆中的應用[J].電子學報, 2018, 46(10): 156-164.
CHEN Z, JIA C F, ZONG N, et al. Branch obfuscation using random forest[J]. Acta Electronica Sinica, 2018, 46(10): 156-164.
[16] MA H, LI R, YU X, et al. Integrated Software fingerprinting via neural-network-based control flow obfuscation[J]. IEEE Transactions on Information Forensics & Security, 2016, 11(10): 2322-2337.
[17] WANG Z, JIA C F, LIU M, et al. Branch obfuscation using code mobility and signal[C]//IEEE Computer Software & Applications Conference Workshops. 2012.
[18] 陳喆, 王志, 王曉初, 等.基于代碼移動的二進制程序控制流混淆方法[J]. 計算機研究與發展, 2015, 52(8): 1902-1909.
CHEN Z, WANG Z, WANG X C, et al. Using code mobility to obfuscate control flow in binary codes[J]. Journal of Computer Research and Development, 2015, 52(8): 1902-1909.
[19] POPOV I V, DEBRAY S K, ANDREWS G R. Binary obfuscation using signals[C]//USENIX Security Symposium. 2007: 275-290.
Review of path branch obfuscation
GENG Pu, ZHU Yuefei
Strategic Support Force Information Engineering University, Zhengzhou 450001, China
Code obfuscation is a convenient and effective technique of software protection, which can combat MATE attacks based on reverse engineering. With the development of automatic programming analysis technology, a new code obfuscation technique which named path branch obfuscation was proposed to defeat symbolic execution. With the composition of branch information and how does the branch composition effect in execution technique, the branch obfuscation was classified into three types. Then, a detailed research and development situation of each branch obfuscation class was exhaustively described. At last, the prospects of branch obfuscation were discussed.
reverse engineering, code obfuscation, symbol execution, path branch obfuscation
The National Key R&D Program of China (No.2016YFB0801601, No.2016YFB0801505)
TP311
A
10.11959/j.issn.2096?109x.2020027

耿普(1982-),男,云南宣威人,戰略支援部隊信息工程大學博士生,主要研究方向為網絡與信息安全、代碼保護。
祝躍飛(1962-),男,浙江杭州人,博士,戰略支援部隊信息工程大學教授、博士生導師,主要研究方向為網絡空間、公鑰密碼。
論文引用格式:耿普, 祝躍飛. 路徑分支混淆研究綜述[J]. 網絡與信息安全學報, 2020, 6(2): 12-18.
GENG P, ZHU Y F. Review of path branch obfuscation[J]. Chinese Journal of Network and Information Security, 2020, 6(2): 12-18.
2019?06?24;
2019?09?03
耿普,23015636@qq.com
國家重點研發計劃基金資助項目(No.2016YFB0801601, No.2016YFB0801505)