反編譯中基于子圖同構匹配算法的內在函數識別方法【
技術領域:
】[0001]本發明屬于反編譯
技術領域:
,涉及一種反編譯中對內聯內在函數的識別方法,具體涉及一種反編譯中基于子圖同構匹配算法的內在函數識別方法。【
背景技術:
】[0002]反編譯技術最早出現在60年代,主要是為了實現代碼的跨平臺移植,目前已經被廣泛運用到程序理解,源代碼恢復,程序調試,安全分析等各個方面。反編譯軟件包括前端,中間端和后端。前端包括加載器、軟件解析單元和解碼器。加載器加載可執行文件,反匯編得到匯編代碼,反編譯軟件再將匯編程序組織成相應的數據結構,如符號表、符號地址表、過程體入口地址表、指令鏈表等;軟件解析單元將特定系統架構的寄存器信息、標志位函數和指令解碼信息等組織成相應的數據結構,在解碼階段使用;解碼器解碼匯編指令序列,根據控制流重構算法構造出匯編程序的控制流圖。中間端是反編譯流程中最重要的部分,該部分主要包括數據流分析,控制流分析和類型分析。數據流分析通過活躍變量分析來消除無用代碼,傳播表達式,確定被調用過程體的參數和返回值等;控制流分析根據結構化算法,將控制流圖中的節點按照其在控制流圖中的位置分成不同的類別,如順序代碼塊、分支代碼塊和循環代碼塊等;類型分析從機器指令的操作碼、庫函數的簽名和常數的值等多處獲取基本類型信息,然后利用類型推導規則推導其他變量的類型,從而使得生成的高級代碼的可讀性更強。后端是高級代碼的生成,通過遍歷控制流圖,依據每一個基本塊的類型,分別生成順序、分支和循環的代碼。[0003]目前的主流反編譯軟件包括Hex-Rays,Phoenix,RetargetableDecompiler,Boomerang等。Hex-Rays是基于當前最流行的商業反匯編器IDA開發的具有反編譯功能的插件,可以將匯編指令轉化為微指令代碼,然后進行全局優化、局部優化、結構化分析和類型分析來提高微指令代碼的抽象水平。Hex-Rays能識別出大概三分之一的內在函數。Phoenix在反編譯軟件BAP的基礎上,將x86匯編指令流轉化為中間語言BIL,Phoenix沒有在匯編代碼或者BIL上進行習語的檢測,但Phoenix提供了20種模式,可以簡化由gcc編譯器產生的指令代碼。RetargetableDecompiler利用窺孔優化算法實現了在LLVMIR代碼上的習語檢測,基于不同的ISA產生的IR變化很大,同時一條匯編指令對應幾條復雜的LLVMIR語句,使得反編譯的效率不高。Boomerang是一款在UQBT二進制翻譯的基礎上,面向多種架構實現的開源反編譯系統,可以實現PowerPC、Spare和X86等多種體系結構的可執行程序的反編譯。Boomerang中沒有實現對內聯內在函數的識別。[0004]程序中為了實現特定的功能通常包含大量的函數,如用戶函數、系統函數等。內在函數也叫內建函數,是編譯器內部的函數,既不屬于庫函數也不屬于系統函數。雖然不同類型函數在二進制文件中的表現存在差異,但都是特定功能的代碼片段,都能給出與調用點上下文相關的變量的類型信息,所以如果能識別出這些函數,不僅能夠大幅減少代碼的分析量,為后續分析提供類型信息,同時也能提高反編譯結果的可讀性,提高分析效率。在現有常規的反編譯軟件中,對于庫函數的識別主要采用基于模式匹配的識別方法,Hex-Rays采用Flirt算法,根據庫函數對應的二進制字節流信息,構建函數的簽名信息,通過匹配函數簽名信息識別恢復庫函數。如C語言中常見的庫函數strlen、strcpy、strcmp、memcmp,這類庫函數也作為編譯器的內在函數,在編譯優化選項下,函數體在函數調用點內聯展開函數體語句,Flirt算法構建的字節流函數簽名,不能有效的表示指令語句之間的控制流關系,無法高效地識別出該類函數,導致對內在函數的反編譯結果不完全,影響了最終產生的高級代碼的可讀性。【
發明內容】[0005]本發明的目的在于提供一種反編譯中基于子圖同構匹配算法的內在函數識別方法,能夠高效地實現對內聯內在函數的識別,減少類型分析和數據流分析的工作量,提高反編譯過程中的抽象層次,增強反編譯結果的可讀性和準確性。[0006]為達到上述目的,本發明采用以下技術方案:[0007]-種反編譯中基于子圖同構匹配算法的內在函數識別方法,包括以下步驟:[0008]1)針對具體的編譯器,構建該編譯器的內在函數模板庫;[0009]2)基于反編譯軟件Boomerang將目標匯編文件進行解碼,構建出目標匯編文件的匯編指令控制流圖;[0010]3)將內在函數模板庫中的內在函數模版與目標匯編文件的匯編指令控制流圖進行子圖同構匹配,識別目標匯編文件中的目標程序中內聯的內在函數;[0011]4)結合內在函數的原型和同構映射關系恢復內在函數的函數名、返回值、返回值類型和函數參數。[0012]所述步驟1)中的內在函數模板庫的構建方法包括以下步驟:[0013]a)選取具有內在函數調用的程序作為樣本程序,在編譯器優化選項下編譯樣本程序生成可執行文件;[0014]b)利用IDA反匯編器反匯編可執行文件,生成匯編文件,將匯編文件作為Boomerang反編譯器的輸入,Boomerang反編譯器對匯編文件進行加載和解碼,解碼模塊以連續的匯編指令為基本塊,以控制流關系為有向邊,構建匯編文件的匯編指令控制流圖;[0015]c)提取基于匯編指令控制流圖的內在函數的控制流子圖和匯編指令序列,作為內在函數的模板,并插入到內在函數模板庫中;[0016]d)重復步驟a)~c),構造出通用計算機體系結構所共有的內在函數的內在函數模板庫。[0017]所述的內在函數模板庫針對具體編譯器的內在函數,將代表內在函數特征的匯編指令控制流圖作為內在函數的函數模板;將內在函數對應的所有函數模板以字典的形式組織,以內在函數的鍵為內在函數名稱,以內在函數的值為模板鏈表;內在函數的函數模板的匯編指令控制流圖的頂點由匯編指令組成的基本塊構成,匯編指令控制流圖的邊由表示基本塊之間的控制流關系組成。[0018]所述步驟2)中構建出的目標匯編文件的匯編指令控制流圖是一個表示程序控制流變化的有向圖G=(N,E,entry,exit),其中entry表示程序唯一入口節點,exit表示程序唯一出口節點,N表示基本塊,E表示有向邊,G表示有向圖。[0019]所述步驟3)中子圖同構匹配的具體步驟如下:[0020]A)對匹配狀態進行初始化,初始狀態S=Stl,初始狀態的子圖同構映射集M(S(>)=0,初始狀態的候選節點對集P(Stl)=KTdB1),(T1,B2)…(TpBn)},其中S為當前匹配狀態集,Stl為初始狀態的匹配狀態集,Tl為模板入口基本塊,Bl為目標控制流圖第1個基本塊,Bn為目標控制流圖第η個基本塊;[0021]Β)從內在函數模板庫中取出一個函數模板;[0022]C)利用VF2子圖同構匹配算法進行圖模式匹配和基本塊語義匹配,根據當前匹配狀態集S以及目標控制流圖與模板子圖的拓撲結構,計算出當前候選節點對集P(S),并對當前候選節點對集P(S)中的每一個候選節點對P進行基本塊語義匹配,若匹配成功,則更新匹配狀態集為S',同時將候選節點對P添加到當前子圖同構映射集M(S')中,并更新候選節點對集為P(S');繼續對匹配狀態集S'進行匹配,如果匹配成功,則繼續匹配;否則回溯到匹配狀態集S繼續匹配;直至子圖同構映射集包含模板子圖的全部基本塊,則當前內在函數模板匹配成功;[0023]D)在目標控制流圖中標記匹配成功的函數模板中的所有基本塊,通過狀態回溯算法繼續匹配目標控制流圖中存在的其他函數模板,直至當前候選節點對集P(S)為空,表示當前函數模板匹配結束;否則當前函數模板匹配失敗,轉至步驟B),依次取其它函數模板進行子圖同構匹配,直至內在函數模板庫中的函數模板匹配完畢。[0024]所述的基本塊語義匹配,是用來對比內在函數模板中的基本塊和目標控制流圖中的待匹配基本塊之間語義是否一致的方法;基本塊的語義由基本塊的匯編指令序列表示,將基本塊的匯編指令操作碼序列作為語義匹配的標準;同時基本塊語義匹配滿足以下要求:內在函數模板中的基本塊的匯編指令當前第1頁1 2 3 4