本發(fā)明涉及一種計(jì)算機(jī)技術(shù)領(lǐng)域,尤其是涉及基于符號(hào)執(zhí)行的目標(biāo)代碼控制流圖生成系統(tǒng)。
背景技術(shù):
面對(duì)眾多的無(wú)法獲取源碼的目標(biāo)程序,研究人員不得不需要通過(guò)逆向工程的手段對(duì)程序的目標(biāo)代碼進(jìn)行分析。在分析過(guò)程中,一個(gè)精確而完善的控制流圖能夠幫助研究人員對(duì)程序結(jié)構(gòu)進(jìn)行直觀的認(rèn)識(shí),以輔助其進(jìn)一步的深入分析與理解。
通常,人們通過(guò)反匯編的手段,對(duì)目標(biāo)代碼進(jìn)行反匯編,根據(jù)程序中的跳轉(zhuǎn)與子過(guò)程調(diào)用,生成相應(yīng)的控制流節(jié)點(diǎn),構(gòu)造出相應(yīng)的控制流圖。
而在控制流圖構(gòu)造的過(guò)程中,通常會(huì)遭遇到間接地址跳轉(zhuǎn)的問(wèn)題。間接跳轉(zhuǎn)地址是指目標(biāo)地址存放在內(nèi)存或寄存器中的跳轉(zhuǎn)地址,這類值通常無(wú)法通過(guò)靜態(tài)分析得到。
而在一些控制流圖生成工具的實(shí)現(xiàn)中,采用了抽象解釋的模塊,使用近似值的模塊對(duì)控制流進(jìn)行擴(kuò)充。這種模塊相對(duì)不夠精確,同時(shí)引入了不該存在的控制流路徑。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的。
具體的,本發(fā)明公開(kāi)一種目標(biāo)代碼控制流圖生成系統(tǒng),其特征在于,包括:
預(yù)處理模塊:用于對(duì)目標(biāo)代碼文件進(jìn)行封裝格式的識(shí)別,定位程序指令的入口地址;
反匯編與控制流圖生成模塊:用于機(jī)器指令的反匯編與控制流圖生成;
目標(biāo)地址分析模塊:用于間接跳轉(zhuǎn)指令處目的地址的可能值分析計(jì)算。
優(yōu)選地,所述預(yù)處理模塊包括:
文件類型識(shí)別模塊:通過(guò)對(duì)特定封裝格式文件頭部數(shù)據(jù)結(jié)構(gòu)的匹配,進(jìn)行文件類型的識(shí)別;
目標(biāo)平臺(tái)確定模塊:讀取并解析目標(biāo)代碼文件的頭部數(shù)據(jù),確定目標(biāo)代碼的目標(biāo)平臺(tái);
入口偏移地址定位模塊:讀取并解析目標(biāo)代碼文件的頭部數(shù)據(jù),定位目標(biāo)文件指令序列的入口偏移地址。
優(yōu)選地,所述反匯編與控制流圖生成模塊包括:
反匯編引擎選擇模塊:根據(jù)預(yù)處理模塊所識(shí)別的目標(biāo)平臺(tái)信息,自動(dòng)選擇相應(yīng)的反匯編引擎;
反匯編模塊:對(duì)于順序指令序列,進(jìn)行線性掃描式的反匯編處理;對(duì)于目的地址明確的跳轉(zhuǎn),直接跳轉(zhuǎn)至目標(biāo)地址進(jìn)行反匯編,對(duì)于目標(biāo)地址為寄存器的間接地址跳轉(zhuǎn),調(diào)用目標(biāo)地址分析模塊進(jìn)行目標(biāo)地址分析,得到目標(biāo)地址后跳轉(zhuǎn)至相應(yīng)位置進(jìn)行反匯編,并構(gòu)建相應(yīng)的控制流圖節(jié)點(diǎn)。
優(yōu)選地,所述目標(biāo)地址分析模塊包括:
路徑條件符號(hào)計(jì)算模塊:對(duì)程序進(jìn)行符號(hào)執(zhí)行,分析推導(dǎo)抵達(dá)間接跳轉(zhuǎn)指令處所需滿足的條件,輸出一個(gè)條件公式;
SMT求解器模塊:對(duì)所述路徑條件符號(hào)計(jì)算模塊輸出的條件公式進(jìn)行求解,計(jì)算公式中變量的可行取值;
二進(jìn)制仿真模塊:以SMT求解器模塊中獲取的變量可行值作為輸入?yún)?shù),仿真執(zhí)行相應(yīng)的指令序列,以跟蹤指令序列運(yùn)行過(guò)程中的寄存器中值的變化,最終確定間接跳轉(zhuǎn)指令的目的地址,以之作為下一條待反匯編指令的地址,使用反匯編與控制流圖生成模塊重新處理指令。
優(yōu)選地,所述反匯編模塊中的反匯編采用遞歸下降的反匯編方法。
與現(xiàn)有技術(shù)相比,本發(fā)明公開(kāi)的一種目標(biāo)代碼控制流圖生成系統(tǒng),具有如下有益效果:該模塊通過(guò)符號(hào)執(zhí)行,SMT求解器求解,模擬執(zhí)行的方式,對(duì)間接地址寄存器的值進(jìn)行分析,以計(jì)算出相應(yīng)的目的地址,使得控制流圖更加完善。通過(guò)模擬執(zhí)行計(jì)算的目的地址,是真實(shí)運(yùn)行環(huán)境下可能存在的值,使得生產(chǎn)的控制流圖相對(duì)抽象解釋模塊獲得的控制流圖而言更加精確。
附圖說(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示出了本發(fā)明的目標(biāo)代碼控制流圖生成系統(tǒng)示例圖;
附圖2示出了本發(fā)明的目標(biāo)代碼控制流圖生成方法流程圖;
附圖3示出了本發(fā)明的目標(biāo)代碼控制流圖生成系統(tǒng)中的預(yù)處理模塊框架圖;
附圖4示出了本發(fā)明的目標(biāo)代碼控制流圖生成系統(tǒng)中的反匯編與控制流圖生成模塊框架圖。
具體實(shí)施方式
下面將參照附圖更詳細(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ù)人員。
如圖1所示,本發(fā)明公開(kāi)一種目標(biāo)代碼控制流圖生成系統(tǒng),包括:
預(yù)處理模塊:負(fù)責(zé)對(duì)目標(biāo)代碼文件進(jìn)行封裝格式的識(shí)別,定位程序指令的入口地址;反匯編與控制流圖生成模塊:負(fù)責(zé)機(jī)器指令的反匯編與控制流圖生成;目標(biāo)地址分析模塊:負(fù)責(zé)間接跳轉(zhuǎn)指令處目的地址的可能值分析計(jì)算。
所述的目標(biāo)代碼控制流圖生成系統(tǒng)執(zhí)行的目標(biāo)代碼控制流圖生成方法流程圖如圖2所示,該方法包括:
B1.輸入需要生成控制流圖的目標(biāo)代碼文件路徑,系統(tǒng)讀取目標(biāo)代碼文件;
B2.預(yù)處理器(相當(dāng)于系統(tǒng)中的預(yù)處理模塊)對(duì)目標(biāo)代碼文件進(jìn)行預(yù)處理,定位程序的入口地址;
B3.反匯編與控制流圖生成模塊讀取指令,判斷指令是否存在,若存在,則讀取成功,則跳轉(zhuǎn)至步驟B4,讀取失敗,則跳轉(zhuǎn)至步驟B9;
B4.對(duì)指令進(jìn)行反匯編;
B5.判斷指令是否是間接指令跳轉(zhuǎn),若指令不是間接跳轉(zhuǎn)指令,則按照一般的控制流圖生成算法進(jìn)行節(jié)點(diǎn)與連接邊的生成,即,生成一個(gè)控制流圖節(jié)點(diǎn),構(gòu)造一條邊連接上一節(jié)點(diǎn)到本節(jié)點(diǎn),回到B3;若指令是間接跳轉(zhuǎn)指令,則跳轉(zhuǎn)至步驟B6;
B6.分析到達(dá)間接跳轉(zhuǎn)指令的路徑,使用符號(hào)執(zhí)行分析得到抵達(dá)該間接跳轉(zhuǎn)指令的路徑條件;
B7.使用SMT求解器對(duì)B6所得路徑條件公式進(jìn)行求解,獲得輸入?yún)?shù),即一個(gè)測(cè)試用例;
B8.使用二進(jìn)制仿真器,仿真抵達(dá)間接跳轉(zhuǎn)指令的指令序列,獲取到達(dá)間接跳轉(zhuǎn)指令時(shí)存儲(chǔ)間接跳轉(zhuǎn)指令寄存器中的值,即跳轉(zhuǎn)的目標(biāo)地址,以之作為下一條反匯編指令的地址,回到B3;
B9.輸出控制流圖;
B10.結(jié)束;
如圖3所示,如上所述的目標(biāo)代碼控制流圖生成系統(tǒng)中,所述預(yù)處理模塊包括:文件類型識(shí)別模塊:通過(guò)特定封裝格式文件頭部數(shù)據(jù)結(jié)構(gòu)的匹配,進(jìn)行文件類型的識(shí)別;目標(biāo)平臺(tái)確定模塊:解析讀取目標(biāo)代碼文件的頭部數(shù)據(jù),確定目標(biāo)代碼的目標(biāo)平臺(tái);入口偏移地址定位模塊:解析讀取目標(biāo)代碼文件的頭部數(shù)據(jù),定位目標(biāo)文件指令序列的入口偏移地址。
如圖4所示,如上所述的目標(biāo)代碼控制流圖生成系統(tǒng)中,所述反匯編與控制流圖生成模塊包括:反匯編引擎選擇模塊:根據(jù)預(yù)處理模塊所識(shí)別的目標(biāo)平臺(tái)信息,自動(dòng)選擇相應(yīng)的反匯編引擎;反匯編模塊:對(duì)于目的地址明確的跳轉(zhuǎn),直接跳轉(zhuǎn)至目標(biāo)地址進(jìn)行反匯編,對(duì)于目標(biāo)地址為寄存器的間接地址跳轉(zhuǎn),調(diào)用目標(biāo)地址分析模塊進(jìn)行目標(biāo)地址分析,得到目標(biāo)地址后調(diào)到相應(yīng)位置進(jìn)行反匯編,并構(gòu)建相應(yīng)的控制流圖節(jié)點(diǎn)。
如圖1所示,如上所述的目標(biāo)代碼控制流圖生成系統(tǒng)中,所述目標(biāo)地址分析模塊包括:路徑條件符號(hào)計(jì)算模塊(相當(dāng)于符號(hào)執(zhí)行模塊):對(duì)程序進(jìn)行符號(hào)執(zhí)行,分析推導(dǎo)抵達(dá)間接跳轉(zhuǎn)指令處所需滿足的條件,輸出一個(gè)條件公式;SMT求解器模塊:對(duì)所述反匯編引擎選擇模塊輸出的條件公式進(jìn)行求解,計(jì)算公式中變量的可行取值,獲得輸入?yún)?shù);二進(jìn)制仿真模塊:利用所述反匯編模塊中獲得的可能值,仿真執(zhí)行相應(yīng)的指令序列,以跟蹤指令序列運(yùn)行過(guò)程中的寄存器中值的變化,最終確定間接跳轉(zhuǎn)指令的目的地址,以之作為下一條反匯編指令的地址,反匯編與控制流圖生成模塊重新讀取指令。
優(yōu)選的,如上所述的目標(biāo)代碼控制流圖生成系統(tǒng)中,所述反匯編模塊中的反匯編采用遞歸下降的反匯編方法。
通過(guò)本發(fā)明的系統(tǒng),得到了一個(gè)精確而完善的控制流圖,能夠幫助研究人員對(duì)程序結(jié)構(gòu)進(jìn)行直觀的認(rèn)識(shí)。具體地,通過(guò)對(duì)間接地址寄存器的值進(jìn)行分析,計(jì)算出相應(yīng)的目的地址。這種通過(guò)模擬執(zhí)行計(jì)算的目的地址,是真實(shí)運(yùn)行環(huán)境下可能存在的值,使得得到的控制流圖更加精確。
需要說(shuō)明的是:
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬裝置或者其它設(shè)備固有相關(guān)。各種通用裝置也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類裝置所要求的結(jié)構(gòu)是顯而易見(jiàn)的。此外,本發(fā)明也不針對(duì)任何特定編程語(yǔ)言。應(yīng)當(dāng)明白,可以利用各種編程語(yǔ)言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語(yǔ)言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說(shuō)明書(shū)中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的模塊、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書(shū)的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開(kāi)并幫助理解各個(gè)發(fā)明方面中的一根或多根,在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開(kāi)的模塊解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說(shuō),如下面的權(quán)利要求書(shū)所反映的那樣,發(fā)明方面在于少于前面公開(kāi)的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書(shū)由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一根或多根設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的所有特征以及如此公開(kāi)的任何模塊或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(shū)(包括伴隨的權(quán)利要求、摘要和附圖)中公開(kāi)的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書(shū)中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的虛擬機(jī)的創(chuàng)建裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的模塊的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說(shuō)明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來(lái)實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過(guò)同一個(gè)硬件項(xiàng)來(lái)具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若對(duì)本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其同等技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。