專(zhuān)利名稱(chēng):一種導(dǎo)入表的修復(fù)方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤指一種導(dǎo)入表的修復(fù)方法及裝置。
背景技術(shù):
加殼是可執(zhí)行程序資源壓縮的簡(jiǎn)稱(chēng),是保護(hù)文件的常用手段,其原理是利用特殊的算法,對(duì)可執(zhí)行程序里的資源進(jìn)行壓縮、加密。加殼程序可以直接運(yùn)行,但是不能獲取原始程序,要經(jīng)過(guò)脫殼才可以獲取。脫殼的過(guò)程主要為三步:第一步,確定原始程序的入口點(diǎn)(Original Entry Point, OEP);第二步,修復(fù)導(dǎo)入表和重定位表;第三步,將內(nèi)存中的原始程序?qū)懭胛募?,更改程序的新入口地址?ΕΡ,這一步通常稱(chēng)為轉(zhuǎn)儲(chǔ)(Dump)。修復(fù)導(dǎo)入表是脫殼過(guò)程中重要的步驟。
下面介紹導(dǎo)入表和導(dǎo)入地址表的概念。在windows上,運(yùn)行可執(zhí)行程序時(shí)通常會(huì)調(diào)用很多函數(shù),這些函數(shù)是由windows上的函數(shù)庫(kù)導(dǎo)出的,每個(gè)函數(shù)庫(kù)可以稱(chēng)為一個(gè)模塊。windows加載可執(zhí)行程序時(shí),會(huì)定位該可執(zhí)行程序的導(dǎo)入表和導(dǎo)入地址表,導(dǎo)入表中包括該可執(zhí)行程序需要加載的所有函數(shù)庫(kù)的名字,以及需要從每個(gè)函數(shù)庫(kù)里導(dǎo)入的函數(shù)的名字,導(dǎo)入地址表中包括這些函數(shù)需要填充的內(nèi)存地址,當(dāng)這些函數(shù)全部填充到內(nèi)存地址后,導(dǎo)入表就沒(méi)有用了,運(yùn)行可執(zhí)行程序要調(diào)用函數(shù)時(shí),直接從導(dǎo)入地址表中獲取函數(shù)地址,然后到獲取的函數(shù)地址中調(diào)用函數(shù)。導(dǎo)入地址表的結(jié)構(gòu)很特殊,假設(shè)導(dǎo)入地址表的起始地址是0x01001020,可執(zhí)行程
序?yàn)?2位,則導(dǎo)入地址表的結(jié)構(gòu)如下表所示:
權(quán)利要求
1.一種導(dǎo)入表的修復(fù)方法,其特征在于,包括: 記錄運(yùn)行加殼程序過(guò)程中產(chǎn)生的數(shù)據(jù)改寫(xiě)信息和模塊加載信息,所述數(shù)據(jù)改寫(xiě)信息包括數(shù)據(jù)改寫(xiě)執(zhí)行地址、數(shù)據(jù)改寫(xiě)地址、改寫(xiě)數(shù)據(jù)和數(shù)據(jù)改寫(xiě)時(shí)間,所述模塊加載信息包括所述加殼程序映射到內(nèi)存中的基地址和結(jié)束地址; 在確定所述加殼程序?qū)?yīng)的原始程序的入口點(diǎn)OEP后,根據(jù)數(shù)據(jù)改寫(xiě)時(shí)間、數(shù)據(jù)改寫(xiě)地址和設(shè)定的組合規(guī)則將記錄的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)進(jìn)行組合,并根據(jù)模塊加載信息和導(dǎo)入表格式在組合后的改寫(xiě)數(shù)據(jù)中搜尋待選導(dǎo)入表; 若搜尋到待選導(dǎo)入表,確定每個(gè)待選導(dǎo)入表對(duì)應(yīng)的導(dǎo)入地址表,獲取在到達(dá)所述OEP的時(shí)刻存在于內(nèi)存中、并且內(nèi)存地址最小的導(dǎo)入地址表,將獲取的導(dǎo)入地址表對(duì)應(yīng)的待選導(dǎo)入表作為所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表; 若搜尋不到待選導(dǎo)入表,根據(jù)記錄的數(shù)據(jù)改寫(xiě)信息中包括數(shù)據(jù)改寫(xiě)執(zhí)行地址、數(shù)據(jù)改寫(xiě)地址、改寫(xiě)數(shù)據(jù)和數(shù)據(jù)改寫(xiě)時(shí)間重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
2.如權(quán)利要求1所述的方法,其特征在于,根據(jù)數(shù)據(jù)改寫(xiě)時(shí)間、數(shù)據(jù)改寫(xiě)地址和設(shè)定的組合規(guī)則將記錄的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)進(jìn)行組合,具體包括: 在記錄的數(shù)據(jù)改寫(xiě)信息中,將數(shù)據(jù)改寫(xiě)時(shí)間連續(xù)且數(shù)據(jù)改寫(xiě)地址連續(xù)的數(shù)據(jù)改寫(xiě)信息所對(duì)應(yīng)的改寫(xiě)數(shù)據(jù)進(jìn)行組合;和/或, 在記錄的數(shù)據(jù)改寫(xiě)信息中,將數(shù)據(jù)改寫(xiě)時(shí)間連續(xù)、至少兩個(gè)連續(xù)的數(shù)據(jù)改寫(xiě)地址循環(huán)的數(shù)據(jù)改寫(xiě)信息所對(duì)應(yīng)的改寫(xiě)數(shù)據(jù)進(jìn)行組合。
3.如權(quán)利要求1所述的方法,其特征在于,所述模塊加載信息還包括加載模塊的名稱(chēng),根據(jù)模塊加載信息和導(dǎo)入表格式在組合后的改寫(xiě)數(shù)據(jù)中搜尋待選導(dǎo)入表,具體包括: 在所有改寫(xiě)數(shù)據(jù)的組合中搜尋符合下列條件的待選導(dǎo)入表: 大小大于等于第一設(shè)定字節(jié); 原始第一換長(zhǎng)OFT指向的內(nèi)存地址不為零,且落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi); OFT指向的內(nèi)存地址為零,第一換長(zhǎng)FT指向的內(nèi)存地址不為零且落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi); 模塊名稱(chēng)虛擬地址偏移Name RVA與所述基地址的和指向的內(nèi)存地址落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi),且Name RVA與所述基地址的和指向的內(nèi)存地址中的模塊包含在所述模塊加載信息包括的加載模塊的名稱(chēng)中; OFT和FT指向的內(nèi)存地址中的函數(shù)包含在所述模塊加載信息包括的加載模塊對(duì)應(yīng)的函數(shù)中。
4.如權(quán)利要求1所述的方法,其特征在于,所述數(shù)據(jù)改寫(xiě)信息還包括改寫(xiě)長(zhǎng)度,根據(jù)記錄的數(shù)據(jù)改寫(xiě)信息重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表,具體包括: 在到達(dá)所述OEP的時(shí)刻之前記錄的數(shù)據(jù)改寫(xiě)信息中,獲取改寫(xiě)數(shù)據(jù)為函數(shù)地址、改寫(xiě)長(zhǎng)度為第二設(shè)定字節(jié)的數(shù)據(jù)改寫(xiě)信息;將獲取的數(shù)據(jù)改寫(xiě)信息中包括的數(shù)據(jù)改寫(xiě)執(zhí)行地址相同的數(shù)據(jù)改寫(xiě)信息分為一組;從所有分組中選取數(shù)據(jù)改寫(xiě)地址順序排列、且包含的數(shù)據(jù)改寫(xiě)地址最多的分組,選取的分組中的數(shù)據(jù)改寫(xiě)信息中 的改寫(xiě)數(shù)據(jù)指向的函數(shù)包含在所述模塊加載信息包括的加載模塊對(duì)應(yīng)的函數(shù)中,選取的分組中的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)指向的函數(shù)中歸屬于同一加載模塊的相鄰; 根據(jù)選取的分組中每條數(shù)據(jù)改寫(xiě)信息中包括的改寫(xiě)數(shù)據(jù),確定所述加殼程序?qū)?yīng)的原始程度的導(dǎo)入地址表; 從確定的導(dǎo)入地址表中獲取運(yùn)行所述加殼程序?qū)?yīng)的原始程序時(shí)所需的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)中的函數(shù); 根據(jù)獲取的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)的函數(shù)重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
5.如權(quán)利要求1所述的方法,其特征在于,還包括: 記錄運(yùn)行加殼程序過(guò)程中產(chǎn)生的代碼塊信息,所述代碼塊信息包括代碼塊的起始地址和結(jié)束地址; 根據(jù)記錄的代碼塊信息重新建`立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
6.如權(quán)利要求5所述的方法,其特征在于,根據(jù)記錄的代碼塊信息重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表,具體包括: 在到達(dá)所述OEP的時(shí)刻之后記錄的代碼塊信息中,獲取調(diào)用第一個(gè)函數(shù)的內(nèi)存地址; 根據(jù)獲取的內(nèi)存地址,確定所述加殼程序?qū)?yīng)的原始程度的導(dǎo)入地址表; 從確定的導(dǎo)入地址表中獲取運(yùn)行所述加殼程序?qū)?yīng)的原始程序時(shí)所需的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)中的函數(shù); 根據(jù)獲取的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)的函數(shù)重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
7.—種導(dǎo)入表的修復(fù)裝置,其特征在于,包括: 記錄單元,用于記錄運(yùn)行加殼程序過(guò)程中產(chǎn)生的數(shù)據(jù)改寫(xiě)信息和模塊加載信息,所述數(shù)據(jù)改寫(xiě)信息包括數(shù)據(jù)改寫(xiě)執(zhí)行地址、數(shù)據(jù)改寫(xiě)地址、改寫(xiě)數(shù)據(jù)和數(shù)據(jù)改寫(xiě)時(shí)間,所述模塊加載信息包括所述加殼程序映射到內(nèi)存中的基地址和結(jié)束地址; 搜尋單元,用于在確定所述加殼程序?qū)?yīng)的原始程序的入口點(diǎn)OEP后,根據(jù)數(shù)據(jù)改寫(xiě)時(shí)間、數(shù)據(jù)改寫(xiě)地址和設(shè)定的組合規(guī)則將記錄的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)進(jìn)行組合,并根據(jù)模塊加載信息和導(dǎo)入表格式在組合后的改寫(xiě)數(shù)據(jù)中搜尋待選導(dǎo)入表; 確定單元,用于若所述搜尋單元搜尋到待選導(dǎo)入表,確定每個(gè)待選導(dǎo)入表對(duì)應(yīng)的導(dǎo)入地址表,獲取在到達(dá)所述OEP的時(shí)刻存在于內(nèi)存中、并且內(nèi)存地址最小的導(dǎo)入地址表,將獲取的導(dǎo)入地址表對(duì)應(yīng)的待選導(dǎo)入表作為所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表;若所述搜尋單元搜尋不到待選導(dǎo)入表,根據(jù)記錄的數(shù)據(jù)改寫(xiě)信息重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
8.如權(quán)利要求7所述的裝置,其特征在于,所述搜尋單元,具體用于: 在記錄的數(shù)據(jù)改寫(xiě)信息中,將數(shù)據(jù)改寫(xiě)時(shí)間連續(xù)且數(shù)據(jù)改寫(xiě)地址連續(xù)的數(shù)據(jù)改寫(xiě)信息所對(duì)應(yīng)的改寫(xiě)數(shù)據(jù)進(jìn)行組合;和/或, 在記錄的數(shù)據(jù)改寫(xiě)信息中,將數(shù)據(jù)改寫(xiě)時(shí)間連續(xù)、至少兩個(gè)連續(xù)的數(shù)據(jù)改寫(xiě)地址循環(huán)的數(shù)據(jù)改寫(xiě)信息所對(duì)應(yīng)的改寫(xiě)數(shù)據(jù)進(jìn)行組合。
9.如權(quán)利要求7所述的裝置,其特征在于,所述搜尋單元,具體用于: 在所有改寫(xiě)數(shù)據(jù)的組合中搜尋符合下列條件的待選導(dǎo)入表: 大小大于等于第一設(shè)定字節(jié);原始第一換長(zhǎng)OFT指向的內(nèi)存地址不為零,且落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi); OFT指向的內(nèi)存地址為零,第一換長(zhǎng)FT指向的內(nèi)存地址不為零且落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi); 模塊名稱(chēng)虛擬地址偏移Name RVA與所述基地址的和指向的內(nèi)存地址落入所述模塊加載信息中包括的基地址和結(jié)束地址范圍內(nèi),且Name rva與所述基地址的和指向的內(nèi)存地址中的模塊包含在所述模塊加載信息包括的加載模塊的名稱(chēng)中; OFT和FT指向的內(nèi)存地址中的函數(shù)包含在所述模塊加載信息包括的加載模塊對(duì)應(yīng)的函數(shù)中。
10.如權(quán)利要求7所述的裝置,其特征在于,所述確定單元,具體用于: 在到達(dá)所述OEP的時(shí)刻之前記錄的數(shù)據(jù)改寫(xiě)信息中,獲取改寫(xiě)數(shù)據(jù)為函數(shù)地址、改寫(xiě)長(zhǎng)度為第二設(shè)定字節(jié)的數(shù)據(jù)改寫(xiě)信息;將獲取的數(shù)據(jù)改寫(xiě)信息中包括的數(shù)據(jù)改寫(xiě)執(zhí)行地址相同的數(shù)據(jù)改寫(xiě)信息分為一組;從所有分組中選取數(shù)據(jù)改寫(xiě)地址順序排列、且包含的數(shù)據(jù)改寫(xiě)地址最多的分組,選取的分組中的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)指向的函數(shù)包含在所述模塊加載信息包括的加載模塊對(duì)應(yīng)的函數(shù)中,選取的分組中的數(shù)據(jù)改寫(xiě)信息中的改寫(xiě)數(shù)據(jù)指向的函數(shù)中歸屬于同一加載模塊的相鄰; 根據(jù)選取的分組中每條數(shù)據(jù)改寫(xiě)信息中包括的改寫(xiě)數(shù)據(jù),確定所述加殼程序?qū)?yīng)的原始程度的導(dǎo)入地址表; 從確定的導(dǎo)入地址表中獲取運(yùn)行所述加殼程序?qū)?yīng)的原始程序時(shí)所需的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)中的函數(shù);` 根據(jù)獲取的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)的函數(shù)重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
11.如權(quán)利要求7所述的裝置,其特征在于,所述記錄單元,還用于記錄運(yùn)行加殼程序過(guò)程中產(chǎn)生的代碼塊信息,所述代碼塊信息包括代碼塊的起始地址和結(jié)束地址; 所述確定單元,還用于根據(jù)記錄的代碼塊信息重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
12.如權(quán)利要求11所述的裝置,其特征在于,所述確定單元,具體用于: 在到達(dá)所述OEP的時(shí)刻之后記錄的代碼塊信息中,獲取調(diào)用第一個(gè)函數(shù)的內(nèi)存地址; 根據(jù)獲取的內(nèi)存地址,確定所述加殼程序?qū)?yīng)的原始程度的導(dǎo)入地址表; 從確定的導(dǎo)入地址表中獲取運(yùn)行所述加殼程序?qū)?yīng)的原始程序時(shí)所需的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)中的函數(shù); 根據(jù)獲取的函數(shù)庫(kù)及每個(gè)函數(shù)庫(kù)的函數(shù)重新建立所述加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。
全文摘要
本發(fā)明公開(kāi)了一種導(dǎo)入表的修復(fù)方法及裝置,該方法包括記錄運(yùn)行加殼程序過(guò)程中產(chǎn)生的數(shù)據(jù)改寫(xiě)信息和模塊加載信息;在確定加殼程序?qū)?yīng)的原始程序的OEP后,根據(jù)數(shù)據(jù)改寫(xiě)時(shí)間、數(shù)據(jù)改寫(xiě)地址和設(shè)定組合規(guī)則將改寫(xiě)數(shù)據(jù)進(jìn)行組合,根據(jù)模塊加載信息和導(dǎo)入表格式在組合后的改寫(xiě)數(shù)據(jù)中搜尋待選導(dǎo)入表;若搜到,確定每個(gè)待選導(dǎo)入表對(duì)應(yīng)的導(dǎo)入地址表,獲取在到達(dá)OEP的時(shí)刻存在于內(nèi)存中、且內(nèi)存地址最小的導(dǎo)入地址表,將獲取的導(dǎo)入地址表對(duì)應(yīng)的待選導(dǎo)入表作為加殼程序?qū)?yīng)的原始程序的導(dǎo)入表;若搜不到,根據(jù)記錄的數(shù)據(jù)改寫(xiě)信息重建加殼程序?qū)?yīng)的原始程序的導(dǎo)入表。該方案可以適用于修復(fù)各種加殼程序?qū)?yīng)的原始程序的導(dǎo)入表,方法簡(jiǎn)單,修復(fù)效率高。
文檔編號(hào)G06F9/44GK103077029SQ201210592469
公開(kāi)日2013年5月1日 申請(qǐng)日期2012年12月28日 優(yōu)先權(quán)日2012年12月28日
發(fā)明者陳錦, 劉業(yè)欣 申請(qǐng)人:北京神州綠盟信息安全科技股份有限公司, 北京神州綠盟科技有限公司