一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)的制作方法
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng),可以自動(dòng)地識(shí)別目標(biāo)代碼文件封裝格式,區(qū)分目標(biāo)代碼文件代碼段,并使用反匯編技術(shù)進(jìn)行分析并生成相應(yīng)的程序模型,又在前一個(gè)程序模型基礎(chǔ)上,再次進(jìn)行分析并生成新的程序模型,不斷重復(fù)以上過(guò)程,逐步精化,最終生成.ASM可再匯編文件。采用本發(fā)明,可以對(duì)自混淆的、含有指令重疊的目標(biāo)代碼文件進(jìn)行準(zhǔn)確而有效的逆向工程,可以應(yīng)用于含有自混淆指令,指令重疊等加殼惡意軟件的分析與識(shí)別以及防反匯編閉源軟件的分析。
【專(zhuān)利說(shuō)明】
一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)。
【背景技術(shù)】
[0002]隨著軟件復(fù)雜度的提高,逆向工程越來(lái)越引起人們的重視,成為軟件工程領(lǐng)域的一個(gè)新興分支。使用目標(biāo)代碼逆向工程技術(shù)是為了在沒(méi)有源代碼的情況下,直接從已編譯的或被特殊處理的最終目標(biāo)程序出發(fā),應(yīng)用多種技術(shù)手段,復(fù)原程序行為語(yǔ)義信息,從而幫助了解程序的原理。分析惡意軟件、閉源軟件的漏洞、閉源軟件的互操作性、目標(biāo)程序與源程序的一致性、驗(yàn)證編譯器的性能和準(zhǔn)確性以及在調(diào)試過(guò)程中顯示匯編指令都是目標(biāo)代碼逆向工程技術(shù)的關(guān)鍵應(yīng)用場(chǎng)景。對(duì)目標(biāo)代碼進(jìn)行逆向工程,根據(jù)其逆向工程的結(jié)果分析病毒運(yùn)行機(jī)制、評(píng)估軟件質(zhì)量與推斷程序行為目的的需求越來(lái)越多。
[0003]傳統(tǒng)的目標(biāo)代碼逆向工程技術(shù)主要有線性掃描與遞歸下降兩種經(jīng)典基礎(chǔ)系統(tǒng)。線性掃描為反匯編程序假設(shè)可執(zhí)行的二進(jìn)制代碼包含了多個(gè)連續(xù)的二進(jìn)制代碼流,并且連續(xù)地對(duì)它進(jìn)行解碼。而被廣泛應(yīng)用的一款著名商業(yè)化的反匯編軟件IDA Pro則運(yùn)用了遞歸下降的系統(tǒng)。與線性掃描技術(shù)相比,遞歸下降技術(shù)試圖在每個(gè)控制轉(zhuǎn)移指令中確定更多可能的目標(biāo)地址。
[0004]通常,目標(biāo)代碼逆向工程模型是指可以用于表示目標(biāo)代碼中的指令操作和數(shù)據(jù)的綜合模型。在現(xiàn)有技術(shù)與工具體系下,一般采用結(jié)合反匯編代碼的控制流圖與一些表格(符號(hào)表、導(dǎo)入導(dǎo)出表等)的方式表示。然而,隨著編譯、防護(hù)與混淆技術(shù)的發(fā)展,以及一些特定編譯優(yōu)化技術(shù)的引入,傳統(tǒng)的逆向工程系統(tǒng)已經(jīng)無(wú)法正確地構(gòu)造出逆向模型。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的。
[0006]根據(jù)本發(fā)明的實(shí)施方式,公開(kāi)了一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng),所述系統(tǒng)具體包括:顯示單元、輸出提示單元、格式識(shí)別打印單元、采樣單元、體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元,所述顯示單元分別連接輸出提示單元、格式識(shí)別打印單元,所述格式識(shí)別打印單元還分別連接輸出提示單元和采樣單元,所述輸出提示單元還連接采樣單元,所述采樣單元依次連接體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元。
[0007]根據(jù)本發(fā)明的實(shí)施方式,所述顯示單元啟動(dòng)人機(jī)交互接口,向人機(jī)交互接口分別輸入待逆向工程的目標(biāo)代碼文件、程序模型存儲(chǔ)文件以及待生成的可再匯編代碼文件的存儲(chǔ)路徑。
[0008]根據(jù)本發(fā)明的實(shí)施方式,所述格式識(shí)別打印單元讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元。
[0009]根據(jù)本發(fā)明的實(shí)施方式,所述采樣單元根據(jù)輸出提示單元接收的不同的封裝格式,在不同的位置取出目標(biāo)代碼文件的起始地址,以及代碼段的長(zhǎng)度,定位代碼段的地址范圍。
[0010]根據(jù)本發(fā)明的實(shí)施方式,所述體系結(jié)構(gòu)確定單元識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息,根據(jù)不同的處理器體系結(jié)構(gòu),采用不同的反匯編處理引擎進(jìn)行后續(xù)的指令分析與反匯編代碼生成操作。
[0011]根據(jù)本發(fā)明的實(shí)施方式,所述模型存儲(chǔ)創(chuàng)建單元在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件。
[0012]根據(jù)本發(fā)明的實(shí)施方式,所述指令分析單元結(jié)合之前創(chuàng)建的程序模型存儲(chǔ)文件開(kāi)始逐條分析代碼段起始地址的機(jī)器指令,并將指令相關(guān)的信息寫(xiě)入到新創(chuàng)建的程序模型存儲(chǔ)文件中。
[0013]根據(jù)本發(fā)明的實(shí)施方式,所述比較單元,如果存在之前的程序模型存儲(chǔ)文件,則將新生成寫(xiě)入的程序模型存儲(chǔ)文件與前一輪所創(chuàng)建的程序模型存儲(chǔ)文件進(jìn)行比較,若兩個(gè)程序模型沒(méi)有差異,則表示程序模型已經(jīng)穩(wěn)定,則由所述反匯編單元結(jié)合最后一個(gè)程序模型存儲(chǔ)文件中存儲(chǔ)的信息,使用對(duì)應(yīng)處理器體系結(jié)構(gòu)的反匯編引擎,生成反匯編代碼,寫(xiě)入到最后的可再匯編代碼文件中。
[0014]本發(fā)明的優(yōu)點(diǎn)在于:基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng),從初始態(tài)空程序出發(fā),通過(guò)搜索代碼、求解間接跳轉(zhuǎn)與檢測(cè)自修改等一系列操作,逐步構(gòu)造程序演進(jìn)序列,可以對(duì)自混淆的、含有指令重疊的目標(biāo)代碼文件進(jìn)行準(zhǔn)確而有效的逆向工程,可以應(yīng)用于含有自混淆指令,指令重疊等加殼惡意軟件的分析與識(shí)別以及防反匯編閉源軟件的分析,具有有益的技術(shù)效果。
【附圖說(shuō)明】
[0015]通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
[0016]附圖1示出了根據(jù)本發(fā)明實(shí)施方式的基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)的結(jié)構(gòu)示意圖;
[0017]附圖2示出了根據(jù)本發(fā)明實(shí)施方式的基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)執(zhí)行過(guò)程示意圖。
【具體實(shí)施方式】
[0018]下面將參照附圖更詳細(xì)地描述本公開(kāi)的示例性實(shí)施方式。雖然附圖中顯示了本公開(kāi)的示例性實(shí)施方式,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開(kāi)而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了能夠更透徹地理解本公開(kāi),并且能夠?qū)⒈竟_(kāi)的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0019]根據(jù)本發(fā)明的實(shí)施方式,如附圖1所示,公開(kāi)了一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng),所述程序演進(jìn)模型即基于程序模型的演進(jìn)進(jìn)行逆向工程,所述系統(tǒng)具體包括:顯示單元、輸出提示單元、格式識(shí)別打印單元、采樣單元、體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元,所述顯示單元分別連接輸出提示單元、格式識(shí)別打印單元,所述格式識(shí)別打印單元還分別連接輸出提示單元和采樣單元,所述輸出提示單元還連接采樣單元,所述采樣單元依次連接體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元。
[0020]如附圖2所示,所述基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)運(yùn)行原理具體為:
[0021]所述顯示單元啟動(dòng)人機(jī)交互接口,向人機(jī)交互接口分別輸入待逆向工程的目標(biāo)代碼文件、程序模型存儲(chǔ)文件以及待生成的可再匯編代碼文件的存儲(chǔ)路徑;具體包括:?0022] 顯示單元首先啟動(dòng)第一人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入待逆向工程的目標(biāo)代碼文件路徑,將待分析的目標(biāo)代碼文件的路徑輸入到第一人機(jī)交互接口中,自動(dòng)判斷輸入的待分析文件路徑是否有效,如果是,則繼續(xù)后續(xù)操作;否則,輸出提示單元向用戶提示:輸入的待逆向工程目標(biāo)代碼文件路徑無(wú)效,需重新輸入;
[0023]然后,顯示單元啟動(dòng)第二人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入程序模型存儲(chǔ)文件的存儲(chǔ)目錄路徑,將程序模型存儲(chǔ)文件的存儲(chǔ)路徑輸入到第二人機(jī)交互接口中,判斷輸入的存儲(chǔ)路徑是否有效,如果是,則繼續(xù)后續(xù)操作;否則,輸出提示單元向用戶提示:輸入的程序模型存儲(chǔ)文件存儲(chǔ)目錄路徑無(wú)效,需重新輸入;
[0024]最后,顯示單元啟動(dòng)第三人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入待生成的反匯編代碼ASM文件路徑,將待生成的反匯編代碼ASM文件路徑輸入第三人機(jī)交互接口中,判斷輸入的反匯編代碼ASM文件的存儲(chǔ)路徑是否正確,如果是,則進(jìn)入格式識(shí)別打印操作;否貝IJ,輸出提示單元向用戶提示:輸入的反匯編代碼ASM文件路徑無(wú)效,需重新輸入。
[0025]所述格式識(shí)別打印單元讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元;具體包括:
[0026]讀取文件首部數(shù)十個(gè)字節(jié),匹配程序庫(kù)中的樣本,若匹配到相應(yīng)封裝格式的字節(jié)序列模式,則輸出提示單元打印目標(biāo)代碼文件的封裝格式;否則,輸出無(wú)法識(shí)別文件封裝,逆向工程結(jié)束。
[0027]所述采樣單元根據(jù)輸出提示單元接收的不同的封裝格式,在不同的位置取出目標(biāo)代碼文件的起始地址,以及代碼段的長(zhǎng)度,定位代碼段的地址范圍。
[0028]所述體系結(jié)構(gòu)確定單元識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息,即指令集類(lèi)型信息,根據(jù)不同的處理器體系結(jié)構(gòu),采用不同的反匯編處理引擎進(jìn)行后續(xù)的指令分析與反匯編代碼生成操作;具體包括:
[0029]體系結(jié)構(gòu)確定單元自動(dòng)識(shí)別目標(biāo)代碼文件中機(jī)器碼的體系結(jié)構(gòu),若能夠識(shí)別,則所述模型存儲(chǔ)創(chuàng)建單元在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件;否則,提示用戶自己選擇可選的處理器體系結(jié)構(gòu),選擇完成后,再由所述模型存儲(chǔ)創(chuàng)建單元在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件。
[0030]所述指令分析單元結(jié)合之前創(chuàng)建的程序模型存儲(chǔ)文件開(kāi)始逐條分析代碼段起始地址的機(jī)器指令,并將指令相關(guān)的信息寫(xiě)入到新創(chuàng)建的程序模型存儲(chǔ)文件中;具體包括:[0031 ]如果所述模型存儲(chǔ)創(chuàng)建單元?jiǎng)?chuàng)建的程序模型存儲(chǔ)文件為第一程序模型存儲(chǔ)文件,則直接從代碼段起始地址開(kāi)始逐條地分析機(jī)器指令;否則,從上一輪迭代所創(chuàng)建的程序模型存儲(chǔ)文件中的取出機(jī)器指令序列來(lái)進(jìn)行分析,在此過(guò)程中,根據(jù)機(jī)器指令的操作,對(duì)機(jī)器指令序列本身進(jìn)行修改,生成新的機(jī)器指令序列,即生成新的程序模型,分析結(jié)束后,將該程序模型寫(xiě)入到創(chuàng)建的程序模型存儲(chǔ)文件中;
[0032]寫(xiě)入程序模型存儲(chǔ)文件的信息包括:指令在文件的偏移地址,指令在內(nèi)存中的映射地址,指令內(nèi)容以及相應(yīng)的反匯編代碼;
[0033]在分析機(jī)器指令的過(guò)程中,若遇到跳轉(zhuǎn)指令,根據(jù)具體處理器體系結(jié)構(gòu)中的指令語(yǔ)義,演算跳轉(zhuǎn)指令與調(diào)用返回指令中的目標(biāo)指令地址,若能獲取跳轉(zhuǎn)目標(biāo)地址,如果該地址處的指令尚未分析,則跳轉(zhuǎn)至相應(yīng)地址的指令進(jìn)行后續(xù)分析;如果不能獲取跳轉(zhuǎn)目標(biāo)地址或者目標(biāo)地址處指令已經(jīng)經(jīng)過(guò)分析,則直接將指令的相關(guān)信息記錄到程序模型存儲(chǔ)文件中,并繼續(xù)向后分析指令,直至分析到最后一條指令。
[0034]所述比較單元,如果存在之前的程序模型存儲(chǔ)文件,則將新生成寫(xiě)入的程序模型存儲(chǔ)文件與前一輪所創(chuàng)建的程序模型存儲(chǔ)文件進(jìn)行比較,若兩個(gè)程序模型沒(méi)有差異,則表示程序模型已經(jīng)穩(wěn)定,則由所述反匯編單元結(jié)合最后一個(gè)程序模型存儲(chǔ)文件中存儲(chǔ)的信息,即迭代修改后穩(wěn)定的機(jī)器指令序列,使用對(duì)應(yīng)處理器體系結(jié)構(gòu)的反匯編引擎,生成反匯編代碼,寫(xiě)入到最后的可再匯編代碼文件中;否則,重新對(duì)進(jìn)行分析和修改操作,記錄程序模型到新的程序模型存儲(chǔ)文件之中。
[0035]本發(fā)明的基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng)的實(shí)現(xiàn)過(guò)程,可以看作是從初始態(tài)空程序PO出發(fā),通過(guò)搜索代碼、求解間接跳轉(zhuǎn)與檢測(cè)自修改等一系列操作,逐步構(gòu)造程序演進(jìn)序列PO…Pi"_Pj"_Pn的過(guò)程(0〈 = i〈 = j〈 = n)。實(shí)際上,程序Pn的演進(jìn)構(gòu)造是否可以達(dá)成,依賴于Pn-1的程序形態(tài)與演進(jìn)前的數(shù)據(jù)狀態(tài)。而這里,Pi與Pj或Pj與Pn將有可能是相同的,即程序通過(guò)一定的演進(jìn),存在回溯到演進(jìn)過(guò)程的某一歷史節(jié)點(diǎn)(但不保證數(shù)據(jù)狀態(tài)也可回溯)的可能性。
[0036]以上所述,僅為本發(fā)明較佳的【具體實(shí)施方式】,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。
【主權(quán)項(xiàng)】
1.一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程系統(tǒng),所述系統(tǒng)具體包括:顯示單元、輸出提示單元、格式識(shí)別打印單元、采樣單元、體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元,所述顯示單元分別連接輸出提示單元、格式識(shí)別打印單元,所述格式識(shí)別打印單元還分別連接輸出提示單元和采樣單元,所述輸出提示單元還連接采樣單元,所述采樣單元依次連接體系結(jié)構(gòu)確定單元、模型存儲(chǔ)創(chuàng)建單元、指令分析單元、比較單元以及反匯編單元。2.—種如權(quán)利要求1所述的系統(tǒng),所述顯示單元啟動(dòng)人機(jī)交互接口,向人機(jī)交互接口分別輸入待逆向工程的目標(biāo)代碼文件、程序模型存儲(chǔ)文件以及待生成的可再匯編代碼文件的存儲(chǔ)路徑。3.一種如權(quán)利要求2所述的系統(tǒng),所述格式識(shí)別打印單元讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元。4.一種如權(quán)利要求3所述的系統(tǒng),所述采樣單元根據(jù)輸出提示單元接收的不同的封裝格式,在不同的位置取出目標(biāo)代碼文件的起始地址,以及代碼段的長(zhǎng)度,定位代碼段的地址范圍。5.—種如權(quán)利要求4所述的系統(tǒng),所述體系結(jié)構(gòu)確定單元識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息,根據(jù)不同的處理器體系結(jié)構(gòu),采用不同的反匯編處理引擎進(jìn)行后續(xù)的指令分析與反匯編代碼生成操作。6.—種如權(quán)利要求5所述的系統(tǒng),所述模型存儲(chǔ)創(chuàng)建單元在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件。7.—種如權(quán)利要求6所述的系統(tǒng),所述指令分析單元結(jié)合之前創(chuàng)建的程序模型存儲(chǔ)文件開(kāi)始逐條分析代碼段起始地址的機(jī)器指令,并將指令相關(guān)的信息寫(xiě)入到新創(chuàng)建的程序模型存儲(chǔ)文件中。8.—種如權(quán)利要求7所述的系統(tǒng),所述比較單元,如果存在之前的程序模型存儲(chǔ)文件,則將新生成寫(xiě)入的程序模型存儲(chǔ)文件與前一輪所創(chuàng)建的程序模型存儲(chǔ)文件進(jìn)行比較,若兩個(gè)程序模型沒(méi)有差異,則表示程序模型已經(jīng)穩(wěn)定,則由所述反匯編單元結(jié)合最后一個(gè)程序模型存儲(chǔ)文件中存儲(chǔ)的信息,使用對(duì)應(yīng)處理器體系結(jié)構(gòu)的反匯編引擎,生成反匯編代碼,寫(xiě)入到最后的可再匯編代碼文件中。
【文檔編號(hào)】G06F9/44GK106055343SQ201610456941
【公開(kāi)日】2016年10月26日
【申請(qǐng)日】2016年6月22日
【發(fā)明人】史建琦, 熊家文, 黃滟鴻, 何積豐, 李昂, 方徽星
【申請(qǐng)人】華東師范大學(xué)