本發(fā)明涉及計算機(jī)技術(shù),尤其涉及一種基于模糊聚類的軟件保護(hù)虛擬機(jī)攻擊方法。
背景技術(shù):
軟件保護(hù)虛擬機(jī)是目前保護(hù)強(qiáng)度最高的軟件保護(hù)方案。在對軟件保護(hù)虛擬機(jī)保護(hù)的程序進(jìn)行分析的時候,通常有如下兩種方案。第一種是完全人工還原,也就是采用傳統(tǒng)的靜態(tài)看流程,動態(tài)看數(shù)據(jù)的逆向思路,將程序放入IDA和OllyDbg中執(zhí)行,單步執(zhí)行,一條條指令反復(fù)分析,最終破解程序。這種思路的不足之處在于費時費力,尤其是對于軟件保護(hù)虛擬機(jī)這種保護(hù)強(qiáng)度很高的保護(hù)方案來說,并不具有實際上的可操作性。第二種思路是思路主要是逆向虛擬機(jī)結(jié)構(gòu),化簡被混淆指令,將虛擬指令轉(zhuǎn)換為對應(yīng)的x86指令的方法來保護(hù)被還原的代碼。這種思路的不足之處在于,對虛擬機(jī)的結(jié)構(gòu)有較高的要求,不具有通用性。
技術(shù)實現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題在于針對現(xiàn)有技術(shù)中的缺陷,提供一種基于模糊聚類的軟件保護(hù)虛擬機(jī)攻擊方法,該方法結(jié)合FCM算法和N-Perm算法,提取軟件保護(hù)虛擬機(jī)中的Handler(虛擬機(jī)句柄),從而提高軟件保護(hù)虛擬機(jī)的攻擊逆向效率。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:一種基于模糊聚類的軟件保護(hù)虛擬機(jī)攻擊方法,包括以下步驟:
1)選取被軟件保護(hù)虛擬機(jī)保護(hù)的程序段,采用準(zhǔn)確度較高的反匯編引擎ODDisassm對程序進(jìn)行反匯編處理;
2)提取程序執(zhí)行流,將程序放入OllyDbg中執(zhí)行到程序結(jié)束位置,用OllyScript記錄被保護(hù)程序執(zhí)行的所有指令和執(zhí)行該指令后的寄存器的狀態(tài),將記錄的內(nèi)容作為數(shù)據(jù)流文件,以<指令,操作數(shù)1,操作數(shù)2,通用寄存器,標(biāo)志位寄存器>的格式按行存儲在本地文件中;
3)分析步驟2)產(chǎn)生的數(shù)據(jù)流文件,提取Handler,具體如下采用遞歸方案對其進(jìn)行裁剪。實施過程為如果第N行數(shù)據(jù)(即上文所提取到的按照<指令,操作數(shù)1,操作數(shù)2,通用寄存器,標(biāo)志位寄存器>的格式存儲在本地的文件)和第M行數(shù)據(jù)在執(zhí)行前后其通用寄存器和標(biāo)志位寄存器的值完全相同,那么第M-1行到第N行之間的數(shù)據(jù)流可以剪除,直接用NOP指令填充。
4)采用N-Perm算法提取各個Handler的特征值;
5)對Handler按照特征值相關(guān)性采用模糊聚類算法進(jìn)行聚類;
6)得到上述的聚類結(jié)果之后,分析其語義,帶入分析程序段,給出被保護(hù)程序的流程圖,從而實現(xiàn)對軟件保護(hù)虛擬機(jī)的攻擊。
按上述方案,所述步驟1)中采用OllyDbg反匯編引擎對程序進(jìn)行反匯編處理。
按上述方案,所述步驟3)中,提取Handler為采用遞歸方案對垃圾指令進(jìn)行剪裁,其遞歸方案為分析從前到后每一條指令,如果在此過程中,指令塊在執(zhí)行前后,對通用寄存器和標(biāo)志位寄存器的值沒有任何影響的話那么即可將第一條指令和第N條指令之間的區(qū)塊認(rèn)定為無效Handler,用NOP對其進(jìn)行填充。
按上述方案,所述步驟5)中對Handler特征值進(jìn)行聚類分析采用FCM模糊聚類算法。
FCM算法是將N個L維向量分為C個模糊組,通過迭代不斷更新隸屬度以及聚類中心,最小化目標(biāo)函數(shù)對數(shù)據(jù)進(jìn)行聚類。其中目標(biāo)函數(shù)為公式(1):
其中,J為聚合度,U是隸屬度矩陣中的元素,V是指是對應(yīng)于每個聚類的聚類中心,m是指m指的是模糊加權(quán)系數(shù),d(xi,vc)表示的是第i個數(shù)據(jù)點與第c個聚類中心的歐式距離。
本發(fā)明產(chǎn)生的有益效果是:能夠完成對軟件保護(hù)虛擬機(jī)Handler的自動收集,并按照代碼特征的關(guān)聯(lián)度進(jìn)行自動歸類。與以往的方法相比,效率有了很大提高,且通用性較強(qiáng),為之后的軟件保護(hù)虛擬機(jī)自動攻擊研究提供了基礎(chǔ)。
附圖說明
下面將結(jié)合附圖及實施例對本發(fā)明作進(jìn)一步說明,附圖中:
圖1是本發(fā)明實施例的方法流程圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合實施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明軟件保護(hù)虛擬機(jī)攻擊方案測試,本測試用例采用被VMP2.0(Virtual Machine Protect)保護(hù)后的程序片段進(jìn)行測試,采用準(zhǔn)確度高的反匯編引擎對程序進(jìn)行反匯編處理,采用IDA Pro對程序流程圖進(jìn)行觀察對比處理前后的程序,所采用的計算機(jī)系統(tǒng)平臺為Windows 7 64位旗艦版;CPU:Intel I5 4200M;內(nèi)存:DDR3 8G;硬盤:鎂光M4固態(tài)硬盤,讀數(shù)據(jù)速度500M/s,寫入速度270M/s。
本發(fā)明基于模糊聚類的軟件保護(hù)虛擬機(jī)攻擊方案,使得軟件保護(hù)虛擬機(jī)的攻擊方案實現(xiàn)了一定程度上的自動化處理,為下一步對軟件保護(hù)虛擬機(jī)進(jìn)行攻擊和保護(hù)提供了基礎(chǔ),參照圖1所示,該方案的具體步驟為:
一、選取被VMP保護(hù)后的程序片段
本實施例中,選取被VMP保護(hù)后的程序片段,采用OllyDbg反匯編引擎對程序進(jìn)行反匯編處理,并且標(biāo)明被保護(hù)程序段的起始位置和結(jié)束位置,其中VMP采用2.0版本。確定被保護(hù)程序段起始位置和結(jié)束位置的方法為,采用字符串定位方式,因為在VMP發(fā)布的SDK中,對被保護(hù)的程序起始位置和結(jié)束位置字符串分別為:“VMPBEGIN”,“VMPEND”。選取的被軟件保護(hù)虛擬機(jī)保護(hù)的程序段是被現(xiàn)有的軟件保護(hù)虛擬機(jī)進(jìn)行了代碼膨脹和指令流混淆。本實施例中,為了簡化操作,在選取程序片段的時候,只是選取虛擬機(jī)化保護(hù)手段,而不采取和其他保護(hù)方式相結(jié)合的混淆方式。
二、提取程序執(zhí)行流
本實施例中,將程序放入OllyDbg中執(zhí)行到程序結(jié)束位置,用OllyScript記錄程序執(zhí)行過程中所執(zhí)行的所有指令,將其按照<指令,操作數(shù)1,操作數(shù)2,通用寄存器,標(biāo)志位寄存器>的格式存儲在本地文本文件中。
三、分析數(shù)據(jù)流文件
本實施例中,結(jié)合提取程序執(zhí)行流步驟中獲取到的文本文件數(shù)據(jù),采用遞歸方案對其進(jìn)行裁剪。實施過程為如果第N行數(shù)據(jù)和第M行數(shù)據(jù)在執(zhí)行前后其通用寄存器和標(biāo)志位寄存器的值完全相同,那么兩行之間的數(shù)據(jù)流可以剪除,直接用NOP指令填充。
在下圖所示表中,所截取到的數(shù)據(jù)片段和處理過后的指令流片段分別為表1和表2所示。
表1剪除之前的指令流數(shù)據(jù)片段
表2剪除處理之后的指令流數(shù)據(jù)片段
其中,第(a)數(shù)據(jù)和第(c)行數(shù)據(jù)的寄存器完全相同,故而將(b),(c)兩行數(shù)據(jù)采用NOP指令填充,而寄存器的值全部替換為第(a)行數(shù)據(jù)中寄存器的值。
四、提取特征值
本實施例中,采用N-Perm算法提取代碼的特征值。以上一步中所提取的一個代碼片段為例,給出其代碼特征值。代碼片段如下所示。
代碼片段
push ebp;
mov eax,ebx;
sub eax,ebx;
push edi;
push esi;
lea eax,[edi];
push ebx;
mov eax,esi;
mov ebx,edx;
使用1-Perm算法,得到模式({push,mov,sub,lea,sub}),{4,3,1,1,1});使用2-Perm算法,得到模式({push-mov,mov-sub,sub-push,push-push,push-lea,lea-mov,mov-mov},{1,1,1,2,3,1,1}),其余N=3,N=4情況與之相似。
五、采用模糊聚類算法對其進(jìn)行模糊聚類
在本例中,因為提取到的Handler極多,所以采用三個比較有代表性的代碼片段為例說明模糊聚類算法在此處的應(yīng)用。代碼片段如表3所示。
表3測試代碼片段
用N-Perm算法對其進(jìn)行聚類,當(dāng)N=1,2時,特征值如表3,表4所示。
表4 N=1時,代碼特征值
表5 N=2時,代碼的特征值
由表4和表5所知,數(shù)據(jù)段(a)(b)(c)的特征即可以用二維數(shù)組表示,分別為表3和表4第一行,空位置用0填充。將得到的三個特征值,采用公式(1),將起始C的值設(shè)置為2,那么可以得出:Jab=0.84;Jac=0.31;Jbc=0.16,其中Jab是指(a)(b)兩個程序片段之間的關(guān)聯(lián)度,Jac是指(a)(c)兩個程序片段之間的關(guān)聯(lián)度,Jbc是指(b)(c)兩個程序片段之間的關(guān)聯(lián)度;因此可以判定(a)(b)程序段相關(guān)度高,將其歸為一類。(a)與(c),(b)與(c)相關(guān)度都很差,因此不是同語義Handler。
六、人工分析上一步所提取到的Handler,并對其進(jìn)行分類,并畫出程序的流程圖。完成對程序的攻擊。
應(yīng)當(dāng)理解的是,對本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進(jìn)或變換,而所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。