本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,尤其涉及一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法。
背景技術(shù):
隨著軟件復(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)越多。
傳統(tǒng)的目標(biāo)代碼逆向工程技術(shù)主要有線性掃描與遞歸下降兩種經(jīng)典基礎(chǔ)方法。線性掃描為反匯編程序假設(shè)可執(zhí)行的二進(jìn)制代碼包含了多個(gè)連續(xù)的二進(jìn)制代碼流,并且連續(xù)地對(duì)它進(jìn)行解碼。而被廣泛應(yīng)用的一款著名商業(yè)化的反匯編軟件IDA Pro則運(yùn)用了遞歸下降的方法。與線性掃描技術(shù)相比,遞歸下降技術(shù)試圖在每個(gè)控制轉(zhuǎn)移指令中確定更多可能的目標(biāo)地址。
通常,目標(biāo)代碼逆向工程模型是指可以用于表示目標(biāo)代碼中的指令操作和數(shù)據(jù)的綜合模型。在現(xiàn)有技術(shù)與工具體系下,一般采用結(jié)合反匯編代碼的控制流圖與一些表格(符號(hào)表、導(dǎo)入導(dǎo)出表等)的方式表示。然而,隨著編譯、防護(hù)與混淆技術(shù)的發(fā)展,以及一些特定編譯優(yōu)化技術(shù)的引入,傳統(tǒng)的逆向工程方法已經(jīng)無(wú)法正確地構(gòu)造出逆向模型。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的。
根據(jù)本發(fā)明的實(shí)施方式,公開了一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法,包括以下步驟:
步驟A:?jiǎn)?dòng)人機(jī)交互接口,向人機(jī)交互接口分別輸入待逆向工程的目標(biāo)代碼文件、程序模型存儲(chǔ)文件以及待生成的可再匯編代碼文件的存儲(chǔ)路徑;
步驟B:讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元;
步驟C:根據(jù)輸出提示單元接收的不同的封裝格式,在不同的位置取出目標(biāo)代碼文件的起始地址,以及代碼段的長(zhǎng)度,定位代碼段的地址范圍;
步驟D:識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息;
步驟E:在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件;
步驟F:結(jié)合前一輪創(chuàng)建的程序模型存儲(chǔ)文件開始逐條分析代碼段起始地址的機(jī)器指令,并將指令相關(guān)的信息寫入到新創(chuàng)建的程序模型存儲(chǔ)文件中;
步驟G:如果存在前一輪的程序模型存儲(chǔ)文件,則將新生成寫入的程序模型存儲(chǔ)文件與前一輪所創(chuàng)建的程序模型存儲(chǔ)文件進(jìn)行比較,若兩個(gè)程序模型沒(méi)有差異,則表示程序模型已經(jīng)穩(wěn)定,則跳轉(zhuǎn)至步驟H;否則,回到步驟E,重新對(duì)進(jìn)行分析和修改操作,記錄程序模型到新的程序模型存儲(chǔ)文件之中。
步驟H:結(jié)合最后一個(gè)程序模型存儲(chǔ)文件中存儲(chǔ)的信息,即迭代修改后穩(wěn)定的機(jī)器指令序列,使用對(duì)應(yīng)處理器體系結(jié)構(gòu)的反匯編引擎,生成反匯編代碼,寫入到最后的可再匯編代碼文件中。
根據(jù)本發(fā)明的實(shí)施方式,所述步驟B的讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元具體包括:
步驟B1,讀取文件首部數(shù)十個(gè)字節(jié),匹配程序庫(kù)中的樣本,若匹配到相應(yīng)封裝格式的字節(jié)序列模式,則轉(zhuǎn)到步驟B2;否則,輸出:無(wú)法識(shí)別文件封裝,逆向工程結(jié)束;
步驟B2:在輸出提示單元打印目標(biāo)代碼文件的封裝格式,然后轉(zhuǎn)到步驟C。
根據(jù)本發(fā)明的實(shí)施方式,所述處理器體系結(jié)構(gòu)信息包括指令集類型信息,根據(jù)不同的處理器體系結(jié)構(gòu),采用不同的反匯編處理引擎進(jìn)行后續(xù)步驟的指令分析與反匯編代碼生成操作;
根據(jù)本發(fā)明的實(shí)施方式,所述步驟D的識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息具體包括:
步驟D1,控制單元自動(dòng)識(shí)別目標(biāo)代碼文件中機(jī)器碼的體系結(jié)構(gòu),若能夠識(shí)別,則轉(zhuǎn)到步驟E;否則,轉(zhuǎn)到步驟D2;
步驟D2,提示用戶自己選擇可選的處理器體系結(jié)構(gòu),選擇完成后,轉(zhuǎn)到步驟E。
根據(jù)本發(fā)明的實(shí)施方式,所述步驟F具體包括:如果步驟E中創(chuàng)建的程序模型存儲(chǔ)文件為第一程序模型存儲(chǔ)文件,則直接從代碼段起始地址開始逐條地分析機(jī)器指令;否則,從上一輪迭代所創(chuàng)建的程序模型存儲(chǔ)文件中的取出機(jī)器指令序列來(lái)進(jìn)行分析,在此過(guò)程中,根據(jù)機(jī)器指令的操作,對(duì)機(jī)器指令序列本身進(jìn)行修改,生成新的機(jī)器指令序列,即生成新的程序模型,分析結(jié)束后,將該程序模型寫入到步驟E中創(chuàng)建的程序模型存儲(chǔ)文件中。
根據(jù)本發(fā)明的實(shí)施方式,寫入程序模型存儲(chǔ)文件的信息包括:指令在文件的偏移地址,指令在內(nèi)存中的映射地址,指令內(nèi)容以及相應(yīng)的反匯編代碼。
本發(fā)明的優(yōu)點(diǎn)在于:基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法,從初始態(tài)空程序出發(fā),通過(guò)搜索代碼、求解間接跳轉(zhuǎn)與檢測(cè)自修改等一系列操作,逐步構(gòu)造程序演進(jìn)序列,可以對(duì)自混淆的、含有指令重疊的目標(biāo)代碼文件進(jìn)行準(zhǔn)確而有效的逆向工程,可以應(yīng)用于含有自混淆指令,指令重疊等加殼惡意軟件的分析與識(shí)別以及防反匯編閉源軟件的分析,具有有益的技術(shù)效果。
附圖說(shuō)明
通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
附圖1示出了根據(jù)本發(fā)明實(shí)施方式的基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法的流程圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施方式。雖然附圖中顯示了本公開的示例性實(shí)施方式,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
根據(jù)本發(fā)明的實(shí)施方式,如附圖1所示,公開了一種基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法,所述程序演進(jìn)模型即基于程序模型的演進(jìn)來(lái)進(jìn)行逆向工程,所述方法包括以下步驟:
步驟A:?jiǎn)?dòng)人機(jī)交互接口,向人機(jī)交互接口分別輸入待逆向工程的目標(biāo)代碼文件、程序模型存儲(chǔ)文件以及待生成的可再匯編代碼文件的存儲(chǔ)路徑;具體包括:
步驟A1,啟動(dòng)第一人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入待逆向工程的目標(biāo)代碼文件路徑,將待分析的目標(biāo)代碼文件的路徑輸入到第一人機(jī)交互接口中,控制單元自動(dòng)判斷輸入的待分析文件路徑是否有效,如果是,則轉(zhuǎn)到步驟A2;否則,輸出提示單元向用戶提示:輸入的待逆向工程目標(biāo)代碼文件路徑無(wú)效,需重新輸入;
步驟A2,啟動(dòng)第二人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入程序模型存儲(chǔ)文件的存儲(chǔ)目錄路徑,將程序模型存儲(chǔ)文件的存儲(chǔ)路徑輸入到第二人機(jī)交互接口中,控制單元判斷輸入的存儲(chǔ)路徑是否有效,如果是,則轉(zhuǎn)到步驟A3;否則,輸出提示單元向用戶提示:輸入的程序模型存儲(chǔ)文件存儲(chǔ)目錄路徑無(wú)效,需重新輸入;
步驟A3,啟動(dòng)第三人機(jī)交互接口,并向用戶發(fā)出請(qǐng)求,請(qǐng)求輸入待生成的反匯編代碼ASM文件路徑,將待生成的反匯編代碼ASM文件路徑輸入第三人機(jī)交互接口中,控制單元判斷輸入的反匯編代碼ASM文件的存儲(chǔ)路徑是否正確,如果是,則轉(zhuǎn)到步驟B;否則,輸出提示單元向用戶提示:輸入的反匯編代碼ASM文件路徑無(wú)效,需重新輸入。
步驟B:讀取目標(biāo)代碼文件首部,識(shí)別目標(biāo)代碼文件的封裝格式,并將其封裝格式打印到輸出提示單元;具體包括:
步驟B1,讀取文件首部數(shù)十個(gè)字節(jié),匹配程序庫(kù)中的樣本,若匹配到相應(yīng)封裝格式的字節(jié)序列模式,則轉(zhuǎn)到步驟B2;否則,輸出:無(wú)法識(shí)別文件封裝,逆向工程結(jié)束;
步驟B2:在輸出提示單元打印目標(biāo)代碼文件的封裝格式,然后轉(zhuǎn)到步驟C。
步驟C:根據(jù)輸出提示單元接收的不同的封裝格式,在不同的位置取出目標(biāo)代碼文件的起始地址,以及代碼段的長(zhǎng)度,定位代碼段的地址范圍;
步驟D:識(shí)別目標(biāo)代碼文件首部所記錄的處理器體系結(jié)構(gòu)信息,即指令集類型信息,根據(jù)不同的處理器體系結(jié)構(gòu),采用不同的反匯編處理引擎進(jìn)行后續(xù)步驟的指令分析與反匯編代碼生成操作;具體包括:
步驟D1,控制單元自動(dòng)識(shí)別目標(biāo)代碼文件中機(jī)器碼的體系結(jié)構(gòu),若能夠識(shí)別,則轉(zhuǎn)到步驟E;否則,轉(zhuǎn)到步驟D2;
步驟D2,提示用戶自己選擇可選的處理器體系結(jié)構(gòu),選擇完成后,轉(zhuǎn)到步驟E。
步驟E:在指定的程序模型存儲(chǔ)文件存儲(chǔ)路徑的目錄下創(chuàng)建一個(gè)空的程序模型存儲(chǔ)文件;
步驟F:結(jié)合前一輪創(chuàng)建的程序模型存儲(chǔ)文件開始逐條分析代碼段起始地址的機(jī)器指令,并將指令相關(guān)的信息寫入到新創(chuàng)建的程序模型存儲(chǔ)文件中;具體包括:
如果步驟E中創(chuàng)建的程序模型存儲(chǔ)文件為第一程序模型存儲(chǔ)文件,則直接從代碼段起始地址開始逐條地分析機(jī)器指令;否則,從上一輪迭代所創(chuàng)建的程序模型存儲(chǔ)文件中的取出機(jī)器指令序列來(lái)進(jìn)行分析,在此過(guò)程中,根據(jù)機(jī)器指令的操作,對(duì)機(jī)器指令序列本身進(jìn)行修改,生成新的機(jī)器指令序列,即生成新的程序模型,分析結(jié)束后,將該程序模型寫入到步驟E中創(chuàng)建的程序模型存儲(chǔ)文件中;
寫入程序模型存儲(chǔ)文件的信息包括:指令在文件的偏移地址,指令在內(nèi)存中的映射地址,指令內(nèi)容以及相應(yīng)的反匯編代碼;
所述步驟F還包括:分析機(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ù)向后分析指令,直至分析到最后一條指令。
步驟G:如果存在前一輪的程序模型存儲(chǔ)文件,則將新生成寫入的程序模型存儲(chǔ)文件與前一輪所創(chuàng)建的程序模型存儲(chǔ)文件進(jìn)行比較,若兩個(gè)程序模型沒(méi)有差異,則表示程序模型已經(jīng)穩(wěn)定,則跳轉(zhuǎn)至步驟H;否則,回到步驟E,重新對(duì)進(jìn)行分析和修改操作,記錄程序模型到新的程序模型存儲(chǔ)文件之中。
步驟H:結(jié)合最后一個(gè)程序模型存儲(chǔ)文件中存儲(chǔ)的信息,即迭代修改后穩(wěn)定的機(jī)器指令序列,使用對(duì)應(yīng)處理器體系結(jié)構(gòu)的反匯編引擎,生成反匯編代碼,寫入到最后的可再匯編代碼文件中。
本發(fā)明的基于程序演進(jìn)模型的目標(biāo)代碼逆向工程方法的實(shí)現(xiàn)過(guò)程,可以看作是從初始態(tài)空程序P0出發(fā),通過(guò)搜索代碼、求解間接跳轉(zhuǎn)與檢測(cè)自修改等一系列操作,逐步構(gòu)造程序演進(jìn)序列P0…Pi…Pj…Pn的過(guò)程(0<=i<=j(luò)<=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)也可回溯)的可能性。
以上所述,僅為本發(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)。