两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

反編譯中基于子圖同構(gòu)匹配算法的內(nèi)在函數(shù)識別方法

文檔序號:9200229閱讀:746來源:國知局
反編譯中基于子圖同構(gòu)匹配算法的內(nèi)在函數(shù)識別方法【
技術(shù)領(lǐng)域
】[0001]本發(fā)明屬于反編譯
技術(shù)領(lǐng)域
,涉及一種反編譯中對內(nèi)聯(lián)內(nèi)在函數(shù)的識別方法,具體涉及一種反編譯中基于子圖同構(gòu)匹配算法的內(nèi)在函數(shù)識別方法?!?br>背景技術(shù)
】[0002]反編譯技術(shù)最早出現(xiàn)在60年代,主要是為了實現(xiàn)代碼的跨平臺移植,目前已經(jīng)被廣泛運用到程序理解,源代碼恢復,程序調(diào)試,安全分析等各個方面。反編譯軟件包括前端,中間端和后端。前端包括加載器、軟件解析單元和解碼器。加載器加載可執(zhí)行文件,反匯編得到匯編代碼,反編譯軟件再將匯編程序組織成相應的數(shù)據(jù)結(jié)構(gòu),如符號表、符號地址表、過程體入口地址表、指令鏈表等;軟件解析單元將特定系統(tǒng)架構(gòu)的寄存器信息、標志位函數(shù)和指令解碼信息等組織成相應的數(shù)據(jù)結(jié)構(gòu),在解碼階段使用;解碼器解碼匯編指令序列,根據(jù)控制流重構(gòu)算法構(gòu)造出匯編程序的控制流圖。中間端是反編譯流程中最重要的部分,該部分主要包括數(shù)據(jù)流分析,控制流分析和類型分析。數(shù)據(jù)流分析通過活躍變量分析來消除無用代碼,傳播表達式,確定被調(diào)用過程體的參數(shù)和返回值等;控制流分析根據(jù)結(jié)構(gòu)化算法,將控制流圖中的節(jié)點按照其在控制流圖中的位置分成不同的類別,如順序代碼塊、分支代碼塊和循環(huán)代碼塊等;類型分析從機器指令的操作碼、庫函數(shù)的簽名和常數(shù)的值等多處獲取基本類型信息,然后利用類型推導規(guī)則推導其他變量的類型,從而使得生成的高級代碼的可讀性更強。后端是高級代碼的生成,通過遍歷控制流圖,依據(jù)每一個基本塊的類型,分別生成順序、分支和循環(huán)的代碼。[0003]目前的主流反編譯軟件包括Hex-Rays,Phoenix,RetargetableDecompiler,Boomerang等。Hex-Rays是基于當前最流行的商業(yè)反匯編器IDA開發(fā)的具有反編譯功能的插件,可以將匯編指令轉(zhuǎn)化為微指令代碼,然后進行全局優(yōu)化、局部優(yōu)化、結(jié)構(gòu)化分析和類型分析來提高微指令代碼的抽象水平。Hex-Rays能識別出大概三分之一的內(nèi)在函數(shù)。Phoenix在反編譯軟件BAP的基礎(chǔ)上,將x86匯編指令流轉(zhuǎn)化為中間語言BIL,Phoenix沒有在匯編代碼或者BIL上進行習語的檢測,但Phoenix提供了20種模式,可以簡化由gcc編譯器產(chǎn)生的指令代碼。RetargetableDecompiler利用窺孔優(yōu)化算法實現(xiàn)了在LLVMIR代碼上的習語檢測,基于不同的ISA產(chǎn)生的IR變化很大,同時一條匯編指令對應幾條復雜的LLVMIR語句,使得反編譯的效率不高。Boomerang是一款在UQBT二進制翻譯的基礎(chǔ)上,面向多種架構(gòu)實現(xiàn)的開源反編譯系統(tǒng),可以實現(xiàn)PowerPC、Spare和X86等多種體系結(jié)構(gòu)的可執(zhí)行程序的反編譯。Boomerang中沒有實現(xiàn)對內(nèi)聯(lián)內(nèi)在函數(shù)的識別。[0004]程序中為了實現(xiàn)特定的功能通常包含大量的函數(shù),如用戶函數(shù)、系統(tǒng)函數(shù)等。內(nèi)在函數(shù)也叫內(nèi)建函數(shù),是編譯器內(nèi)部的函數(shù),既不屬于庫函數(shù)也不屬于系統(tǒng)函數(shù)。雖然不同類型函數(shù)在二進制文件中的表現(xiàn)存在差異,但都是特定功能的代碼片段,都能給出與調(diào)用點上下文相關(guān)的變量的類型信息,所以如果能識別出這些函數(shù),不僅能夠大幅減少代碼的分析量,為后續(xù)分析提供類型信息,同時也能提高反編譯結(jié)果的可讀性,提高分析效率。在現(xiàn)有常規(guī)的反編譯軟件中,對于庫函數(shù)的識別主要采用基于模式匹配的識別方法,Hex-Rays采用Flirt算法,根據(jù)庫函數(shù)對應的二進制字節(jié)流信息,構(gòu)建函數(shù)的簽名信息,通過匹配函數(shù)簽名信息識別恢復庫函數(shù)。如C語言中常見的庫函數(shù)strlen、strcpy、strcmp、memcmp,這類庫函數(shù)也作為編譯器的內(nèi)在函數(shù),在編譯優(yōu)化選項下,函數(shù)體在函數(shù)調(diào)用點內(nèi)聯(lián)展開函數(shù)體語句,F(xiàn)lirt算法構(gòu)建的字節(jié)流函數(shù)簽名,不能有效的表示指令語句之間的控制流關(guān)系,無法高效地識別出該類函數(shù),導致對內(nèi)在函數(shù)的反編譯結(jié)果不完全,影響了最終產(chǎn)生的高級代碼的可讀性?!?br/>發(fā)明內(nèi)容】[0005]本發(fā)明的目的在于提供一種反編譯中基于子圖同構(gòu)匹配算法的內(nèi)在函數(shù)識別方法,能夠高效地實現(xiàn)對內(nèi)聯(lián)內(nèi)在函數(shù)的識別,減少類型分析和數(shù)據(jù)流分析的工作量,提高反編譯過程中的抽象層次,增強反編譯結(jié)果的可讀性和準確性。[0006]為達到上述目的,本發(fā)明采用以下技術(shù)方案:[0007]-種反編譯中基于子圖同構(gòu)匹配算法的內(nèi)在函數(shù)識別方法,包括以下步驟:[0008]1)針對具體的編譯器,構(gòu)建該編譯器的內(nèi)在函數(shù)模板庫;[0009]2)基于反編譯軟件Boomerang將目標匯編文件進行解碼,構(gòu)建出目標匯編文件的匯編指令控制流圖;[0010]3)將內(nèi)在函數(shù)模板庫中的內(nèi)在函數(shù)模版與目標匯編文件的匯編指令控制流圖進行子圖同構(gòu)匹配,識別目標匯編文件中的目標程序中內(nèi)聯(lián)的內(nèi)在函數(shù);[0011]4)結(jié)合內(nèi)在函數(shù)的原型和同構(gòu)映射關(guān)系恢復內(nèi)在函數(shù)的函數(shù)名、返回值、返回值類型和函數(shù)參數(shù)。[0012]所述步驟1)中的內(nèi)在函數(shù)模板庫的構(gòu)建方法包括以下步驟:[0013]a)選取具有內(nèi)在函數(shù)調(diào)用的程序作為樣本程序,在編譯器優(yōu)化選項下編譯樣本程序生成可執(zhí)行文件;[0014]b)利用IDA反匯編器反匯編可執(zhí)行文件,生成匯編文件,將匯編文件作為Boomerang反編譯器的輸入,Boomerang反編譯器對匯編文件進行加載和解碼,解碼模塊以連續(xù)的匯編指令為基本塊,以控制流關(guān)系為有向邊,構(gòu)建匯編文件的匯編指令控制流圖;[0015]c)提取基于匯編指令控制流圖的內(nèi)在函數(shù)的控制流子圖和匯編指令序列,作為內(nèi)在函數(shù)的模板,并插入到內(nèi)在函數(shù)模板庫中;[0016]d)重復步驟a)~c),構(gòu)造出通用計算機體系結(jié)構(gòu)所共有的內(nèi)在函數(shù)的內(nèi)在函數(shù)模板庫。[0017]所述的內(nèi)在函數(shù)模板庫針對具體編譯器的內(nèi)在函數(shù),將代表內(nèi)在函數(shù)特征的匯編指令控制流圖作為內(nèi)在函數(shù)的函數(shù)模板;將內(nèi)在函數(shù)對應的所有函數(shù)模板以字典的形式組織,以內(nèi)在函數(shù)的鍵為內(nèi)在函數(shù)名稱,以內(nèi)在函數(shù)的值為模板鏈表;內(nèi)在函數(shù)的函數(shù)模板的匯編指令控制流圖的頂點由匯編指令組成的基本塊構(gòu)成,匯編指令控制流圖的邊由表示基本塊之間的控制流關(guān)系組成。[0018]所述步驟2)中構(gòu)建出的目標匯編文件的匯編指令控制流圖是一個表示程序控制流變化的有向圖G=(N,E,entry,exit),其中entry表示程序唯一入口節(jié)點,exit表示程序唯一出口節(jié)點,N表示基本塊,E表示有向邊,G表示有向圖。[0019]所述步驟3)中子圖同構(gòu)匹配的具體步驟如下:[0020]A)對匹配狀態(tài)進行初始化,初始狀態(tài)S=Stl,初始狀態(tài)的子圖同構(gòu)映射集M(S(>)=0,初始狀態(tài)的候選節(jié)點對集P(Stl)=KTdB1),(T1,B2)…(TpBn)},其中S為當前匹配狀態(tài)集,Stl為初始狀態(tài)的匹配狀態(tài)集,Tl為模板入口基本塊,Bl為目標控制流圖第1個基本塊,Bn為目標控制流圖第η個基本塊;[0021]Β)從內(nèi)在函數(shù)模板庫中取出一個函數(shù)模板;[0022]C)利用VF2子圖同構(gòu)匹配算法進行圖模式匹配和基本塊語義匹配,根據(jù)當前匹配狀態(tài)集S以及目標控制流圖與模板子圖的拓撲結(jié)構(gòu),計算出當前候選節(jié)點對集P(S),并對當前候選節(jié)點對集P(S)中的每一個候選節(jié)點對P進行基本塊語義匹配,若匹配成功,則更新匹配狀態(tài)集為S',同時將候選節(jié)點對P添加到當前子圖同構(gòu)映射集M(S')中,并更新候選節(jié)點對集為P(S');繼續(xù)對匹配狀態(tài)集S'進行匹配,如果匹配成功,則繼續(xù)匹配;否則回溯到匹配狀態(tài)集S繼續(xù)匹配;直至子圖同構(gòu)映射集包含模板子圖的全部基本塊,則當前內(nèi)在函數(shù)模板匹配成功;[0023]D)在目標控制流圖中標記匹配成功的函數(shù)模板中的所有基本塊,通過狀態(tài)回溯算法繼續(xù)匹配目標控制流圖中存在的其他函數(shù)模板,直至當前候選節(jié)點對集P(S)為空,表示當前函數(shù)模板匹配結(jié)束;否則當前函數(shù)模板匹配失敗,轉(zhuǎn)至步驟B),依次取其它函數(shù)模板進行子圖同構(gòu)匹配,直至內(nèi)在函數(shù)模板庫中的函數(shù)模板匹配完畢。[0024]所述的基本塊語義匹配,是用來對比內(nèi)在函數(shù)模板中的基本塊和目標控制流圖中的待匹配基本塊之間語義是否一致的方法;基本塊的語義由基本塊的匯編指令序列表示,將基本塊的匯編指令操作碼序列作為語義匹配的標準;同時基本塊語義匹配滿足以下要求:內(nèi)在函數(shù)模板中的基本塊的匯編指令當前第1頁1 2 3 4 
當前第1頁1 2 3 4 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
花莲市| 丹东市| 巩义市| 阳曲县| 枣强县| 舟山市| 社旗县| 桐城市| 武宁县| 德保县| 台安县| 榆社县| 合阳县| 连江县| 盈江县| 安图县| 于田县| 东港市| 阜宁县| 开化县| 西和县| 凤山市| 桃源县| 隆安县| 昌都县| 潞城市| 永安市| 呼伦贝尔市| 永靖县| 三门峡市| 弥渡县| 隆尧县| 紫阳县| 石台县| 清原| 云和县| 察哈| 和田市| 孟村| 文登市| 天峨县|