目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種目標(biāo)文件的保護(hù)方法,其包括:對(duì)于軟件中用到的各目標(biāo)文件中的需要保護(hù)的函數(shù)進(jìn)行反匯編后,對(duì)函數(shù)的指令進(jìn)行變形,并在函數(shù)內(nèi)插入垃圾指令,從而對(duì)各目標(biāo)文件進(jìn)行保護(hù)以形成對(duì)軟件的整體保護(hù)。本發(fā)明還公開了一種目標(biāo)文件的保護(hù)系統(tǒng),包括:分析模塊;反匯編模塊;變形模塊;垃圾指令插入模塊;修復(fù)模塊。本發(fā)明的目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng),對(duì)obj文件進(jìn)行保護(hù),可以增加保護(hù)的范圍,增加了反編譯和分析的難度,大大提高了軟件的安全性。
【專利說明】目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng)
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及軟件保護(hù)領(lǐng)域,尤其涉及一種目標(biāo)文件(〇bj文件)的保護(hù)方法及保護(hù) 系統(tǒng)。
【背景技術(shù)】
[0002] 軟件作為一種特殊的產(chǎn)品,由于其數(shù)字化的特征,從問世起就一直遭受盜版的困 擾。盜版的存在不僅給軟件開發(fā)者造成了巨大的損失,也極大的阻礙了整個(gè)軟件行業(yè)的發(fā) 展。目前可以對(duì)軟件的進(jìn)行保護(hù)的主要方法是采用加殼或者采用虛擬機(jī)進(jìn)行保護(hù),加殼主 要是對(duì)軟件整體進(jìn)行保護(hù),相當(dāng)于對(duì)軟件外面包裹了一層殼,殼和軟件之間有明顯的分界 線,采用虛擬機(jī)保護(hù)主要是對(duì)關(guān)鍵代碼進(jìn)行了虛擬化,軟件和虛擬機(jī)之間均有明顯的邊界。 無論采用加殼或者虛擬機(jī)對(duì)軟件進(jìn)行保護(hù),軟件中對(duì)于一些庫函數(shù)(如memcpy, sprintf 等)無法進(jìn)行保護(hù)。
【發(fā)明內(nèi)容】
[0003] 本發(fā)明提供一種目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng),對(duì)obj文件進(jìn)行保護(hù),可以增 加保護(hù)的范圍,增加了反編譯和分析的難度,大大提高了軟件的安全性。
[0004] 為了解決上述技術(shù)問題,本發(fā)明提供了一種目標(biāo)文件的保護(hù)方法,其包括:對(duì)于軟 件中用到的各目標(biāo)文件中的需要保護(hù)的函數(shù)進(jìn)行反匯編后,對(duì)函數(shù)的指令進(jìn)行變形,并在 函數(shù)內(nèi)插入垃圾指令,從而對(duì)各目標(biāo)文件進(jìn)行保護(hù)以形成對(duì)軟件的整體保護(hù)。
[0005] 作為優(yōu)選,具體包括以下步驟:
[0006] S10 :分析目標(biāo)文件中的函數(shù)符號(hào),并且選擇需要保護(hù)的函數(shù)對(duì)應(yīng)的函數(shù)符號(hào);
[0007] S20:根據(jù)機(jī)器碼指令的編碼規(guī)則,對(duì)所述需要保護(hù)的函數(shù)進(jìn)行反匯編,從而將機(jī) 器指令反編譯成匯編語言指令;
[0008] S30:利用預(yù)先設(shè)計(jì)的變形指令模版,對(duì)所述匯編語言指令中的能變形的指令進(jìn)行 指令替換;
[0009] S40 :在所述匯編語言指令中的選定位置處插入垃圾指令;
[0010] S50 :修改所述函數(shù)符號(hào);
[0011] S60 :修改所述需要保護(hù)的函數(shù)的指令字節(jié)碼。
[0012] 作為優(yōu)選,如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,則步驟S40與步驟S50之間還包括:
[0013] S41 :根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間由于指令變形及垃圾指令增加的偏移 所發(fā)生的變化,對(duì)跳轉(zhuǎn)指令進(jìn)行修改。
[0014] 作為優(yōu)選,如果目標(biāo)文件中有數(shù)據(jù)符號(hào),則步驟S10還包括分析所述數(shù)據(jù)符號(hào),且 步驟S50與步驟S60之間還包括:
[0015] S51 :修改所述數(shù)據(jù)符號(hào)。
[0016] 作為優(yōu)選,如果目標(biāo)文件中有重定位符號(hào),則步驟S10還包括分析所述重定位符 號(hào),且步驟S50與步驟S60之間還包括:
[0017] S52 :修改所述重定位符號(hào)。
[0018] 作為優(yōu)選,步驟S51具體為:步驟S51具體為:對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃 描,根據(jù)指令變形的位置和變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長 度,來修改所述數(shù)據(jù)符號(hào)的位置。
[0019] 作為優(yōu)選,步驟S52具體為:步驟S52具體為:對(duì)目標(biāo)文件中的所有重定位符號(hào)進(jìn) 行掃描,根據(jù)指令變形的位置和變形后指令的長度,以及垃圾指令插入的位置及垃圾指令 的長度,來修改所述重定位符號(hào)。
[0020] 作為優(yōu)選,步驟S50具體為:步驟S50具體為:對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃 描,根據(jù)指令變形的位置及變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長 度,來修改所述函數(shù)符號(hào)的位置及長度。
[0021] 作為優(yōu)選,步驟S60具體為:根據(jù)需要保護(hù)的函數(shù)的原始指令、變形后的指令、插 入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修改經(jīng)保護(hù)處理后的函數(shù)的指令字節(jié)碼。
[0022] 本發(fā)明還提供了一種基于上述的方法的目標(biāo)文件的保護(hù)系統(tǒng),包括:
[0023] 分析模塊,其配置為分析目標(biāo)文件中的函數(shù)符號(hào);
[0024] 反匯編模塊,其配置為根據(jù)機(jī)器碼指令的編碼規(guī)則,將需要保護(hù)的函數(shù)的機(jī)器指 令反編譯為匯編語言指令;
[0025] 變形模塊,其配置為利用預(yù)先設(shè)計(jì)的變形指令模版對(duì)所述反匯編模塊生成的所述 匯編語言指令中的能變形的指令進(jìn)行指令替換;
[0026] 垃圾指令插入模塊,其配置為在所述匯編語言指令中的選定位置處插入垃圾指 令;
[0027] 修復(fù)模塊,其配置為對(duì)進(jìn)行了指令變形和垃圾指令插入的所述需要保護(hù)的函數(shù)進(jìn) 行修復(fù)并且對(duì)其他函數(shù)符號(hào)進(jìn)行相應(yīng)修復(fù);對(duì)經(jīng)保護(hù)處理后的函數(shù)的指令進(jìn)行修復(fù),以生 成保護(hù)后的目標(biāo)文件。
[0028] 作為優(yōu)選,如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,所述修復(fù)模塊還配置為包括對(duì)需要保護(hù)的 函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù)。
[0029] 作為優(yōu)選,所述分析模塊還配置為分析目標(biāo)文件中的數(shù)據(jù)符號(hào),如果目標(biāo)文件中 有數(shù)據(jù)符號(hào),所述修復(fù)模塊還配置為包括對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù)。
[0030] 作為優(yōu)選,所述分析模塊還配置為分析目標(biāo)文件中的重定位符號(hào),如果目標(biāo)文件 中有重定位符號(hào),所述修復(fù)模塊還配置為包括對(duì)重定位符號(hào)進(jìn)行修復(fù)。
[0031] 作為優(yōu)選,所述修復(fù)模塊對(duì)函數(shù)符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件中 的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的位置及變形后指令的長度,以及垃圾指令插入的 位置及垃圾指令的長度,來修復(fù)函數(shù)符號(hào)的位置及長度。
[0032] 作為優(yōu)選,所述修復(fù)模塊對(duì)保護(hù)后的函數(shù)的指令進(jìn)行修復(fù)的方式具體配置為:根 據(jù)需要保護(hù)的函數(shù)的原始指令、變形后的指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修 復(fù)經(jīng)保護(hù)處理后的函數(shù)的指令字節(jié)碼。
[0033] 作為優(yōu)選,所述修復(fù)模塊對(duì)需要保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù)的方式具體 配置為:根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間由于指令變形及垃圾指令增加的偏移所發(fā)生 的變化,來對(duì)跳轉(zhuǎn)指令進(jìn)行修復(fù)。
[0034] 作為優(yōu)選,所述修復(fù)模塊對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件中 的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的位置變形后指令的長度,以及垃圾指令插入的位 置及垃圾指令的長度,來修復(fù)數(shù)據(jù)符號(hào)的位置。
[0035] 作為優(yōu)選,所述修復(fù)模塊對(duì)重定位符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件 中的所有重定位符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置變形后指令的長度,以及垃圾指令插 入的位置及垃圾指令的長度,來修復(fù)重定位符號(hào)。
[0036] 與現(xiàn)有技術(shù)相比,本發(fā)明的目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng)的有益效果在于:通 過首先分析〇bj文件中的函數(shù)符號(hào)、重定位符號(hào)、數(shù)據(jù)符號(hào),選擇需要保護(hù)的函數(shù)對(duì)應(yīng)的函 數(shù)符號(hào),對(duì)函數(shù)進(jìn)行反匯編,對(duì)函數(shù)的指令進(jìn)行變形,在指令中間插入垃圾指令,修復(fù)函數(shù) 的跳轉(zhuǎn)指令,修復(fù)obj文件中的函數(shù)符號(hào)、數(shù)據(jù)符號(hào)、重定位符號(hào),從而對(duì)軟件形成一個(gè)整 體的保護(hù)。對(duì)〇bj文件進(jìn)行保護(hù),可以增加保護(hù)的范圍,增加了反編譯和分析的難度,大大 提高了軟件的安全性。
【專利附圖】
【附圖說明】
[0037] 圖1為本發(fā)明的實(shí)施例的目標(biāo)文件的保護(hù)方法的流程示意圖;
[0038] 圖2為本發(fā)明的實(shí)施例的目標(biāo)文件的保護(hù)系統(tǒng)的各模塊結(jié)構(gòu)示意圖;
[0039] 圖3為本發(fā)明的實(shí)施例一的C0FF文件結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0040] 下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明的實(shí)施例的目標(biāo)文件的保護(hù)方法及保護(hù)系 統(tǒng)作進(jìn)一步詳細(xì)描述,但不作為對(duì)本發(fā)明的限定。
[0041] 圖1為本發(fā)明的實(shí)施例的目標(biāo)文件的保護(hù)方法的流程示意圖。本發(fā)明的實(shí)施例的 目標(biāo)文件的保護(hù)方法包括:對(duì)于軟件中用到的各目標(biāo)文件中的需要保護(hù)的函數(shù)進(jìn)行反匯編 后,對(duì)函數(shù)的指令進(jìn)行變形,并在函數(shù)內(nèi)插入垃圾指令,從而對(duì)各目標(biāo)文件進(jìn)行保護(hù)以形成 對(duì)軟件的整體保護(hù)。
[0042] 本發(fā)明實(shí)施例采用的方法包括以下步驟:
[0043] S10 :分析目標(biāo)文件中的函數(shù)符號(hào),并且選擇需要保護(hù)的函數(shù)對(duì)應(yīng)的函數(shù)符號(hào);
[0044] S20:根據(jù)機(jī)器碼指令的編碼規(guī)則,對(duì)需要保護(hù)的函數(shù)進(jìn)行反匯編,從而將機(jī)器指 令反編譯成匯編語言指令;
[0045] S30:利用預(yù)先設(shè)計(jì)的變形指令模版,對(duì)匯編語言指令中的能變形的指令進(jìn)行指令 替換;
[0046] S40 :在匯編語言指令中的選定位置處插入垃圾指令;
[0047] S50 :修改函數(shù)符號(hào);包括需要保護(hù)的函數(shù)以及沒有保護(hù)的函數(shù)符號(hào),通曉的,沒 有保護(hù)的函數(shù)符號(hào)可能受到保護(hù)函數(shù)的影響,也需要修改,例如可能存在相連的三個(gè)函數(shù) 符號(hào),而需要保護(hù)中間的函數(shù),那么第三個(gè)函數(shù)的函數(shù)符號(hào)的位置肯定是會(huì)有變化的。
[0048] S60 :修改需要保護(hù)的函數(shù)的指令字節(jié)碼。
[0049] 本發(fā)明的目標(biāo)文件的保護(hù)方法,通過首先分析obj文件中的函數(shù)符號(hào),選擇需要 保護(hù)的函數(shù)符號(hào),對(duì)函數(shù)進(jìn)行反匯編,對(duì)指令進(jìn)行變形,在指令中間插入垃圾指令,修復(fù)函 數(shù)的跳轉(zhuǎn)指令,修復(fù)obj文件中的函數(shù)符號(hào),從而對(duì)軟件形成一個(gè)整體地保護(hù),對(duì)obj文件 進(jìn)行保護(hù),可以增加保護(hù)的范圍,增加了反編譯和分析的難度,大大提高了軟件的安全性。
[0050] 作為本發(fā)明的一個(gè)改進(jìn),如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,則步驟S40與步驟S50之間還 包括:S41 :根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間由于指令變形及垃圾指令增加的偏移所 發(fā)生的變化,對(duì)跳轉(zhuǎn)指令進(jìn)行修改。實(shí)際情況中,如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,由于對(duì)需要保 護(hù)的函數(shù)中的指令進(jìn)行了變形,插入了垃圾指令,導(dǎo)致跳轉(zhuǎn)指令跳轉(zhuǎn)的偏移發(fā)生了變化,根 據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間,由于指令變形及垃圾指令增加的偏移對(duì)跳轉(zhuǎn)指令進(jìn)行 修改。
[0051] 作為進(jìn)一步的改進(jìn),如果目標(biāo)文件中有數(shù)據(jù)符號(hào),則步驟S10還包括分析數(shù)據(jù)符 號(hào),且步驟S50與步驟S60之間還包括S51 :修改數(shù)據(jù)符號(hào)。作為另一方面,如果目標(biāo)文件中 有重定位符號(hào),則步驟S10還包括分析重定位符號(hào),且步驟S50與步驟S60之間還包括S52 : 修改重定位符號(hào)。
[0052] 進(jìn)一步地,結(jié)合上述內(nèi)容,如果obj文件中有數(shù)據(jù)符號(hào),則對(duì)目標(biāo)文件中的所有符 號(hào)表進(jìn)行掃描,根據(jù)指令變形的位置和變形后指令的長度,以及垃圾指令插入的位置及垃 圾指令的長度,來修改數(shù)據(jù)符號(hào)的位置。另一方面,如果obj文件中有重定位符號(hào),則修改 重定位符號(hào),對(duì)目標(biāo)文件中的所有重定位符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置和變形后指 令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來修改重定位符號(hào)。
[0053] 作為更進(jìn)一步的改進(jìn),步驟S50具體為:對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃描,根 據(jù)指令變形的位置及變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來 修改函數(shù)符號(hào)的位置及長度。作為本實(shí)施例的優(yōu)選實(shí)施方式,步驟S60具體為:根據(jù)需要保 護(hù)的函數(shù)的原始指令、變形后的指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修改經(jīng)保護(hù) 處理后的函數(shù)的指令字節(jié)碼。
[0054] 如圖2為本發(fā)明的實(shí)施例的目標(biāo)文件的保護(hù)系統(tǒng)的各模塊結(jié)構(gòu)示意圖所示,本發(fā) 明還提供了一種基于上述的方法的目標(biāo)文件的保護(hù)系統(tǒng),包括:
[0055] 分析模塊,其配置為分析目標(biāo)文件中的函數(shù)符號(hào),并且可進(jìn)一步地配置為分析目 標(biāo)文件中的數(shù)據(jù)符號(hào),以及分析目標(biāo)文件中的重定位符號(hào)(下文具體說明);
[0056] 反匯編模塊,其配置為根據(jù)機(jī)器碼指令的編碼規(guī)則,將需要保護(hù)的函數(shù)的機(jī)器指 令反編譯為匯編語言指令;
[0057] 變形模塊,其配置為利用預(yù)先設(shè)計(jì)的變形指令模版對(duì)反匯編模塊生成的匯編語言 指令中的能變形的指令進(jìn)行指令替換;
[0058] 垃圾指令插入模塊,其配置為在匯編語言指令中的選定位置處插入垃圾指令;
[0059] 修復(fù)模塊,其配置為對(duì)進(jìn)行了指令變形和垃圾指令插入的需要保護(hù)的函數(shù)進(jìn)行修 復(fù),并且根據(jù)前述內(nèi)容,修復(fù)模塊還需要配置為對(duì)其他函數(shù)符號(hào)進(jìn)行相應(yīng)修復(fù),例如沒有保 護(hù)的函數(shù)符號(hào),如位置信息,可能也會(huì)受到需要保護(hù)的函數(shù)的影響,故應(yīng)當(dāng)進(jìn)行相應(yīng)的處 理。修復(fù)模塊對(duì)經(jīng)保護(hù)處理后的函數(shù)的指令進(jìn)行修復(fù),以生成保護(hù)后的目標(biāo)文件。其中,對(duì) 函數(shù)符號(hào)進(jìn)行修復(fù)的方式可以采用對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的 位置及變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來修復(fù)函數(shù)符號(hào) 的位置及長度;對(duì)保護(hù)后的函數(shù)的指令進(jìn)行修復(fù)的方式可以采用根據(jù)需要保護(hù)的函數(shù)的原 始指令、變形后的指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修復(fù)經(jīng)保護(hù)處理后的函數(shù) 的指令字節(jié)碼。
[0060] 結(jié)合前述本發(fā)明的保護(hù)方法的說明內(nèi)容,由于對(duì)需要保護(hù)的函數(shù)進(jìn)行了指令變 形和垃圾指令插入,修復(fù)模塊需要對(duì)需要保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù),對(duì)函數(shù)符 號(hào)進(jìn)行修復(fù),對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù),對(duì)重定位符號(hào)進(jìn)行修復(fù),對(duì)保護(hù)后的函數(shù)的指令進(jìn)行修 復(fù),生成保護(hù)后的Obj文件。也就是說:
[0061] 如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,修復(fù)模塊還配置為包括對(duì)需要保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn) 指令進(jìn)行修復(fù),具體方式可以采用根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間由于指令變形及垃 圾指令增加的偏移所發(fā)生的變化,來對(duì)跳轉(zhuǎn)指令進(jìn)行修復(fù);
[0062] 分析模塊還分析目標(biāo)文件中是否有數(shù)據(jù)符號(hào),如果目標(biāo)文件中有數(shù)據(jù)符號(hào),修復(fù) 模塊還配置為包括對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù),具體方式可以采用對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn) 行掃描,根據(jù)指令變形的位置變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的 長度,來修復(fù)數(shù)據(jù)符號(hào)的位置;
[0063] 分析模塊還分析目標(biāo)文件中是否有重定位符號(hào),如果目標(biāo)文件中有重定位符號(hào), 修復(fù)模塊還配置為包括對(duì)重定位符號(hào)進(jìn)行修復(fù),具體方式可以采用對(duì)目標(biāo)文件中的所有重 定位符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置變形后指令的長度,以及垃圾指令插入的位置及 垃圾指令的長度,來修復(fù)重定位符號(hào)。
[0064] 為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì) 本發(fā)明進(jìn)一步詳細(xì)說明。
[0065] 以下以微軟Windows系統(tǒng)下32位的obj文件為例,來描述申請(qǐng)實(shí)施例提供的保護(hù) 的具體過程。微軟Windows操作系統(tǒng)上的obj文件格式是C0FF文件格式。C0FF稱為通用 對(duì)象文件格式,C0FF的全稱是Common Object File Format,微軟的編譯器產(chǎn)生的目標(biāo)文件 就是C0FF文件格式。
[0066] C0FF文件結(jié)構(gòu)如圖3所示,主要頭結(jié)構(gòu)(C0FF HEADER),區(qū)段結(jié)構(gòu)(Section Headers)、區(qū)段數(shù)據(jù)(Raw Data)。C0FF文件各個(gè)部分的詳細(xì)定義可參閱微軟windows系統(tǒng) 的聯(lián)機(jī)幫助,在此不做過多介紹。
[0067] 為了方便說明,本實(shí)施例給出了一個(gè)具體的obj文件,本文obj文件的實(shí)現(xiàn)了一個(gè) 求字符串長度的功能,文件名稱為strlen. obj。
[0068] 0b j文件的C語言源代碼為:
[0069] /* 函數(shù)的輸入?yún)?shù)為一個(gè)字符串S,輸出參數(shù)為字符串的長度 size_t --cdecl --strlen(const char *s) { 卜 將返回值賦值為0 %! s i zo_t rot = 0; 取字符串中的一個(gè)字符,若果字符不為空,將長度加1 */ while (s[ret]) { h 將長度加1 氺/ rcl++, } /* 返回字符串的長度 */ return ret; }
[0070] 如圖1所示,對(duì)obj文件保護(hù)的詳細(xì)步驟為:
[0071] 1.分析obj文件中的函數(shù)符號(hào),重定位符號(hào)、數(shù)據(jù)符號(hào);
[0072] 本實(shí)施例中strlen. obj中的函數(shù)符號(hào)為strlen,無重定位符號(hào),無數(shù)據(jù)符號(hào)。
[0073] 2.選擇需要保護(hù)的函數(shù)符號(hào);
[0074] 本實(shí)施例中選擇保護(hù)的函數(shù)為strlen。
[0075] 3.利用反匯編模塊,根據(jù)機(jī)器碼指令的編碼規(guī)則,對(duì)需要保護(hù)的函數(shù)進(jìn)行反匯編, 將機(jī)器指令反編譯成匯編語言;
[0076] 對(duì)strlen函數(shù)反匯編后,生成的匯編語言如下:
[0077] strlen. obj文件中strlen函數(shù)的匯編代碼為:
[0078] /* 將字符串參數(shù)地址放入ecx寄存器 */ raov ecx, dword ptr [esp+4] /* 將eax寄存器清零 xor eax, eax /* 取參數(shù)的第一個(gè)字節(jié),和寄存器al進(jìn)行比較 φ/ cmp byte ptr [ecx], al / * 如果參數(shù)的第一個(gè)字節(jié)為空,直接跳轉(zhuǎn)到返回地址 */ jo 00000011 /* eax加1,eax存儲(chǔ)的是參數(shù)長度 本/ inc eax A 繼續(xù)以eax作為偏移,取參數(shù)中的一個(gè)字節(jié),與零進(jìn)行比較 */ cmp byte ptr [eax+ecx], 0 /* 如果參數(shù)中的字符不為0,則跳轉(zhuǎn)到地址〇A處 V
[0079] jne OOOOOOOA /* 函數(shù)返回,參數(shù)長度存儲(chǔ)在eax中 氺 rot
[0080] 4.利用變形模塊,根據(jù)需要保護(hù)的函數(shù)的指令,利用預(yù)先設(shè)計(jì)的變形后的指令模 版,對(duì)指令進(jìn)行替換;
[0081] 在本實(shí)施例中,對(duì)ret指令進(jìn)行變形,ret指令等價(jià)的代碼為:
[0082] /* 對(duì)堆棧進(jìn)行平衡 氺/ add esp, 4 卜 跳轉(zhuǎn)到目的地址 氺/ jmp dword ptr[esp - 4];
[0083] 5.利用垃圾指令插入模塊,在需要保護(hù)的函數(shù)內(nèi)部,選擇位置,插入垃圾指令;
[0084] 在本實(shí)施例中在strlen. obj文件中strlen函數(shù)每條匯編指令的后面都插入垃圾 指令,最后一條匯編指令后面不插入垃圾指令。
[0085] 在本實(shí)施例中,插入的垃圾指令為
[0086] /氺 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到LABF丄1 氺/ je LABEM /氺 如果標(biāo)志寄存器中的零標(biāo)志位不為零則跳轉(zhuǎn)到LABEI.1 */ jnz LABEL 1 call指令的機(jī)器碼,迷惑調(diào)試器使用
[0087] */ _EMIT 0xE8 /氺 標(biāo)簽 氺/ LABEM :
[0088] 6.如果函數(shù)內(nèi)部有跳轉(zhuǎn)指令,利用修復(fù)模塊修改跳轉(zhuǎn)指令,由于對(duì)需要保護(hù)的函 數(shù)中的指令進(jìn)行了變形,插入了垃圾指令,導(dǎo)致跳轉(zhuǎn)指令跳轉(zhuǎn)的偏移發(fā)生了變化,根據(jù)跳轉(zhuǎn) 指令及跳轉(zhuǎn)的目的地址中間之間由于指令變形及垃圾指令增加的偏移對(duì)跳轉(zhuǎn)指令進(jìn)行修 改;
[0089] 本實(shí)施例中需要修改的第一條跳轉(zhuǎn)指令為
[0090] je 00000011 修改后的跳轉(zhuǎn)指令為 jc short 0000003 需要修改的第二條跳轉(zhuǎn)指令為 jno 0000000A, 修改后的跳轉(zhuǎn)指令為 jnz short 000000IE 對(duì)指令進(jìn)行變形,插入垃圾指令后的結(jié)果為: /* 將參數(shù)地址放入ecx寄存器 氺/ mov ecx, dword ptr [esp+4] /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到00000009; */ je short 00000009 /氺 如果標(biāo)志寄存器中的零標(biāo)志位不為零則跳轉(zhuǎn)到00000009 氺/ jnz short, 00000009
[0091] /* call指令的機(jī)器碼,迷惑調(diào)試器使用 */ E8 /氺 將eax寄存器清零 */ 00000009:xor eax, eax /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到000000010 本/ je short 00000010 / ^ 如果標(biāo)志寄存器中的零標(biāo)志位不為零則跳轉(zhuǎn)到00000010; */ jnz short 00000010 /氺 call指令的機(jī)器碼,迷惑調(diào)試器使用 氺/ E8 /* 取參數(shù)的第一個(gè)字節(jié),和寄存器al進(jìn)行比較 +/ 00000010:cmp byto plr [ocx], al /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到00000017 */ je short 00000017 / * 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到00000017 */
[0092] jnz short 00000017 /氺 call指令的機(jī)器碼,迷惑調(diào)試器使用 E8 /* 如果參數(shù)的第一個(gè)字節(jié)為空,直接跳轉(zhuǎn)到返回地址 */ 00000017:je short 00000034 /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到0 0 000 01E; */ je short 000000IE 如果標(biāo)志寄存器中的零標(biāo)志位為不為零則跳轉(zhuǎn)到0000001E; 傘/ jnz short 0000001E /* call指令的機(jī)器碼,迷惑調(diào)試器使用 本/ E8 1% eax加1,eax存儲(chǔ)的是參數(shù)長度 */ 0000001E: inc eax /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到00000024 */ je short 00000024 Λ 如果標(biāo)志寄存器中的零標(biāo)志位為不為零則跳轉(zhuǎn)到00000024
[0093] jnz short, 00000021 /* call指令的機(jī)器碼,迷惑調(diào)試器使用 */ E8 /* 繼續(xù)以eax作為偏移,取參數(shù)中的一個(gè)字節(jié),與零進(jìn)行比較 00000024: cmp byte ptr [eax+ecx], 0 /本 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到0000002D */ je short 0000002D /* 如果標(biāo)志寄存器中的零標(biāo)志位為零則跳轉(zhuǎn)到0000002D 氺/ jnz snort 0000002D /氺 call指令的機(jī)器碼,迷惑調(diào)試器使用 幸/ E8 /本 如果參數(shù)中的字符不為0,則跳轉(zhuǎn)到地址1E處 本/ 0000002(1: jnz short 0000001E /氺 如果標(biāo)忐寄存器中的零標(biāo)忐位為零則跳轉(zhuǎn)到00000034 */ je short 00000034 I、
[0094] 如果標(biāo)志寄存器中的零標(biāo)志位為不為零則跳轉(zhuǎn)到00000034; */ jnz short 00000034 /氺 call指令的機(jī)器碼,迷惑調(diào)試器使用 */ E8 /Φ 對(duì)堆棧進(jìn)行平衡 */ 00000034: add esp, 4 /* 跳轉(zhuǎn)到目的地址 */ jmp dword ptr [esp-4]
[0095] 7.修改函數(shù)符號(hào),對(duì)obj文件中的所有符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置及垃 圾指令插入的位置,修改符號(hào)的位置及長度;
[0096] 本實(shí)施例中strlen函數(shù)符號(hào)的位置不變,長度增加,增加的長度為插入的花指令 的長度以及由于變形ret指令增加的長度。
[0097] 8.如果obj文件中有數(shù)據(jù)符號(hào),對(duì)obj文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變 形的位置及變形后指令的長度,根據(jù)垃圾指令插入的位置及垃圾指令的長度,修改數(shù)據(jù)符 號(hào)的位置;
[0098] 在本實(shí)施例中沒有數(shù)據(jù)符號(hào),不需要修改。
[0099] 9.如果obj文件中有重定位符號(hào),則修改重定位符號(hào),對(duì)obj文件中的所有重定位 符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置及垃圾指令插入的位置,修改重定位符號(hào);
[0100] 在本實(shí)施例中沒有重定位符號(hào),不需要修改。
[0101] 10.修改需要保護(hù)的函數(shù)指令字節(jié)碼,根據(jù)需要保護(hù)的函數(shù)的原始指令、變形后的 指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,修改保護(hù)后的函數(shù)的指令;
[0102] 在本實(shí)施例中,根據(jù)strlen函數(shù)的原始指令,變形后的ret指令,插入的垃圾指令 及兩條修改后的跳轉(zhuǎn)指令,修改保護(hù)后的strlen函數(shù)的指令。
[0103] 分析模塊,分析obj文件中的函數(shù)符號(hào)、重定位符號(hào)、數(shù)據(jù)符號(hào);
[0104] 反匯編模塊,根據(jù)函數(shù)的機(jī)器指令,將機(jī)器指令反編譯為匯編語言指令;
[0105] 變形模塊,對(duì)需要保護(hù)的函數(shù),利用反匯編模塊進(jìn)行反匯編,生成匯編語言指令, 利用預(yù)先設(shè)計(jì)的變形指令模版對(duì)可以變形的指令進(jìn)行指令替換;
[0106] 垃圾指令插入模塊,對(duì)需要保護(hù)的函數(shù),利用反匯編模塊進(jìn)行反匯編,生成匯編語 言指令,在需要保護(hù)的函數(shù)內(nèi)部,選擇位置,插入垃圾指令;
[0107] 修復(fù)模塊,由于對(duì)需要保護(hù)的函數(shù)進(jìn)行了指令變形和垃圾指令插入,需要對(duì)需要 保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù),對(duì)函數(shù)符號(hào)進(jìn)行修復(fù),對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù),對(duì)重定 位符號(hào)進(jìn)行修復(fù),對(duì)保護(hù)后的函數(shù)的指令進(jìn)行修復(fù),生成保護(hù)后的obj文件。
[0108] 與現(xiàn)有技術(shù)相比,本發(fā)明的目標(biāo)文件的保護(hù)方法及保護(hù)系統(tǒng)的有益效果在于:通 過首先分析obj文件中的函數(shù)符號(hào)、重定位符號(hào)、數(shù)據(jù)符號(hào),選擇需要保護(hù)的函數(shù)符號(hào),對(duì) 函數(shù)進(jìn)行反匯編,對(duì)指令進(jìn)行變形,在指令中間插入垃圾指令,修復(fù)函數(shù)的跳轉(zhuǎn)指令,修復(fù) Obj文件中的函數(shù)符號(hào)、數(shù)據(jù)符號(hào)、重定位符號(hào),從而對(duì)軟件形成一個(gè)整體地保護(hù),對(duì)obj文 件進(jìn)行保護(hù),可以增加保護(hù)的范圍,增加了反編譯和分析的難度,大大提高了軟件的安全 性。
[0109] 以上實(shí)施例僅為本發(fā)明的示例性實(shí)施例,不用于限制本發(fā)明,本發(fā)明的保護(hù)范圍 由權(quán)利要求書限定。本領(lǐng)域技術(shù)人員可以在本發(fā)明的實(shí)質(zhì)和保護(hù)范圍內(nèi),對(duì)本發(fā)明做出各 種修改或等同替換,這種修改或等同替換也應(yīng)視為落在本發(fā)明的保護(hù)范圍內(nèi)。
【權(quán)利要求】
1. 一種目標(biāo)文件的保護(hù)方法,其特征在于,對(duì)于軟件中的各目標(biāo)文件中的需要保護(hù)的 函數(shù)進(jìn)行反匯編后,對(duì)函數(shù)的指令進(jìn)行變形,并在函數(shù)內(nèi)插入垃圾指令,從而對(duì)各目標(biāo)文件 進(jìn)行保護(hù)以形成對(duì)軟件的整體保護(hù)。
2. 根據(jù)權(quán)利要求1所述的目標(biāo)文件的保護(hù)方法,其特征在于,具體包括以下步驟: S10 :分析目標(biāo)文件中的函數(shù)符號(hào),并且選擇需要保護(hù)的函數(shù)對(duì)應(yīng)的函數(shù)符號(hào); S20:根據(jù)機(jī)器碼指令的編碼規(guī)則,對(duì)所述需要保護(hù)的函數(shù)進(jìn)行反匯編,從而將機(jī)器指 令反編譯成匯編語言指令; S30 :利用預(yù)先設(shè)計(jì)的變形指令模版,對(duì)所述匯編語言指令中的能變形的指令進(jìn)行指令 替換; 540 :在所述匯編語言指令中的選定位置處插入垃圾指令; 550 :修改所述函數(shù)符號(hào); S60 :修改所述需要保護(hù)的函數(shù)的指令字節(jié)碼。
3. 根據(jù)權(quán)利要求2所述的目標(biāo)文件的保護(hù)方法,其特征在于,如果函數(shù)內(nèi)部有跳轉(zhuǎn)指 令,則步驟S40與步驟S50之間還包括: 541 :根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址之間由于指令變形及垃圾指令增加的偏移所發(fā) 生的變化,對(duì)跳轉(zhuǎn)指令進(jìn)行修改。
4. 根據(jù)權(quán)利要求2所述的目標(biāo)文件的保護(hù)方法,其特征在于,如果目標(biāo)文件中有數(shù)據(jù) 符號(hào),則步驟S10還包括分析所述數(shù)據(jù)符號(hào),且步驟S50與步驟S60之間還包括: 551 :修改所述數(shù)據(jù)符號(hào)。
5. 根據(jù)權(quán)利要求2所述的目標(biāo)文件的保護(hù)方法,其特征在于,如果目標(biāo)文件中有重定 位符號(hào),則步驟S10還包括分析所述重定位符號(hào),且步驟S50與步驟S60之間還包括: 552 :修改所述重定位符號(hào)。
6. 根據(jù)權(quán)利要求4所述的目標(biāo)文件的保護(hù)方法,其特征在于,步驟S51具體為:對(duì)目標(biāo) 文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的位置和變形后指令的長度,以及垃圾指令 插入的位置及垃圾指令的長度,來修改所述數(shù)據(jù)符號(hào)的位置。
7. 根據(jù)權(quán)利要求5所述的目標(biāo)文件的保護(hù)方法,其特征在于,步驟S52具體為:對(duì)目標(biāo) 文件中的所有重定位符號(hào)進(jìn)行掃描,根據(jù)指令變形的位置和變形后指令的長度,以及垃圾 指令插入的位置及垃圾指令的長度,來修改所述重定位符號(hào)。
8. 根據(jù)權(quán)利要求2所述的目標(biāo)文件的保護(hù)方法,其特征在于,步驟S50具體為:對(duì)目標(biāo) 文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的位置及變形后指令的長度,以及垃圾指令 插入的位置及垃圾指令的長度,來修改所述函數(shù)符號(hào)的位置及長度。
9. 根據(jù)權(quán)利要求2所述的目標(biāo)文件的保護(hù)方法,其特征在于,步驟S60具體為:根據(jù)需 要保護(hù)的函數(shù)的原始指令、變形后的指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修改經(jīng) 保護(hù)處理后的函數(shù)的指令字節(jié)碼。
10. -種基于權(quán)利要求1所述的方法的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,包括: 分析模塊,其配置為分析目標(biāo)文件中的函數(shù)符號(hào); 反匯編模塊,其配置為根據(jù)機(jī)器碼指令的編碼規(guī)則,將需要保護(hù)的函數(shù)的機(jī)器指令反 編譯為匯編語言指令; 變形模塊,其配置為利用預(yù)先設(shè)計(jì)的變形指令模版對(duì)所述反匯編模塊生成的所述匯編 語言指令中的能變形的指令進(jìn)行指令替換; 垃圾指令插入模塊,其配置為在所述匯編語言指令中的選定位置處插入垃圾指令; 修復(fù)模塊,其配置為對(duì)進(jìn)行了指令變形和垃圾指令插入的所述需要保護(hù)的函數(shù)進(jìn)行修 復(fù)并且對(duì)其他函數(shù)符號(hào)進(jìn)行相應(yīng)修復(fù);對(duì)經(jīng)保護(hù)處理后的函數(shù)的指令進(jìn)行修復(fù),以生成保 護(hù)后的目標(biāo)文件。
11. 根據(jù)權(quán)利要求10所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,如果函數(shù)內(nèi)部有跳轉(zhuǎn) 指令,所述修復(fù)模塊還配置為包括對(duì)需要保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù)。
12. 根據(jù)權(quán)利要求10所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述分析模塊還配置 為分析目標(biāo)文件中的數(shù)據(jù)符號(hào),如果目標(biāo)文件中有數(shù)據(jù)符號(hào),所述修復(fù)模塊還配置為包括 對(duì)數(shù)據(jù)符號(hào)進(jìn)行修復(fù)。
13. 根據(jù)權(quán)利要求10所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述分析模塊還配置 為分析目標(biāo)文件中的重定位符號(hào),如果目標(biāo)文件中有重定位符號(hào),所述修復(fù)模塊還配置為 包括對(duì)重定位符號(hào)進(jìn)行修復(fù)。
14. 根據(jù)權(quán)利要求10所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述修復(fù)模塊對(duì)函數(shù) 符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的 位置及變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來修復(fù)函數(shù)符號(hào) 的位置及長度。
15. 根據(jù)權(quán)利要求11所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述修復(fù)模塊對(duì)保護(hù) 后的函數(shù)的指令進(jìn)行修復(fù)的方式具體配置為:根據(jù)需要保護(hù)的函數(shù)的原始指令、變形后的 指令、插入的垃圾指令、修改后的跳轉(zhuǎn)指令,來修復(fù)經(jīng)保護(hù)處理后的函數(shù)的指令字節(jié)碼。
16. 根據(jù)權(quán)利要求15所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述修復(fù)模塊對(duì)需要 保護(hù)的函數(shù)內(nèi)部的跳轉(zhuǎn)指令進(jìn)行修復(fù)的方式具體配置為:根據(jù)跳轉(zhuǎn)指令及跳轉(zhuǎn)的目的地址 之間由于指令變形及垃圾指令增加的偏移所發(fā)生的變化,來對(duì)跳轉(zhuǎn)指令進(jìn)行修復(fù)。
17. 根據(jù)權(quán)利要求16所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述修復(fù)模塊對(duì)數(shù)據(jù) 符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件中的所有符號(hào)表進(jìn)行掃描,根據(jù)指令變形的 位置變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來修復(fù)數(shù)據(jù)符號(hào)的 位置。
18. 根據(jù)權(quán)利要求17所述的目標(biāo)文件的保護(hù)系統(tǒng),其特征在于,所述修復(fù)模塊對(duì)重定 位符號(hào)進(jìn)行修復(fù)的方式具體配置為:對(duì)目標(biāo)文件中的所有重定位符號(hào)進(jìn)行掃描,根據(jù)指令 變形的位置變形后指令的長度,以及垃圾指令插入的位置及垃圾指令的長度,來修復(fù)重定 位符號(hào)。
【文檔編號(hào)】G06F21/10GK104063635SQ201410313183
【公開日】2014年9月24日 申請(qǐng)日期:2014年7月2日 優(yōu)先權(quán)日:2014年7月2日
【發(fā)明者】孫吉平, 韓勇 申請(qǐng)人:北京深思數(shù)盾科技有限公司