国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng)的制作方法

      文檔序號:6374741閱讀:510來源:國知局
      專利名稱:一種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng)的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及反編譯技術(shù)領(lǐng)域,特別是涉及ー種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng)。
      背景技術(shù)
      反編譯技術(shù)作為計算機逆向技術(shù)中不可或缺的一部分,在分析系統(tǒng)漏洞、軟件安全以及病毒木馬等領(lǐng)域得到了廣泛應(yīng)用。反編譯技術(shù)可以將匯編語言)轉(zhuǎn)換為高級語言(如C語言)。在反編譯技術(shù)中,最重要、最困難的 部分是數(shù)據(jù)流分析。數(shù)據(jù)流分析是ー種用于收集計算機程序在不同點計算的值的信息的技木。具體的,可以使用程序控制流圖(CFG,control flow graph)來確定對變量的一次賦值可能傳播到程序中的哪些部分。在數(shù)據(jù)流分析中,主要包括寄存器的清除和條件碼的清除兩個階段。其中,現(xiàn)有的寄存器清除階段一般采用如下方法讓兩個語句相互映射,然后消去其中疊加的寄存器。這種方法會造成磁盤的頻繁讀寫,耗費了大量時間,執(zhí)行效率低。

      發(fā)明內(nèi)容
      為解決上述技術(shù)問題,本發(fā)明實施例提供一種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng),以解決現(xiàn)有寄存器清除方法執(zhí)行效率低的問題,技術(shù)方案如下一種反編譯數(shù)據(jù)流分析中的寄存器清除方法,包括打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句;對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則構(gòu)建ニ叉樹并將該函數(shù)語句輸入到所述ニ叉樹中;對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括ニ叉樹右孩子結(jié)束標識,如果是,則對構(gòu)建的ニ叉樹進行消元處理以去除所述ニ叉樹中的寄存器名稱,生成最簡ニ叉樹,根據(jù)所述最簡ニ叉樹生成高級語言的函數(shù)語句;否則,繼續(xù)判斷后續(xù)函數(shù)語句中是否包括寄存器名稱。優(yōu)選的,所述寄存器名稱為EAX、AX、BX、CX、DX、SP、SI、BP_DI。優(yōu)選的,所述打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句,包括打開寄存器清除之前匯編語言的代碼文件;根據(jù)所述代碼文件中的所有函數(shù)語句構(gòu)建單鏈表;遍歷所述單鏈表。優(yōu)選的,當所述寄存器名稱為EAX時,所述ニ叉樹右孩子結(jié)束標識為“eax ; ”。優(yōu)選的,所述構(gòu)建ニ叉樹并將該函數(shù)語句輸入到所述ニ叉樹中,包括構(gòu)建ニ叉樹;將該函數(shù)語句中等號左邊的代碼輸入到所述ニ叉樹中的左孩子中;
      將該函數(shù)語句中等號右邊的代碼輸入到所述ニ叉樹中的右孩子中。優(yōu)選的,所述進行消元處理以去除所述ニ叉樹中的寄存器名稱,生成最簡ニ叉樹,包括使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下ー層節(jié)點。一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng),包括讀取單元、寄存器名稱判斷單元、ニ叉樹構(gòu)建単元、結(jié)束標識判斷単元、消元単元和高級語言生成単元,所述讀取単元,用于打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句;所述寄存器名稱判斷単元,用于對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則觸發(fā)所述ニ叉樹構(gòu)建単元;所述ニ叉樹構(gòu)建単元,用于構(gòu)建ニ叉樹并將該函數(shù)語句輸入到所述ニ叉樹中;所述結(jié)束標識判斷単元,用于對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括ニ叉樹右孩子結(jié)束標識,如果是,則觸發(fā)所述消元単元;否則發(fā)送一判斷指令到所述寄存器名稱判斷単元,使所述寄存器名稱判斷単元繼續(xù)判斷后續(xù)函數(shù)語句中是否包括寄存器名稱;所述消元単元,用于對構(gòu)建的ニ叉樹進行消元處理以去除所述ニ叉樹中的寄存器名稱,生成最簡_■叉樹;所述高級語言生成単元,用于根據(jù)所述最簡ニ叉樹生成高級語言的函數(shù)語句。優(yōu)選的,所述讀取単元包括文件打開單元、單鏈表構(gòu)建子単元和單鏈表遍歷子單元,所述文件打開子單元,用于打開寄存器清除之前匯編語言的代碼文件;所述單鏈表構(gòu)建子単元,用于根據(jù)所述代碼文件中的所有函數(shù)語句構(gòu)建單鏈表;所述單鏈表遍歷子単元,用于遍歷所述單鏈表。優(yōu)選的,所述ニ叉樹構(gòu)建単元包括ニ叉樹構(gòu)建子単元、左孩子子単元和右孩子子單元,所述ニ叉樹構(gòu)建子單元,用于構(gòu)建ニ叉樹;所述左孩子子単元,用于將該函數(shù)語句中等號左邊的代碼輸入到所述ニ叉樹中的左孩子中;所述右孩子子単元,用于將該函數(shù)語句中等號右邊的代碼輸入到所述ニ叉樹中的右孩子中。優(yōu)選的,所述消元単元具體設(shè)置為使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下ー層節(jié)點。通過應(yīng)用以上技術(shù)方案,本發(fā)明提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng),可以一次讀取所有的函數(shù)語句,不用再多次進行讀寫。同吋,由于根據(jù)讀取的函數(shù)語句構(gòu)建了ニ叉樹并對ニ叉樹進行消元處理,因此可以很方便、快捷的得到不包含寄存器名稱的函數(shù)語句,執(zhí)行效率高。


      為了更清除地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明中記載的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖I為本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除方法的流程示意圖;圖2為本發(fā)明實施例提供的ー種匯編語言函數(shù)語句的示意圖;圖3為本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除方法的流
      程不意圖;圖4為本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除方法中單鏈表的不意圖;圖5為本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除方法的流程不意圖;圖6為本發(fā)明實施例提供的匯編語言語句的示意圖;圖7為本發(fā)明實施例提供的ニ叉樹的示意圖;圖8為本發(fā)明實施例提供的ニ叉樹的示意圖;圖9為本發(fā)明實施例提供的ニ叉樹的示意圖;圖10為本發(fā)明實施例提供的ニ叉樹的示意圖;圖11為本發(fā)明實施例提供的ニ叉樹的示意圖;圖12為本發(fā)明實施例提供的ニ叉樹的示意圖;圖13為本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)的結(jié)構(gòu)示意圖;圖14為本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)的結(jié)構(gòu)示意圖;圖15為本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)的結(jié)構(gòu)示意圖。
      具體實施例方式為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明中的技術(shù)方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清除、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當屬于本發(fā)明保護的范圍。如圖I所示,本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除方法,可以包括S101、打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句;其中,寄存器清除之前匯編語言的代碼文件被打開后可以如圖2所示。可以理解的是,匯編語言以“;”作為函數(shù)語句間的標識,每ー個“;”都代表著ー個函數(shù)語句的結(jié)束。本發(fā)明可以在ー個讀操作的前提下,將所述代碼文件中的函數(shù)語句全部讀取。S102、對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則執(zhí)行步驟S103 ;否則執(zhí)行步驟S107 ;所述寄存器名稱可以為EAX、AX、BX、CX、DX、SP、SI、BP或DI。需要說明的一點是,在匯編語言及高級語言中,EAX可以為小寫的“eax”。一般而言,在約翰 馮 諾依曼計算機體系結(jié)構(gòu)中,計算機寄存器主要包括AX、BX、CX、DX、SP、SI、BP、DI等。隨著低8位、高8位、16位、32位的不同,對寄存器的讀取以及名稱的叫法也有不同。在匯編代碼中,使用最多且具有迭代意義主要是AX中的EAX。例如堆棧寄存器的用處主要是恢復系統(tǒng)環(huán)境等。本發(fā)明在此并不限定寄存器的具體名稱。如圖2所示,在讀取代碼文件的函數(shù)語句后,會發(fā)現(xiàn)第一句(int a=l ;)中沒有寄存器名稱,這時,可以直接將該函數(shù)語句進行輸出處理,不用再進行寄存器清除。S103、構(gòu)建ニ叉樹并將該函數(shù)語句輸入到所述ニ叉樹中;在計算機科學中,ニ叉樹是每個結(jié)點最多有兩個子樹的有序樹。通常子樹的根被稱作左子樹(left subtree)和右子樹(right subtree)。姆個節(jié)點的兩個子節(jié)點分別被稱為左孩子和右孩子。在實際應(yīng)用中,可以將包括寄存器名稱的函數(shù)語句中等號左邊的代碼輸入到ニ叉樹中的左孩子中,將包括寄存器名稱的函數(shù)語句中等號右邊的代碼輸入到ニ叉樹中的右孩子中。由于讀取的函數(shù)語句為多個,可以按照函數(shù)語句的順序依次構(gòu)建。如,將第一個包含寄存器名稱的函數(shù)語句構(gòu)造為高度為2的ニ叉樹,將等號左右邊的代碼分別輸入該ニ叉樹的左孩子和右孩子中。將第二個包含寄存器名稱的函數(shù)語句中等號左邊的代碼輸入上一左孩子的左孩子中,將等號右邊的代碼輸入上一左孩子的右孩子中。按照以上規(guī)律,依次對剰余的函數(shù)語句進行處理,直到函數(shù)語句中出現(xiàn)ニ叉樹右孩子結(jié)束標識為止。S104、對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括ニ叉樹右孩子結(jié)束標識,如果是,則執(zhí)行步驟S105,否則,繼續(xù)執(zhí)行步驟S102 ;由于并不確定哪ー個函數(shù)語句中存在ニ叉樹右孩子結(jié)束標識,因此可以在步驟S103后,進ー步依次判斷包含有寄存器名稱的函數(shù)語句中是否包括有ニ叉樹右孩子結(jié)束標識。其中,ニ叉樹右孩子結(jié)束標識可以為“寄存器名稱;”,如“eax ; ”或“BX ; ”等。當寄存器名稱為eax吋,ニ叉樹右孩子結(jié)束標識為“eax ; ”。S105、對構(gòu)建的ニ叉樹進行消元處理以去除所述ニ叉樹中的寄存器名稱,生成最簡ニ叉樹;具體的,可以使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下ー層節(jié)點。S106、根據(jù)所述最簡ニ叉樹生成高級語言的函數(shù)語句;在實際應(yīng)用中,可以將最簡ニ叉樹左孩子中的代碼放于等號左邊,將最簡ニ叉樹右孩子中的代碼放于等號右邊,并和等號一起,形成高級語言的函數(shù)語句。S107、進行輸出處理。
      本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除方法,可以一次讀取所有的函數(shù)語句,不用再多次進行讀寫。同吋,由于根據(jù)讀取的函數(shù)語句構(gòu)建了ニ叉樹并對ニ叉樹進行消元處理,因此可以很方便、快捷的得到不包含寄存器名稱的函數(shù)語句,執(zhí)行效率高。如圖3所示,在本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除方法中,圖I所示實施例中的步驟SlOl可以包括SlOla、打開寄存器清除之前匯編語言的代碼文件;SlOlb、根據(jù)所述代碼文件中的所有函 數(shù)語句構(gòu)建單鏈表;單鏈表可以用ー組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。它以元素(數(shù)據(jù)元素的映象)加指針(指示后繼元素存儲位置)來表示結(jié)點。與直接讀取代碼文件中的函數(shù)語句相比,使用單鏈表可以隨意改變讀取順序,更為方便。SlOlc、遍歷所述單鏈表。對于圖2中的第一個函數(shù)語句“int a=l ; ”,可以構(gòu)建如圖4所示的單鏈表,其中,單鏈表中每個字符占用ー個節(jié)點,“i”為頭結(jié)點,指針指向頭結(jié)點“i”,該單鏈表中包括一首節(jié)點。指針可以遍歷單鏈表,同時進行字符匹配操作。如果在指針遇到“;”之前,都未遇到eax,則輸出所遍歷的代碼。在圖4中顯示為遍歷了“ int a=l;”,則將“int a=l;”輸出而不進行寄存器刪除處理。如圖5所示,本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除方法中,圖I所示實施例中的步驟S103可以包括S103a、構(gòu)建ニ叉樹;S103b、將該函數(shù)語句中等號左邊的代碼輸入到所述ニ叉樹中的左孩子中;S103c、將該函數(shù)語句中等號右邊的代碼輸入到所述ニ叉樹中的右孩子中。如圖6所示,以圖2所示的部分函數(shù)語句為例進行說明由于第一句函數(shù)語句“int a=l;”中并不包括寄存器名稱,因此直接進行輸出處理。然后判斷第二句,由于第二句中包含寄存器名稱“eax”,因此將等號左邊的代碼“eax”輸入ニ叉樹的左孩子(節(jié)點B)中,將右邊的代碼“int a”輸入ニ叉樹的右孩子(節(jié)點C)中,其中,該ニ叉樹的根節(jié)點為節(jié)點A。形成如圖7所示的ニ叉樹,該ニ叉樹的高度為2。按照順序繼續(xù)對下一函數(shù)語句進行判斷,第三句中包含“eax”,同理,將“eax”放入B節(jié)點的左孩子(節(jié)點D)中,將“eax+int a”放入B節(jié)點的右孩子(節(jié)點E)中,形成如圖8所示的ニ叉樹,該ニ叉樹的高度為3。按照上述方法繼續(xù)對ニ叉樹進行構(gòu)建,并最終構(gòu)建形成如圖9所示的ニ叉樹,該ニ叉樹的高度為5。由于圖6所示的函數(shù)語句中的最后一句中包括有ニ叉樹右孩子結(jié)束標識“eax; ”,因此在處理完這句函數(shù)語句后,該ニ叉樹就創(chuàng)建完畢。后續(xù)函數(shù)語句將形成新的ニ叉樹。在創(chuàng)建完ニ叉樹后,需要對其進行消元處理,以去除ニ叉樹中的寄存器名稱。優(yōu)選的,圖I所示實施例中的步驟S 105可以包括使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除頂層根節(jié)點下ー層節(jié)點。下面以圖9所示的已經(jīng)創(chuàng)建好的ニ叉樹為例進行說明
      首先,從圖9所示ニ叉樹的頂層根節(jié)點(節(jié)點A)開始,將節(jié)點A的右孩子(節(jié)點C)中的代碼替換下ー層的右孩子(節(jié)點E)中的寄存器名稱“eax”并刪除該層的節(jié)點B和節(jié)點C,形成如圖10所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點D,右孩子變?yōu)楣?jié)點E。然后,將圖10所示ニ叉樹中的頂層根節(jié)點的右孩子(節(jié)點E)中的代碼替換下ー層右孩子(節(jié)點G)中的寄存器名稱,并刪除節(jié)點D和節(jié)點E,形成如圖11所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點F,右孩子變?yōu)楣?jié)點G。最后,將圖11所示ニ叉樹中的頂層根節(jié)點的右孩子(節(jié)點G)中的代碼替換下ー層右孩子(節(jié)點I)中的寄存器名稱,并刪除節(jié)點F和節(jié)點G,形成如圖12所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點H,右孩子變?yōu)楣?jié)點I。由于此時ニ叉樹的高度已經(jīng)為2,已經(jīng)是最簡ニ叉樹,因此不用再進行消元處理。這時,可以執(zhí)行步驟S106,根據(jù)圖12所示的最簡ニ叉樹,將最簡ニ叉樹的左孩子作為所要輸出函數(shù)等號左邊的代碼,將最簡ニ叉樹的右孩子作為所要輸出的函數(shù)等號右邊的代碼,并最終得到所要輸出的高級語言函數(shù)語句為“int al=int a+int a+int a ; ”。可以看到,該高級語言函數(shù)語句中并不包含寄存器名稱,本發(fā)明已經(jīng)成功的將其去除。與本發(fā)明提供的方法實施例相對應(yīng),本發(fā)明還提供了一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)。如圖13所示,本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng),可以包括讀取單元100、寄存器名稱判斷単元200、ニ叉樹構(gòu)建単元300、結(jié)束標識判斷單元400、消元單元500和高級語言生成單元600,所述讀取単元100,用于打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句;其中,寄存器清除之前匯編語言的代碼文件被打開后可以如圖2所示。可以理解的是,匯編語言以“;”作為函數(shù)語句間的標識,每ー個“;”都代表著ー個函數(shù)語句的結(jié)束。本發(fā)明可以在ー個讀操作的前提下,將所述代碼文件中的函數(shù)語句全部讀取。所述寄存器名稱判斷単元200,用于對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則觸發(fā)所述ニ叉樹構(gòu)建単元300 ;所述寄存器名稱可以為EAX、AX、BX、CX、DX、SP、SI、BP或DI。需要說明的一點是,在匯編語言及高級語言中,EAX可以為小寫的“eax”一般而言,在約翰 馮 諾依曼計算機體系結(jié)構(gòu)中,計算機寄存器主要包括AX、BX、CX、DX、SP、SI、BP、DI等。隨著低8位、高8位、16位、32位的不同,對寄存器的讀取以及名稱的叫法也有不同。在匯編代碼中,使用最多且具有迭代意義主要是AX中的EAX。例如堆棧寄存器的用處主要是恢復系統(tǒng)環(huán)境等。本發(fā)明在此并不限定寄存器的具體名稱。如圖2所示,在讀取代碼文件的函數(shù)語句后,會發(fā)現(xiàn)第一句(int a=l ;)中沒有寄存器名稱,這時,可以直接將該函數(shù)語句進行輸出處理,不用再進行寄存器清除。所述ニ叉樹構(gòu)建単元300,用于構(gòu)建ニ叉樹并將該函數(shù)語句輸入到所述ニ叉樹中;在計算機科學中,ニ叉樹是每個結(jié)點最多有兩個子樹的有序樹。通常子樹的根被稱作左子樹(left subtree)和右子樹(right subtree)。姆個節(jié)點的兩個子節(jié)點分別被稱為左孩子和右孩子。
      在實際應(yīng)用中,可以將包括寄存器名稱的函數(shù)語句中等號左邊的代碼輸入到ニ叉樹中的左孩子中,將包括寄存器名稱的函數(shù)語句中等號右邊的代碼輸入到ニ叉樹中的右孩子中。由于讀取的函數(shù)語句為多個,可以按照函數(shù)語句的順序依次構(gòu)建。如,將第一個包含寄存器名稱的函數(shù)語句構(gòu)造為高度為2的ニ叉樹,將等號左右邊的代碼分別輸入該ニ叉樹的左孩子和右孩子中。將第二個包含寄存器名稱的函數(shù)語句中等號左邊的代碼輸入上一左孩子的左孩子中,將等號右邊的代碼輸入上一左孩子的右孩子中。按照以上規(guī)律,依次對剰余的函數(shù)語句進行處理,直到函數(shù)語句中出現(xiàn)ニ叉樹右孩子結(jié)束標識為止。所述結(jié)束標識判斷単元400,用于對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括ニ叉樹右孩子結(jié)束標識,如果是,則觸發(fā)所述消元単元500 ;否則發(fā)送一判斷指令到所述寄存器名稱判斷単元200,使所述寄存器名稱判斷単元200繼續(xù)
      判斷后續(xù)函數(shù)語句中是否包括寄存器名稱;其中,ニ叉樹右孩子結(jié)束標識可以為“寄存器名稱;”,如“eax; ”或“BX;,,等。當寄存器名稱為eax吋,ニ叉樹右孩子結(jié)束標識為“eax ; ”。所述消元単元500,用于對構(gòu)建的ニ叉樹進行消元處理以去除所述ニ叉樹中的寄存器名稱,生成最簡ニ叉樹;具體的,可以使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下ー層節(jié)點。所述高級語言生成単元600,用于根據(jù)所述最簡ニ叉樹生成高級語言的函數(shù)語句。在實際應(yīng)用中,可以將最簡ニ叉樹左孩子中的代碼放于等號左邊,將最簡ニ叉樹右孩子中的代碼放于等號右邊,并和等號一起,形成高級語言的函數(shù)語句??梢岳斫獾氖?,在生成高級語言函數(shù)語句后就可以對其進行輸出處理。本發(fā)明實施例提供的一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng),可以一次讀取所有的函數(shù)語句,不用再多次進行讀寫。同吋,由于根據(jù)讀取的函數(shù)語句構(gòu)建了ニ叉樹并對ニ叉樹進行消元處理,因此可以很方便、快捷的得到不包含寄存器名稱的函數(shù)語句,執(zhí)行效率高。如圖14所示,本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)中,所述讀取単元100可以包括文件打開單元110、單鏈表構(gòu)建子単元120和單鏈表遍歷子單元130,所述文件打開子單元110,用于打開寄存器清除之前匯編語言的代碼文件;所述單鏈表構(gòu)建子単元120,用于根據(jù)所述代碼文件中的所有函數(shù)語句構(gòu)建單鏈表;單鏈表可以用ー組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。它以元素(數(shù)據(jù)元素的映象)加指針(指示后繼元素存儲位置)來表示結(jié)點。與直接讀取代碼文件中的函數(shù)語句相比,使用單鏈表可以隨意改變讀取順序,更為方便。所述單鏈表遍歷子単元130,用于遍歷所述單鏈表。對于圖2中的第一個函數(shù)語句“int a=l ; ”,可以構(gòu)建如圖4所示的單鏈表,其中,單鏈表中每個字符占用ー個節(jié)點,“i”為頭結(jié)點,指針指向頭結(jié)點“i”,該單鏈表中包括一首節(jié)點。指針可以遍歷單鏈表,同時進行字符匹配操作。如果在指針遇到“;”之前,都未遇到eax,則輸出所遍歷的代碼。在圖4中顯示為遍歷了“ int a=l;”,則將“int a=l;”輸出而不進行寄存器刪除處理。如圖15所示,本發(fā)明實施例提供的另ー種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng)中,所述ニ叉樹構(gòu)建単元300可以包括ニ叉樹構(gòu)建子単元310、左孩子子単元320和右孩子子単元330,所述ニ叉樹構(gòu)建子單元310,用于構(gòu)建ニ叉樹;所述左孩子子単元320,用于將該函數(shù)語句中等號左邊的代碼輸入到所述ニ叉樹中的左孩子中;所述右孩子子単元330,用于將該函數(shù)語句中等號右邊的代碼輸入到所述ニ叉樹
      中的右孩子中。如圖6所示,以圖2所示的部分函數(shù)語句為例進行說明由于第一句函數(shù)語句“int a=l;”中并不包括寄存器名稱,因此直接進行輸出處理。然后判斷第二句,由于第二句中包含寄存器名稱“eax”,因此將等號左邊的代碼“eax”輸入ニ叉樹的左孩子(節(jié)點B)中,將右邊的代碼“int a”輸入ニ叉樹的右孩子(節(jié)點C)中,其中,該ニ叉樹的根節(jié)點為節(jié)點A。形成如圖7所示的ニ叉樹,該ニ叉樹的高度為2。按照順序繼續(xù)對下一函數(shù)語句進行判斷,第三句中包含“ eax”,同理,將“eax”放入B節(jié)點的左孩子(節(jié)點D)中,將“eax+int a”放入B節(jié)點的右孩子(節(jié)點E)中,形成如圖8所示的ニ叉樹,該ニ叉樹的高度為3。按照上述方法繼續(xù)對ニ叉樹進行構(gòu)建,并最終構(gòu)建形成如圖9所示的ニ叉樹,該ニ叉樹的高度為5。由于圖6所示的函數(shù)語句中的最后一句中包括有ニ叉樹右孩子結(jié)束標識“eax; ”,因此在處理完這句函數(shù)語句后,該ニ叉樹就創(chuàng)建完畢。后續(xù)函數(shù)語句將形成新的ニ叉樹。在創(chuàng)建完ニ叉樹后,需要對其進行消元處理,以去除ニ叉樹中的寄存器名稱。優(yōu)選的,消元単元500可以具體設(shè)置為使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下ー層節(jié)點。下面以圖9所示的已經(jīng)創(chuàng)建好的ニ叉樹為例進行說明首先,從圖9所示ニ叉樹的頂層根節(jié)點(節(jié)點A)開始,將節(jié)點A的右孩子(節(jié)點C)中的代碼替換下ー層的右孩子(節(jié)點E)中的寄存器名稱“eax”并刪除該層的節(jié)點B和節(jié)點C,形成如圖10所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點D,右孩子變?yōu)楣?jié)點E。然后,將圖10所示ニ叉樹中的頂層根節(jié)點的右孩子(節(jié)點E)中的代碼替換下ー層右孩子(節(jié)點G)中的寄存器名稱,并刪除節(jié)點D和節(jié)點E,形成如圖11所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點F,右孩子變?yōu)楣?jié)點G。最后,將圖11所示ニ叉樹中的頂層根節(jié)點的右孩子(節(jié)點G)中的代碼替換下ー層右孩子(節(jié)點I)中的寄存器名稱,并刪除節(jié)點F和節(jié)點G,形成如圖12所示的ニ叉樹。此時,頂層根節(jié)點的左孩子變?yōu)楣?jié)點H,右孩子變?yōu)楣?jié)點I。由于此時ニ叉樹的高度已經(jīng)為2,已經(jīng)是最簡ニ叉樹,因此不用再進行消元處理。這時,可以觸發(fā)高級語言生成単元600,根據(jù)圖12所示的最簡ニ叉樹,將最簡ニ叉樹的左孩子作為所要輸出函數(shù)等號左邊的代碼,將最簡ニ叉樹的右孩子作為所要輸出的函數(shù)等號右邊的代碼,并最終得到所要輸出的高級語言函數(shù)語句為“int al=int a+inta+int a;”??梢钥吹剑摳呒壵Z言函數(shù)語句中并不包含寄存器名稱,本發(fā)明已經(jīng)成功的將其去除。為了描述的方便,描述以上裝置時以功能分為各種単元分別描述。當然,在實施本發(fā)明時可以把各單元的功能在同一個或多個軟件和/或硬件中實現(xiàn)。通過以上的實施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清除地了解到本發(fā)明可借助軟件加必需的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如R0M/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行 本發(fā)明各個實施例或者實施例的某些部分所述的方法。本說明書中的各個實施例均采用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述得比較簡單,相關(guān)之處參見方法實施例的部分說明即可。以上所描述的系統(tǒng)實施例僅僅是示意性的,其中所述作為分離部件說明的単元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理単元,即可以位于ー個地方,或者也可以分布到多個網(wǎng)絡(luò)単元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。本發(fā)明可用于眾多通用或?qū)S玫挠嬎阆到y(tǒng)環(huán)境或配置中。例如個人計算機、服務(wù)器計算機、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費電子設(shè)備、網(wǎng)絡(luò)PC、小型計算機、大型計算機、包括以上任何系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。本發(fā)明可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實踐本發(fā)明,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠程計算機存儲介質(zhì)中。需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將ー個實體或者操作與另ー個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。以上所述僅是本發(fā)明的具體實施方式
      ,應(yīng)當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。
      權(quán)利要求
      1.一種反編譯數(shù)據(jù)流分析中的寄存器清除方法,其特征在于,包括 打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句;對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則構(gòu)建二叉樹并將該函數(shù)語句輸入到所述二叉樹中; 對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括二叉樹右孩子結(jié)束標識,如果是,則對構(gòu)建的二叉樹進行消元處理以去除所述二叉樹中的寄存器名稱,生成最簡二叉樹,根據(jù)所述最簡二叉樹生成高級語言的函數(shù)語句;否則,繼續(xù)判斷后續(xù)函數(shù)語句中是否包括寄存器名稱。
      2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述寄存器名稱為EAX、AX、BX、CX、DX、SP、SI、BP*DI。
      3.根據(jù)權(quán)利要求I或2所述的方法,其特征在于,所述打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句,包括 打開寄存器清除之前匯編語言的代碼文件; 根據(jù)所述代碼文件中的所有函數(shù)語句構(gòu)建單鏈表; 遍歷所述單鏈表。
      4.根據(jù)權(quán)利要求I所述的方法,其特征在于,當所述寄存器名稱為EAX時,所述二叉樹右孩子結(jié)束標識為“eax; ”。
      5.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述構(gòu)建二叉樹并將該函數(shù)語句輸入到所述二叉樹中,包括 構(gòu)建二叉樹; 將該函數(shù)語句中等號左邊的代碼輸入到所述二叉樹中的左孩子中; 將該函數(shù)語句中等號右邊的代碼輸入到所述二叉樹中的右孩子中。
      6.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述進行消元處理以去除所述二叉樹中的寄存器名稱,生成最簡二叉樹,包括 使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下一層節(jié)點。
      7.一種反編譯數(shù)據(jù)流分析中的寄存器清除系統(tǒng),其特征在于,包括讀取單元、寄存器名稱判斷單元、二叉樹構(gòu)建單元、結(jié)束標識判斷單元、消元單元和高級語言生成單元, 所述讀取單元,用于打開寄存器清除之前匯編語言的代碼文件并讀取所述代碼文件中的所有函數(shù)語句; 所述寄存器名稱判斷單元,用于對所讀取的函數(shù)語句依次進行判斷,判斷函數(shù)語句中是否包括寄存器名稱,如果是,則觸發(fā)所述二叉樹構(gòu)建單元; 所述二叉樹構(gòu)建單元,用于構(gòu)建二叉樹并將該函數(shù)語句輸入到所述二叉樹中; 所述結(jié)束標識判斷單元,用于對包含有寄存器名稱的函數(shù)語句依次進行判斷,判斷該函數(shù)語句中是否包括二叉樹右孩子結(jié)束標識,如果是,則觸發(fā)所述消元單元;否則發(fā)送一判斷指令到所述寄存器名稱判斷單元,使所述寄存器名稱判斷單元繼續(xù)判斷后續(xù)函數(shù)語句中是否包括寄存器名稱; 所述消元單元,用于對構(gòu)建的二叉樹進行消元處理以去除所述二叉樹中的寄存器名稱,生成最簡_■叉樹;所述高級語言生成單元,用于根據(jù)所述最簡二叉樹生成高級語言的函數(shù)語句。
      8.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述讀取單元包括文件打開單元、單鏈表構(gòu)建子單元和單鏈表遍歷子單元, 所述文件打開子單元,用于打開寄存器清除之前匯編語言的代碼文件; 所述單鏈表構(gòu)建子單元,用于根據(jù)所述代碼文件中的所有函數(shù)語句構(gòu)建單鏈表; 所述單鏈表遍歷子單元,用于遍歷所述單鏈表。
      9.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述二叉樹構(gòu)建單元包括二叉樹構(gòu)建子單元、左孩子子單元和右孩子子單元, 所述二叉樹構(gòu)建子單元,用于構(gòu)建二叉樹; 所述左孩子子單元,用于將該函數(shù)語句中等號左邊的代碼輸入到所述二叉樹中的左孩子中; 所述右孩子子單元,用于將該函數(shù)語句中等號右邊的代碼輸入到所述二叉樹中的右孩子中。
      10.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于,所述消元單元具體設(shè)置為 使用頂層根節(jié)點的右孩子中的代碼替換頂層根節(jié)點下一層節(jié)點的右孩子中的寄存器名稱并刪除所述頂層根節(jié)點的下一層節(jié)點。
      全文摘要
      本發(fā)明公開了一種反編譯數(shù)據(jù)流分析中的寄存器清除方法及系統(tǒng),可以讀取代碼文件中的所有函數(shù)語句并對所讀取的函數(shù)語句依次進行判斷,當函數(shù)語句中包括寄存器名稱時,構(gòu)建二叉樹并將該函數(shù)語句輸入到所述二叉樹中;進一步對包含有寄存器名稱的函數(shù)語句依次進行判斷,當該函數(shù)語句中包括二叉樹右孩子結(jié)束標識時,對構(gòu)建的二叉樹進行消元處理以去除所述二叉樹中的寄存器名稱,生成最簡二叉樹,根據(jù)所述最簡二叉樹生成高級語言的函數(shù)語句。由于可以一次將所有語句進行讀取,因此本發(fā)明不用再多次進行讀寫。同時,由于根據(jù)讀取的函數(shù)語句構(gòu)建了二叉樹并對二叉樹進行消元處理,因此可以很方便、快捷的得到不包含寄存器名稱的函數(shù)語句,執(zhí)行效率高。
      文檔編號G06F17/30GK102855139SQ201210283230
      公開日2013年1月2日 申請日期2012年8月10日 優(yōu)先權(quán)日2012年8月10日
      發(fā)明者姚力, 李少騰, 樓軼, 胡瑛俊, 吳幸, 陸春光, 劉金碩, 鄭穩(wěn) 申請人:浙江省電力公司電力科學研究院
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1