欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

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

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

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


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