專利名稱:一種嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法
技術(shù)領(lǐng)域:
本發(fā)明屬于逆向工程和程序分析領(lǐng)域,具體涉及一種識(shí)別嵌套循環(huán)結(jié)構(gòu)的方法,可用于 反編譯、軟件測(cè)試等設(shè)備中,能夠有效的將程序控制流圖結(jié)構(gòu)化。
技術(shù)背景反編譯是從可執(zhí)行文件獲得與源程序等效的高級(jí)代碼的技術(shù),是逆向工程領(lǐng)域的核心技 術(shù)之一,在不同的應(yīng)用領(lǐng)域發(fā)揮著重要的作用。最初,反編譯技術(shù)主要應(yīng)用于輔助程序移植, 如將程序從第二代計(jì)算機(jī)向第三代計(jì)算機(jī)遷移;到了70年代和80年代,反編譯技術(shù)開始被 用于再工程(Re-engineering),包括對(duì)遺失源碼或第三方的二進(jìn)制程序進(jìn)行理解、文檔化、 重構(gòu)和修改;從90年代中后期開始,信息安全領(lǐng)域?qū)Ψ淳幾g技術(shù)有了巨大的應(yīng)用需求,比如 挖掘軟件安全漏洞、分析惡意軟件等工作,都對(duì)反編譯技術(shù)有著很高的依賴??刂屏鞣治鍪欠淳幾g中的重要研究領(lǐng)域,復(fù)合條件分支識(shí)別、嵌套循環(huán)識(shí)別和多路分支 (switch)識(shí)別是其中最重要的三個(gè)控制結(jié)構(gòu)識(shí)別問題,也是反編譯自動(dòng)化的核心技術(shù)之一。 如果不能準(zhǔn)確識(shí)別這三種控制結(jié)構(gòu),會(huì)嚴(yán)重制約反編譯技術(shù)的發(fā)展,限制反編譯技術(shù)在其它 領(lǐng)域的應(yīng)用。本發(fā)明關(guān)注控制流分析中循環(huán)結(jié)構(gòu)的識(shí)別。循環(huán)是用來實(shí)現(xiàn)重復(fù)指令的控制結(jié)構(gòu)。在控制流圖中,循環(huán)經(jīng)常嵌套在其它循環(huán)內(nèi)部。 這種現(xiàn)象產(chǎn)生了被稱作"循環(huán)嵌套森林"的結(jié)構(gòu)。盡管現(xiàn)代的程序使用結(jié)構(gòu)化的編程方法, 但當(dāng)高級(jí)語言程序被編譯成了二進(jìn)制程序以后,其中的循環(huán)結(jié)構(gòu)常常因?yàn)閮?nèi)部的多層嵌套循 環(huán)的跳轉(zhuǎn)指令(例如break語句,continue語句和return語句等),其單入口的結(jié)構(gòu)化特性遭到 了破壞,不再符合結(jié)構(gòu)化原則,即其對(duì)應(yīng)的控制流圖是不可規(guī)約的。如圖1所示為一個(gè)典型 的不可規(guī)約循環(huán)的控制流圖。圖2為它所對(duì)應(yīng)的"循環(huán)嵌套森林"。嵌套循環(huán)的識(shí)別是結(jié)構(gòu)化程序設(shè)計(jì)語言中循環(huán)語句的編譯問題的逆命題。就是如何識(shí)別二進(jìn)制程序中的循環(huán)結(jié)構(gòu)的范圍以及它們之間的嵌套關(guān)系,從而使反編譯生成的高級(jí)語言程 序結(jié)構(gòu)仍然保持較好的結(jié)構(gòu)化特性。如果不能準(zhǔn)確識(shí)別循環(huán)結(jié)構(gòu)的范圍以及它們之間的嵌套 關(guān)系,則可能影響到反編譯最終生成的源程序的語意的準(zhǔn)確性以及結(jié)構(gòu)化特性。對(duì)循環(huán)識(shí)別的研究開始于1970年,RE. Allen和J. Cocke提出了控制圖的可歸約性(參 見F.E. Allen. Control flow analysis. S/Gi^4iViVoric" 5(7)1:19, 1970),此后編譯和反編譯領(lǐng)域 的工作都開始關(guān)注這個(gè)問題。1997年,P. Havlak在R.E. Tarjan(參見R.E. Tarjan, Testing flow graph reducibility, Co附戸f. 5W. 9, 1974)的基礎(chǔ)上提出了對(duì)常規(guī)控制流圖的近似線性時(shí)間的算法(參見R Havlak,Nesting of reducible and irreducible loops, ^CM 7h^wa"/ows iVograw/w/wgcmd 輛簡,Vol. 19, No.4, 1997)。兩年后G. Ramalingam提出了對(duì)Havlak算法的一個(gè)改進(jìn)算法(參見G. Ramalingam, Identifying loops in almost linear time, ^CM rrawsacriows /V0gn3附ffH'"g丄a"gwages awd 5^^7w, Vol.21, No.2, 1999),在最差情況下近似線性時(shí)間的算法(但是在常規(guī)情況下比Havlak 算法慢)。上述方法通?;趶?fù)雜的數(shù)據(jù)結(jié)構(gòu),例如Interval/DSG,或者UNION-FIND集合,對(duì)這些 數(shù)據(jù)集合的復(fù)雜操作使得這些算法的效率很低。本發(fā)明提出了一種在二進(jìn)制可執(zhí)行程序中識(shí)別循環(huán)的新方法,該方法只需要對(duì)控制流圖 進(jìn)行一次深度優(yōu)先搜索就可以準(zhǔn)確的處理不可歸約的控制流圖,并且不需要復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。 該方法已經(jīng)對(duì)Windows XP和linux下的多個(gè)典型的可執(zhí)行文件進(jìn)行了分析,實(shí)驗(yàn)表明該方法 近似線性時(shí)間,并且比Havlak的算法快2~5倍。 發(fā)明內(nèi)容本發(fā)明的目的在于提供一種循環(huán)識(shí)別的方法,能夠精確、高效、自動(dòng)化識(shí)別循環(huán)結(jié)構(gòu)。 為明確本發(fā)明的內(nèi)容及方便表述,下面給出循環(huán)及相關(guān)概念的適當(dāng)說明。(參見S.S. Muchnick, yWvanced Cpz7er Des/gw awe/ /mp/eOTewtoriow, Elsevier Science (USA), 1997. P. Havlak, Nesting of reducible and irreducible loops, JCM rra"sa"/ows iVogra附m/wg丄awgwages VoU9, No.4, 1997.)。控制流圖(CFG):描述程序的控制流信息的連通有向圖;通常用(N,E,h)表示,其中N是 程序中基本塊的集合,E是這些基本塊之間的有向邊,h是程序的入口。強(qiáng)連通域(SCR): ScN節(jié)點(diǎn)的非空集合;給定任意q,reS,存在從q到r的路徑和從r到 q的路徑。當(dāng)一個(gè)SCR不存在屬性為SCR的父集合時(shí),稱它為最大SCR。循環(huán)包括最外層循環(huán)和內(nèi)部循環(huán)。最外層循環(huán) 一個(gè)至少包含一條內(nèi)部邊的最大SCR。循環(huán)頭節(jié)點(diǎn)和循環(huán)體在深度優(yōu)先搜索中,訪問到的第一個(gè)循環(huán)節(jié)點(diǎn)稱作循環(huán)頭節(jié)點(diǎn),其余的節(jié)點(diǎn)稱為循環(huán)體。最大外層循環(huán)嵌套在循環(huán)L中并以h為頭節(jié)點(diǎn)的嵌套循環(huán)是在以(L-(h))為節(jié)點(diǎn)集合的子圖的最大外層循環(huán)。重入口和重入邊給定一個(gè)循環(huán)頭為h的循環(huán)L和一條邊〈q,r〉, qgL, reL- {h}, r稱 作這個(gè)循環(huán)的重入口, 〈q,r〉稱作重入邊。最內(nèi)層循環(huán)循環(huán)體內(nèi)的一個(gè)節(jié)點(diǎn)n,它的最內(nèi)層循環(huán)是包含n的最小循環(huán)。 最內(nèi)層循環(huán)頭n的最內(nèi)層循環(huán)的循環(huán)頭稱作n的最內(nèi)層循環(huán)頭。循環(huán)頭列表n的循環(huán)頭列表包含n的最內(nèi)層循環(huán)頭ln,lu的最內(nèi)層循環(huán)頭h2, h2的最內(nèi) 層循環(huán)頭h3,以此類推。本發(fā)明的一種嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其步驟包括1) 對(duì)可執(zhí)行文件進(jìn)行反匯編,得到該可執(zhí)行文件的中間代碼;2) 從上述中間代碼中提取控制流信息,得到控制流圖;3) 深度優(yōu)先遍歷控制流圖,得到循環(huán)結(jié)構(gòu)子圖,該循環(huán)結(jié)構(gòu)包括 3-1)循環(huán)頭節(jié)點(diǎn);3-2)循環(huán)體節(jié)點(diǎn),及其最內(nèi)層循環(huán)頭節(jié)點(diǎn); 3-3)重入口節(jié)點(diǎn),及其重入邊;4) 標(biāo)記上述節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn);5) 將上述循環(huán)結(jié)構(gòu)子圖識(shí)別為循環(huán)結(jié)構(gòu)。 識(shí)別循環(huán)頭節(jié)點(diǎn)的方法在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)沒有被遍歷,且處于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上,則該后繼節(jié)點(diǎn)為循環(huán)頭節(jié) 點(diǎn),將該后繼節(jié)點(diǎn)加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中。識(shí)別循環(huán)體節(jié)點(diǎn)的方法在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)沒有被遍歷過,則遍 歷該后繼節(jié)點(diǎn),如該后繼節(jié)點(diǎn)位于一循環(huán)體內(nèi),則當(dāng)前訪問節(jié)點(diǎn)為循環(huán)體節(jié)點(diǎn),將該后繼節(jié) 點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中?;?qū)τ诋?dāng)前訪問的節(jié)點(diǎn), 如其一后繼節(jié)點(diǎn)被遍歷過,且不處于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn) 的路徑上,但該后繼節(jié)點(diǎn)位于有最內(nèi)層循環(huán)頭節(jié)點(diǎn)位于深度優(yōu)先生成樹上從控制流圖入口節(jié) 點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上的循環(huán)體內(nèi),則該當(dāng)前訪問節(jié)點(diǎn)為循環(huán)體節(jié)點(diǎn),將該最內(nèi)層循環(huán) 頭節(jié)點(diǎn)加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中。識(shí)別重入口節(jié)點(diǎn)的方法在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)被遍歷過,且不處于 深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上,但該后繼節(jié)點(diǎn)位于無最內(nèi) 層循環(huán)頭節(jié)點(diǎn)位于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上的循環(huán)體 內(nèi),則該后繼節(jié)點(diǎn)為重入口節(jié)點(diǎn),從該當(dāng)前訪問節(jié)點(diǎn)到該后繼節(jié)點(diǎn)的有向邊為重入邊。標(biāo)記上述節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)的方法為對(duì)于當(dāng)前訪問的節(jié)點(diǎn)和需加入的循環(huán)頭節(jié)點(diǎn),將該循環(huán)頭節(jié)點(diǎn)和它的循環(huán)頭節(jié)點(diǎn)列表根據(jù)其在深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上的關(guān)系加入到當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中,將該列表中每節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)標(biāo)記為在該循環(huán)頭節(jié)點(diǎn)列表中與該節(jié)點(diǎn)同在一循環(huán)體內(nèi)且到達(dá)該節(jié)點(diǎn)的正向路徑最短的循環(huán)頭節(jié)點(diǎn)。上述節(jié)點(diǎn)為擴(kuò)展后的節(jié)點(diǎn),控制流圖為擴(kuò)展控制流圖。 在反匯編獲得的控制流圖基礎(chǔ)上,由如下方法獲得擴(kuò)展控制流圖1)對(duì)于控制流圖中任意兩個(gè)節(jié)點(diǎn)6、 c,如果點(diǎn)6、 c滿足(W-PrW(c)且W-S"cc(6),則將6和C合并為一個(gè)新的節(jié)點(diǎn)6',在程序控制流圖中代替6、 C;重復(fù)1)中合并、替代過程,直至程序控制流圖中任意兩個(gè)節(jié)點(diǎn)都不滿足1)中合并條件。本發(fā)明的效果在于可以有效判定循環(huán)結(jié)構(gòu),以及它們之間的嵌套關(guān)系,進(jìn)而達(dá)到有效 結(jié)構(gòu)化程序控制流圖的目的。 本發(fā)明有如下優(yōu)勢(shì)1. 本發(fā)明方法比P. Havlak的方法和G. Ramalingam的方法更加準(zhǔn)確,在循環(huán)結(jié)構(gòu)不是嚴(yán) 格的嵌套關(guān)系的時(shí)候也能識(shí)別循環(huán)結(jié)構(gòu)以及循環(huán)之間的嵌套關(guān)系,提高反編譯后程序的結(jié)構(gòu) 化程度;2. 本發(fā)明所述方法P. Havlak的方法和G. Ramalingam的方法提出的方法效率高,只需要 對(duì)程序進(jìn)行一次深度優(yōu)先遍歷就可以識(shí)別程序中的所有循環(huán),實(shí)驗(yàn)表明比P. Havlak的方法快 2~5倍;3. 本發(fā)明所述方法P. Havlak的方法和G. Ramalingam的方法易于實(shí)現(xiàn),不需要使用 Interval/DSG等復(fù)雜數(shù)據(jù)結(jié)構(gòu)以及多次迭代進(jìn)行輔助識(shí)別。本發(fā)明所述方法完全自動(dòng)化識(shí)別可執(zhí)行代碼中的循環(huán)結(jié)構(gòu)。該方法實(shí)現(xiàn)簡單,識(shí)別結(jié)果 準(zhǔn)確,而且方法復(fù)雜度低,識(shí)別效率高。
圖1是不可規(guī)約循環(huán)的控制圖示例。圖2是圖1中對(duì)應(yīng)的循環(huán)嵌套森林圖。圖3是識(shí)別循環(huán)結(jié)構(gòu)的整體流程圖。圖4是識(shí)別循環(huán)節(jié)點(diǎn)控制流圖。圖5是識(shí)別循環(huán)節(jié)點(diǎn)情況示意圖。圖6是標(biāo)記循環(huán)頭節(jié)點(diǎn)列表工作流程圖。圖7是標(biāo)記循環(huán)頭節(jié)點(diǎn)列表情況示意8是循環(huán)節(jié)點(diǎn)識(shí)別偽代碼。圖9是標(biāo)記循環(huán)頭節(jié)點(diǎn)列表偽代碼。
具體實(shí)施方式
本發(fā)明的循環(huán)的識(shí)別方法,其步驟可表述為1. 對(duì)可執(zhí)行文件進(jìn)行反匯編,得到該可執(zhí)行文件的中間代碼;2. 從上述中間代碼中提取控制流信息,得到控制流圖,進(jìn)一步獲得擴(kuò)展控制流圖 G=(N,E,h ): N是節(jié)點(diǎn)集合,E是邊的集合,h。是控制流圖入口節(jié)點(diǎn);3. 深度優(yōu)先遍歷擴(kuò)展控制流圖,識(shí)別循環(huán)節(jié)點(diǎn),具體包括對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行以下判斷1) 該節(jié)點(diǎn)是否為循環(huán)頭節(jié)點(diǎn);2) 該節(jié)點(diǎn)是否在循環(huán)體內(nèi),如果是則找到它的最內(nèi)層循環(huán)頭節(jié)點(diǎn);3) 該節(jié)點(diǎn)是否為重入口,如果是則找到重入邊。4. 標(biāo)記節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn);5. 將對(duì)應(yīng)的控制流圖識(shí)別為循環(huán)結(jié)構(gòu)。進(jìn)一步地,給定當(dāng)前訪問節(jié)點(diǎn)bo, p為在深度優(yōu)先生成樹上從ho到b()的當(dāng)前路徑。本發(fā)明可以采取以下方法,判斷節(jié)點(diǎn)的上述三個(gè)屬性1) 如果bo的某個(gè)后續(xù)節(jié)點(diǎn)b沒有被遍歷過并且b在p中,則b為循環(huán)頭節(jié)點(diǎn),將b加入到bo的循環(huán)頭節(jié)點(diǎn)列表中;2) 如果bo的某個(gè)后續(xù)節(jié)點(diǎn)b沒有被遍歷過,并且遍歷b后發(fā)現(xiàn)b在某個(gè)循環(huán)體中,則 bo在循環(huán)體內(nèi),并且將b的循環(huán)最內(nèi)層循環(huán)頭節(jié)點(diǎn)h加入到b的循環(huán)頭節(jié)點(diǎn)列表中; 或者b被遍歷過并且不在p中,但是在某個(gè)最內(nèi)層循環(huán)頭節(jié)點(diǎn)h在p中的循環(huán)體內(nèi), 則bo在循環(huán)體內(nèi),并將h加入到b的循環(huán)頭列表當(dāng)中。3) 如果bo的某個(gè)后續(xù)節(jié)點(diǎn)b被遍歷過并且不在p中,若b在一個(gè)最內(nèi)層循環(huán)頭h不在 當(dāng)前路徑的一個(gè)循環(huán)體中,則b為一個(gè)循環(huán)重入口, <^山>為一條重入邊。進(jìn)一步地,給定當(dāng)前訪問節(jié)點(diǎn)bc和需加入的循環(huán)頭節(jié)點(diǎn)h,使用如下方法將h加入到bo 的循環(huán)頭節(jié)點(diǎn)列表中,以實(shí)現(xiàn)標(biāo)記節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)-將h和它的循環(huán)頭節(jié)點(diǎn)列表根據(jù)它們?cè)趐中的關(guān)系加入到bo的循環(huán)頭節(jié)點(diǎn)中。將其間每 個(gè)節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)標(biāo)記為在新生成的列表中與該節(jié)點(diǎn)同在某個(gè)循環(huán)體內(nèi),并且到達(dá) 該節(jié)點(diǎn)的正向路徑最短的循環(huán)頭節(jié)點(diǎn)。下面結(jié)合附圖,更詳細(xì)地描述本發(fā)明的具體實(shí)施方式
。 參看圖3,識(shí)別循環(huán)結(jié)構(gòu)的整體流程為步驟l:利用各種反匯編工具,對(duì)可執(zhí)行文件反匯編處理,獲得中間代碼表示; 各種反匯編工具,如IDA Pro, Objdu即,可以自動(dòng)完成該過程;步驟2:在中間代碼基礎(chǔ)上,提取控制流信息,進(jìn)一步獲得擴(kuò)展控制流圖;步驟3:在擴(kuò)展控制流基礎(chǔ)上,進(jìn)行循環(huán)節(jié)點(diǎn)識(shí)別。 進(jìn)一步,參看圖4,進(jìn)行循環(huán)節(jié)點(diǎn)識(shí)別的具體流程為步驟l:深度優(yōu)先遍歷控制流圖。給定當(dāng)前節(jié)點(diǎn)bo, p為在深度優(yōu)先生成樹上從ho到b() 的當(dāng)前路徑。步驟2:對(duì)bo的每個(gè)后續(xù)b按以下順序進(jìn)行檢査1) b是一個(gè)新節(jié)點(diǎn),即b沒有被遍歷過,如圖5(A)所示。遍歷b,如果遍歷后發(fā)現(xiàn)b在 某個(gè)循環(huán)體內(nèi),將b的最內(nèi)層循環(huán)頭節(jié)點(diǎn)h加入到bo的循環(huán)頭節(jié)點(diǎn)中;2) b被遍歷過且b在p中,如圖5(B)所示。標(biāo)記b為循環(huán)頭,并且將b加入到bo的循環(huán) 頭節(jié)點(diǎn)列表當(dāng)中;3) b被遍歷過,b不在p中或者b不在某個(gè)循環(huán)體內(nèi),如圖5(C)所示。則不對(duì)b進(jìn)行處 理;4) b被遍歷過且b不在p中,并且b在一個(gè)最內(nèi)層循環(huán)頭h在p中的循環(huán)體中,如圖5(D)所示。將h加入到bo循環(huán)頭節(jié)點(diǎn)列表中;5) b被遍歷過且b不在p中,并且b在一個(gè)最內(nèi)層循環(huán)頭h不在p中的循環(huán)體中,如圖 5(E)所示。將b標(biāo)記為一個(gè)重入口,并且將〈bo,b〉標(biāo)記為一條重入邊。如果存在b在 p中的最內(nèi)層循環(huán)頭h2,將h2加入到bo的循環(huán)頭節(jié)點(diǎn)列表中。步驟3:將循環(huán)頭節(jié)點(diǎn)h加入節(jié)點(diǎn)b的循環(huán)頭節(jié)點(diǎn)列表中。進(jìn)一步,參看圖6,將循環(huán)頭節(jié)點(diǎn)h加入節(jié)點(diǎn)b的循環(huán)頭節(jié)點(diǎn)列表的具體流程為-1) 若b等于h或者h(yuǎn)為空,則返回;2) 令curl等于b, cur2等于h3) 當(dāng)curl屬于某個(gè)循環(huán)體,重復(fù)以下操作a) 令ih等于curl的最內(nèi)層循環(huán)頭節(jié)點(diǎn),如圖7所示,在第一次進(jìn)入循環(huán)時(shí)ih等于HI;b) 如果ih等于cur2,循環(huán)結(jié)束;c) 如果ih在路徑中的位置小于cur2在圖中的位置。令curl的最內(nèi)層循環(huán)頭節(jié)點(diǎn)為 cur2, curl等于cur2, cur2等于ih。如圖7所示,在算法第二次進(jìn)入循環(huán)時(shí),ih 等于H2,它在路徑中的位置小于當(dāng)前的cur2 (即h),因此令curl (即H1)的 最內(nèi)層循環(huán)頭節(jié)點(diǎn)為h, curl的值改變?yōu)閔, cur2的值改變?yōu)镠2。在圖7中表現(xiàn) 為刪除了從H1到H2的邊,增加了從Hl到h的邊。d) 否則,令curl等于ih。如圖7所示,當(dāng)算法第一次進(jìn)入循環(huán)時(shí),ih等于Hl,它在路徑中的位置大于當(dāng)前的ih (即h), curl的值改變?yōu)镠1。4)令curl在循環(huán)體中,curl的最內(nèi)層循環(huán)頭節(jié)點(diǎn)位cur2。在圖7中,循環(huán)結(jié)束時(shí)curl的當(dāng)前值為H2,則令H2在循環(huán)體中,H2的最內(nèi)層循環(huán)頭節(jié)點(diǎn)為cur2當(dāng)前的值即H3。在圖7中表現(xiàn)為增加了從H2到H3的邊。 在經(jīng)過以上的算法后,本發(fā)明可以有效判定循環(huán)結(jié)構(gòu)和它們的嵌套關(guān)系,有效結(jié)構(gòu)化程序控制流圖。本發(fā)明已在申請(qǐng)人研制的反編譯工具上應(yīng)用,取得了很好效果,實(shí)現(xiàn)了本發(fā)明的目的。
權(quán)利要求
1. 一種嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其步驟包括1)對(duì)可執(zhí)行文件進(jìn)行反匯編,得到該可執(zhí)行文件的中間代碼;2)從上述中間代碼中提取控制流信息,得到控制流圖;3)深度優(yōu)先遍歷控制流圖,得到循環(huán)結(jié)構(gòu)子圖,該循環(huán)結(jié)構(gòu)包括3-1)循環(huán)頭節(jié)點(diǎn);3-2)循環(huán)體節(jié)點(diǎn),及其最內(nèi)層循環(huán)頭節(jié)點(diǎn);3-3)重入口節(jié)點(diǎn),及其重入邊;4)標(biāo)記上述節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn);5)將上述循環(huán)結(jié)構(gòu)子圖識(shí)別循環(huán)結(jié)構(gòu)。
2. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)沒有被遍歷,且處于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑 上,則該后繼節(jié)點(diǎn)為循環(huán)頭節(jié)點(diǎn),將該后繼節(jié)點(diǎn)加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中。
3. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)沒有被遍歷過,則遍歷該后繼節(jié)點(diǎn),如該后繼節(jié)點(diǎn)位于一循環(huán)體內(nèi),則當(dāng)前訪問節(jié) 點(diǎn)為循環(huán)體節(jié)點(diǎn),將該后繼節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表 中。
4. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一后繼節(jié)點(diǎn)被遍歷過,且不處于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑 上,但該后繼節(jié)點(diǎn)位于有最內(nèi)層循環(huán)頭節(jié)點(diǎn)位于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng) 前訪問節(jié)點(diǎn)的路徑上的循環(huán)體內(nèi),則該當(dāng)前訪問節(jié)點(diǎn)為循環(huán)體節(jié)點(diǎn),將該最內(nèi)層循環(huán)頭節(jié)點(diǎn) 加入該當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中。
5. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn),如其一 后繼節(jié)點(diǎn)被遍歷過,且不處于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑 上,但該后繼節(jié)點(diǎn)位于無最內(nèi)層循環(huán)頭節(jié)點(diǎn)位于深度優(yōu)先生成樹上從控制流圖入口節(jié)點(diǎn)到當(dāng) 前訪問節(jié)點(diǎn)的路徑上的循環(huán)體內(nèi),則該后繼節(jié)點(diǎn)為重入口節(jié)點(diǎn),從該當(dāng)前訪問節(jié)點(diǎn)到該后繼 節(jié)點(diǎn)的有向邊為重入邊。
6. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)于當(dāng)前訪問的節(jié)點(diǎn)和需加入 的循環(huán)頭節(jié)點(diǎn),將該循環(huán)頭節(jié)點(diǎn)和它的循環(huán)頭節(jié)點(diǎn)列表根據(jù)其在深度優(yōu)先生成樹上從控制流 圖入口節(jié)點(diǎn)到當(dāng)前訪問節(jié)點(diǎn)的路徑上的關(guān)系加入到當(dāng)前訪問節(jié)點(diǎn)的循環(huán)頭節(jié)點(diǎn)列表中,將該 列表中每節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn)標(biāo)記為在該循環(huán)頭節(jié)點(diǎn)列表中與該節(jié)點(diǎn)同在一循環(huán)體內(nèi)且 到達(dá)該節(jié)點(diǎn)的正向路徑最短的循環(huán)頭節(jié)點(diǎn)。
7. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于所述節(jié)點(diǎn)為擴(kuò)展后的節(jié)點(diǎn)。
8. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)可執(zhí)行文件通過反匯編工具 IDAPro進(jìn)行反匯編。
9. 如權(quán)利要求1所述的嵌套循環(huán)結(jié)構(gòu)的識(shí)別方法,其特征在于對(duì)可執(zhí)行文件通過反匯編工具 Objdump進(jìn)行反匯編。
全文摘要
本發(fā)明屬于逆向工程和程序分析領(lǐng)域,具體涉及一種識(shí)別循環(huán)結(jié)構(gòu)的方法對(duì)可執(zhí)行文件進(jìn)行反匯編,得到該可執(zhí)行文件的中間代碼;從上述中間代碼中提取控制流信息,得到控制流圖;深度優(yōu)先遍歷控制流圖,識(shí)別循環(huán)節(jié)點(diǎn);標(biāo)記節(jié)點(diǎn)的最內(nèi)層循環(huán)頭節(jié)點(diǎn);將對(duì)應(yīng)的控制流圖識(shí)別為循環(huán)結(jié)構(gòu)。本發(fā)明可以有效判定循環(huán)結(jié)構(gòu),以及它們之間的嵌套關(guān)系,進(jìn)而有效結(jié)構(gòu)化程序控制流圖??捎糜诜淳幾g、軟件測(cè)試等設(shè)備中。
文檔編號(hào)G06F9/45GK101271397SQ20071009000
公開日2008年9月24日 申請(qǐng)日期2007年3月23日 優(yōu)先權(quán)日2007年3月23日
發(fā)明者李佳靜, 劍 毛, 偉 王, 王鐵磊, 維 鄒, 韜 韋 申請(qǐng)人:北京大學(xué)