本發(fā)明涉及軟件安全技術(shù)領(lǐng)域,具體涉及基于虛擬函數(shù)表替換的軟件安全防護(hù)方法。
背景技術(shù):
隨著計(jì)算機(jī)安全領(lǐng)域相關(guān)技術(shù)的飛速發(fā)展,在沒有源代碼的情況下對(duì)于各類軟件的分析越來越容易。近年來,動(dòng)態(tài)分析技術(shù)以及軟件逆向技術(shù)等都已得到充分的發(fā)展,在幫助科研者更加精確地分析惡意軟件的同時(shí),也存在損害正常軟件知識(shí)產(chǎn)權(quán)的可能性。
逆向工程屬于正向工程的反轉(zhuǎn)過程,是一個(gè)設(shè)計(jì)恢復(fù)的過程。目的是通過分析目標(biāo)軟件或者特定系統(tǒng),從而認(rèn)定其主要的架構(gòu)以及各類構(gòu)件的屬性和構(gòu)件之間的交互關(guān)系,同時(shí)通過抽象高層設(shè)計(jì)來表現(xiàn)構(gòu)件之間的相互聯(lián)系。其基本原理是抽取軟件系統(tǒng)的核心要素而隱藏技術(shù)實(shí)現(xiàn)的細(xì)節(jié),然后使用抽象的結(jié)構(gòu)在高層上描述軟件系統(tǒng)。逆向工程主要遵從數(shù)據(jù)集采集、知識(shí)組織、信息瀏覽的執(zhí)行順序。主要的數(shù)據(jù)采集很大程度上依賴于知識(shí)組織的完成性。同時(shí),信息瀏覽是整個(gè)過程的關(guān)鍵行為,對(duì)于原始程序的邏輯設(shè)計(jì)理解都是在信息瀏覽中進(jìn)行的。信息瀏覽通過遍歷目標(biāo)軟件中的多維結(jié)構(gòu),按計(jì)算機(jī)領(lǐng)域的劃分標(biāo)準(zhǔn)分析以及過濾信息。逆向工程獲取的系統(tǒng)結(jié)構(gòu)相比直接的高級(jí)語言編寫的源代碼更符合設(shè)計(jì)者的實(shí)際邏輯和接近實(shí)際應(yīng)用,同時(shí)在抽象層上對(duì)軟件系統(tǒng)的提取表示要更加便于理解。
逆向工程在沒有源代碼的情況下,通過二進(jìn)制文件恢復(fù)系統(tǒng)的核心設(shè)計(jì),是一種高可用的分析惡意軟件技術(shù),但是在另一方面,也給正常軟件的知識(shí)產(chǎn)權(quán)保護(hù)帶來了難題。不法者通過逆向工程技術(shù)能夠獲取到正常軟件的各類核心信息,以還原正常的軟件,從而破壞了軟件的知識(shí)產(chǎn)權(quán)。逆向工程技術(shù)僅僅是軟件恢復(fù)的一種技術(shù),計(jì)算機(jī)安全領(lǐng)域還涉及有其他的技術(shù)用于軟件的抽象,所以為了保護(hù)軟件的安全性,本發(fā)明提出了一種軟件核心功能與輔助功能分開加載以及編譯的代碼編寫技術(shù),能夠有效地保護(hù)軟件系統(tǒng)的安全性。
本發(fā)明基于高級(jí)語言的虛函數(shù)機(jī)制。某些高級(jí)語言為了實(shí)現(xiàn)多態(tài)的機(jī)制,構(gòu)建了虛函數(shù)。虛函數(shù)的實(shí)現(xiàn)通過一張?zhí)摵瘮?shù)表,在虛函數(shù)表中,保存著當(dāng)前類中所有虛函數(shù)的地址,當(dāng)前類實(shí)例化后,此表便被分配到實(shí)例的內(nèi)存中。無論對(duì)象實(shí)例被分配到內(nèi)存中的何處,虛函數(shù)表都會(huì)被分配到實(shí)例的最前面的四個(gè)字節(jié)處,所以能夠通過獲取實(shí)例對(duì)象的地址間接獲取到虛函數(shù)表的地址,以此來獲取實(shí)例對(duì)象中所有虛函數(shù)的內(nèi)存地址。
本發(fā)明還涉及RC4加密算法和MD5加密算法的運(yùn)用。RC4為對(duì)稱加密算法,其不是對(duì)明文進(jìn)行分組加密,而是以字節(jié)流的方式對(duì)明文的每個(gè)字節(jié)進(jìn)行加密,解密的時(shí)候?qū)γ芪闹械拿總€(gè)字節(jié)進(jìn)行依次解密。RC4加密算法的特點(diǎn)是算法實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行速度快,并且密鑰長(zhǎng)度可變。RC4加密算法分為三個(gè)步驟,首先初始化狀態(tài)向量S和臨時(shí)向量T,然后初始排列S,最后產(chǎn)生密鑰流。MD5加密算法即為信息摘要算法,用于保證信息的一致性和完整性。MD5算法能夠?qū)⑷我忾L(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換成固定長(zhǎng)度的HASH值,其抗修改性和強(qiáng)抗碰撞的特點(diǎn)可以將此HASH值作為其他加密算法的密鑰,更大程度地保護(hù)加密文件的安全性。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)上述現(xiàn)有技術(shù),本發(fā)明目的在于提供基于虛擬函數(shù)表替換的軟件安全防護(hù)方法,解決現(xiàn)有軟件防護(hù)技術(shù)其機(jī)器碼生成環(huán)境與其運(yùn)行環(huán)境相異時(shí),存在系統(tǒng)函數(shù)地址獲取失敗等技術(shù)問題。
為達(dá)到上述目的,本發(fā)明采用的技術(shù)方案如下:
基于虛擬函數(shù)表替換的軟件安全防護(hù)方法,包括如下步驟,
步驟1、根據(jù)預(yù)加載的核心功能函數(shù)特征,獲取存放有核心二進(jìn)制代碼的加密文件;
步驟2、在當(dāng)前運(yùn)行環(huán)境,尋找應(yīng)用程序接口函數(shù)地址和動(dòng)態(tài)鏈接庫地址,將尋找到的應(yīng)用程序接口函數(shù)地址和動(dòng)態(tài)鏈接庫地址,按虛函數(shù)表中虛函數(shù)存放結(jié)構(gòu)保存于各個(gè)虛函數(shù)自定義的數(shù)據(jù)結(jié)構(gòu)中;
步驟3、定義代理類類型指針指向存放有應(yīng)用程序接口函數(shù)地址和動(dòng)態(tài)鏈接庫地址的數(shù)據(jù)結(jié)構(gòu),獲得重構(gòu)的虛函數(shù)表數(shù)據(jù)結(jié)構(gòu);
步驟4、獲取運(yùn)行內(nèi)存,根據(jù)重構(gòu)的虛函數(shù)表數(shù)據(jù)結(jié)構(gòu)和加密文件,通過在運(yùn)行內(nèi)存中替換代理類類型指針的地址,加載核心二進(jìn)制代碼至運(yùn)行內(nèi)存,從而在加密防護(hù)下正常運(yùn)行程序。
上述方法中,所述的步驟1,包括如下步驟
步驟1.1、加載核心功能函數(shù)代碼到內(nèi)存,獲取核心功能函數(shù)的首地址和體空間大??;
步驟1.2、根據(jù)首地址和體空間大小,讀取內(nèi)存中的核心二進(jìn)制代碼,將核心二進(jìn)制代碼存入文件;
步驟1.3、利用MD5加密算法計(jì)算文件的哈希值;
步驟1.4、利用文件的哈希值作為密鑰,采用RC4加密算法獲得加密文件。
上述方法中,所述的步驟2,包括如下步驟
步驟2.1、在當(dāng)前運(yùn)行環(huán)境,虛函數(shù)表類中按照核心功能的系統(tǒng)函數(shù)調(diào)用順序,分別依次調(diào)用相同的應(yīng)用程序接口函數(shù)和動(dòng)態(tài)鏈接庫,找出應(yīng)用程序接口函數(shù)地址和動(dòng)態(tài)鏈接庫地址;
步驟2.2、將尋找到的應(yīng)用程序接口函數(shù)地址和動(dòng)態(tài)鏈接庫地址,按虛函數(shù)表中虛函數(shù)存放結(jié)構(gòu)保存于各個(gè)虛函數(shù)自定義的數(shù)據(jù)結(jié)構(gòu)中。
上述方法中,所述的步驟4,包括如下步驟,
步驟4.1、獲取運(yùn)行內(nèi)存,解密并讀取加密文件內(nèi)的核心二進(jìn)制代碼至運(yùn)行內(nèi)存;
步驟4.2、調(diào)用重構(gòu)的虛函數(shù)表數(shù)據(jù)結(jié)構(gòu)作為運(yùn)行參數(shù)代入運(yùn)行內(nèi)存,替換代理類類型指針的地址;
步驟4.3、重新加載核心二進(jìn)制代碼至運(yùn)行內(nèi)存,從而在加密防護(hù)下正常運(yùn)行程序。
每款軟件都擁有核心重要的功能實(shí)現(xiàn)模塊,這些模塊往往是軟件最具有價(jià)值的部分,如果此類設(shè)計(jì)被不法者獲得,將使得軟件的知識(shí)產(chǎn)權(quán)得不到應(yīng)有的保護(hù)。所以本發(fā)明的主要目的便是保護(hù)此部分的源代碼以及設(shè)計(jì)思想。
將核心代碼加載入內(nèi)存中然后取出放入到特定文件中保存。核心功能代碼在編寫完成后首先單獨(dú)加載入內(nèi)存中。根據(jù)PE文件的固定格式,計(jì)算文件加載的偏移位置,能夠正確地獲取函數(shù)加載的內(nèi)存入口,即函數(shù)加載的首地址。同時(shí),代碼加載入內(nèi)存后,找尋代碼結(jié)束的位置(存在特殊符號(hào)),以此獲取代碼加載的大小。高級(jí)語言加載入內(nèi)存之前會(huì)編譯成二進(jìn)制代碼,即內(nèi)存中運(yùn)行的是核心功能的二進(jìn)制代碼,這二進(jìn)制代碼正是本發(fā)明需要的部分。通過函數(shù)加載的首地址以及大小,能夠從內(nèi)存中提取出完整的核心二進(jìn)制代碼。當(dāng)二進(jìn)制代碼提取出來后,將其保存在特定的文件中,方便之后程序的運(yùn)行。
對(duì)于存放二進(jìn)制代碼的文件,本發(fā)明也考慮到其安全性,所以采用MD5和RC4加密算法對(duì)文件進(jìn)行加密。首先,利用MD5加密算法計(jì)算文件的HASH值,因?yàn)镸D5算法的特性,其生成的HASH值具有唯一性,安全性較高。然后,采用RC4加密算法,將之前生成的HASH值作為密鑰,存放二進(jìn)制代碼的文件作為輸入,生成加密后的特定文件,從而保護(hù)文件的安全性和完整性。
虛表重構(gòu)模塊:
當(dāng)核心代碼的二進(jìn)制文件生成的平臺(tái)與輔助核心代碼加載的程序運(yùn)行的平臺(tái)不一致時(shí),便會(huì)出現(xiàn)二進(jìn)制文件無法正常運(yùn)行的情況,為了解決此類問題,本發(fā)明利用高級(jí)語言的虛函數(shù)機(jī)制保證程序的正常運(yùn)行。
核心代碼在編寫的時(shí)候,對(duì)于每一個(gè)系統(tǒng)調(diào)用,都構(gòu)建虛函數(shù)來完成,保證系統(tǒng)調(diào)用在虛函數(shù)中實(shí)現(xiàn),由于每個(gè)虛函數(shù)的地址都存放在虛函數(shù)表中,虛函數(shù)表的地址存放在對(duì)象的固定位置,所以能夠很方便地找尋到系統(tǒng)調(diào)用的實(shí)際內(nèi)存位置,便于運(yùn)行時(shí)替換。
加載核心代碼的程序運(yùn)行的平臺(tái)即為軟件運(yùn)行的平臺(tái),所以需要在此平臺(tái)下獲取所需系統(tǒng)調(diào)用的地址。在輔助加載的程序中重新自定義一個(gè)VirtualTable類,用于替換核心代碼中的系統(tǒng)調(diào)用。VirtualTable類中按照虛函數(shù)表中系統(tǒng)調(diào)用的順序,分別依次調(diào)用相同的API和DLL,這樣能夠幫助各類調(diào)用正常地在當(dāng)前的系統(tǒng)中運(yùn)行。這個(gè)類在核心代碼運(yùn)行的時(shí)候?qū)⒆鳛閰?shù)傳入,幫助其在當(dāng)前平臺(tái)下正常執(zhí)行。
核心機(jī)器碼加載:
核心機(jī)器碼的運(yùn)行依賴于輔助的加載程序,加載程序通過解密經(jīng)RC4加密的文件獲取到原始的機(jī)器碼,再將機(jī)器碼加載入內(nèi)存中運(yùn)行。加載程序利用VirtualTable類獲取當(dāng)前平臺(tái)下系統(tǒng)API以及DLL的地址,將此類作為參數(shù)傳入到機(jī)器碼中,所以當(dāng)核心機(jī)器碼運(yùn)行在當(dāng)前平臺(tái)時(shí),其所有的系統(tǒng)調(diào)用已經(jīng)被VirtualTable類替換,保證了程序的正常運(yùn)行。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果:
利用核心功能函數(shù)預(yù)加載與實(shí)際執(zhí)行相分離的技術(shù),同時(shí)借助虛擬函數(shù)表機(jī)制完成軟件防護(hù)功能;機(jī)器碼生成環(huán)境與其運(yùn)行環(huán)境相異時(shí),各類API和DLL依然能夠正常地調(diào)用和運(yùn)行。
附圖說明
圖1整體設(shè)計(jì)架構(gòu);
圖2核心代碼生成模塊的流程圖;
圖3核心代碼運(yùn)行模塊的流程圖。
具體實(shí)施方式
本說明書中公開的所有特征,或公開的所有方法或過程中的步驟,除了互相排斥的特征和/或步驟以外,均可以以任何方式組合。
下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步說明:
實(shí)施例1
核心代碼生成模塊
核心代碼生成模塊主要利用虛函數(shù)機(jī)制,將系統(tǒng)調(diào)用都經(jīng)過虛函數(shù)實(shí)現(xiàn),然后加載入內(nèi)存,生成二進(jìn)制代碼,具體流程如下所示:
a)構(gòu)建包含虛函數(shù)的類;
b)按照所需系統(tǒng)API的調(diào)用順序,完成每個(gè)虛函數(shù)的編寫;
c)代碼利用虛函數(shù)完成系統(tǒng)調(diào)用;
d)加載核心代碼入內(nèi)存;
e)獲取代碼加載的首地址;
f)獲取代碼加載的大??;
g)根據(jù)首地址和大小,將二進(jìn)制代碼從內(nèi)存中取出;
h)保存二進(jìn)制代碼到特定文件;
i)利用MD5加密算法生成特定文件的HASH值;
j)利用RC4加密算法,將HASH值作為密鑰加密文件;
k)保存文件。
上述技術(shù)方案中虛表重構(gòu)模塊設(shè)計(jì)如下:
虛表重構(gòu)模塊根據(jù)高級(jí)語言自帶的虛函數(shù)機(jī)制的特點(diǎn)構(gòu)建自己的VirtualTable類,輔助核心代碼的運(yùn)行。
VirtualTable類的構(gòu)建。VirtualTable類的構(gòu)建屬于編碼范疇,運(yùn)用高級(jí)語言編寫VirtualTable類時(shí),按照核心代碼中系統(tǒng)API的調(diào)用順序,分別調(diào)用相應(yīng)的函數(shù)。
上述技術(shù)方案中核心機(jī)器碼加載設(shè)計(jì)如下:
核心機(jī)器碼在平臺(tái)運(yùn)行時(shí),需要輔助的加載程序和機(jī)器碼共同完成,所以需要協(xié)調(diào)他們的有效合作。
首先,輔助的加載程序運(yùn)用RC4算法解密之前加密的特定文件,獲取到原始完整的二進(jìn)制代碼。然后將加載程序中按照虛函數(shù)表中虛函數(shù)的調(diào)用順序構(gòu)建的VirtualTable類作為參數(shù)傳入二進(jìn)制代碼中,特?fù)Q其本身具有的虛函數(shù)表中的系統(tǒng)調(diào)用,幫助二進(jìn)制代碼在當(dāng)前平臺(tái)成功運(yùn)行。最后將核心機(jī)器碼加載入內(nèi)存中運(yùn)行。具體實(shí)現(xiàn)過程如下:
a)解密特定文件,獲取原始二進(jìn)制代碼;
b)調(diào)用VirtualTable類;
c)將VirtualTable類作為參數(shù)傳入二進(jìn)制文件;
d)替換虛函數(shù)表;
e)重新加載二進(jìn)制代碼入內(nèi)存;
運(yùn)行程序,等待輸出。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何屬于本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。