文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2012)10-0143-04
在互聯(lián)網(wǎng)高速發(fā)展的今天,網(wǎng)絡(luò)通信和網(wǎng)絡(luò)交易已經(jīng)成為日常生活不可分割的一部分。但病毒生成技術(shù)的提高,已經(jīng)嚴(yán)重影響到世界通信安全和國家的經(jīng)濟(jì)命脈。早期特征碼技術(shù)已經(jīng)無法單獨應(yīng)對現(xiàn)在的計算機(jī)病毒。為了解決此問題,近些年國際上提出了依據(jù)程序行為識別病毒的技術(shù)。其原理就是監(jiān)控程序的行為,將程序行為與有害程序行為數(shù)據(jù)庫進(jìn)行比較,判斷被監(jiān)控程序是否為病毒。目前為了提高識別病毒的精度,減少誤報和漏報情況,各國研究人員從不同的角度,定義程序的行為數(shù)據(jù)和獲取行為數(shù)據(jù)的方法,設(shè)置了不同行為數(shù)據(jù)類型的有害行為數(shù)據(jù)庫,但程序仍然存在很大的不穩(wěn)定性、誤識別率,且嚴(yán)重依賴系統(tǒng)并發(fā)資源。
本文提出的利用程序被執(zhí)行過程中的有效指令基因判斷病毒的模型摒棄了目前占主流地位的“通過獲取程序靜態(tài)行為”的思路,通過運(yùn)算出程序被執(zhí)行過程中的動態(tài)指令基因達(dá)到精確識別病毒的目的,該模型突破了目前只能依靠“程序靜態(tài)行為”分析病毒方法,以及目前無法在程序被執(zhí)行過程中達(dá)到同步且動態(tài)實時監(jiān)控的目標(biāo),并取得了理想的效果,克服了互聯(lián)網(wǎng)防御病毒的技術(shù)障礙。
1 程序動態(tài)指令基因防御病毒的系統(tǒng)模型
通過滑動窗口實時動態(tài)掃描被檢測程序運(yùn)行過程中在處理器以及存儲器中的數(shù)據(jù)流,計算出程序指令基因(有效指令結(jié)構(gòu)的指紋數(shù)據(jù))。
1.1 獲取待檢測程序被執(zhí)行過程中的數(shù)據(jù)流
獲取待檢測程序運(yùn)行過程中的內(nèi)存數(shù)據(jù)并將之輸出。使用函數(shù)createtoolhelp32snapshot()創(chuàng)建內(nèi)存快照;將返回句柄傳遞給函數(shù)process32first(),函數(shù)process32next()遍歷內(nèi)存中的進(jìn)程,遇到待檢測程序的進(jìn)程時,保存其進(jìn)程id;用函數(shù)openprocess()打開該進(jìn)程,獲得該進(jìn)程的句柄;用函數(shù)readprocessmemory()讀取該進(jìn)程句柄;獲得待檢測程序運(yùn)行過程中的內(nèi)存數(shù)據(jù)。圖1是程序的內(nèi)存數(shù)據(jù),標(biāo)示的代碼就是有效指令代碼(指令基因)。
1.2 有效指令基因分析
利用滑動窗口動態(tài)掃描程序的有效指令基因數(shù)據(jù),如圖2、圖3所示。定義該3個應(yīng)用程序為:EXE1、EXE2、EXE3,指令基因碼分別是:EXE1=[a1,a2,a3,a4,a5,a6,a7…an,a(n+1)]; EXE2=[a1,a0,a02,a3,a02,a6,a7…an,a(n+1)];EXE3=[a1,a06,a2,a3,a08,a6,a7…an, a(n+1)];采用“分段式多指針位移算法”將待掃描數(shù)據(jù)進(jìn)行不間斷式取點分段,設(shè)定多項指針,通過指針段內(nèi)位移,對數(shù)據(jù)進(jìn)行掃描,在實現(xiàn)過程中采用線程結(jié)構(gòu)。
比較3個程序的功能和執(zhí)行結(jié)果,得出:K=EXE1=EXE2=EXE3。分別考察EXE1、EXE2和EXE3,得出(a1)、(a2,a3)、(a6,a7)、an,a(n+1)是有效的基因序列,其余的是相對于執(zhí)行結(jié)果無效代碼,也就是對于特定的K,其指令元數(shù)據(jù)序列片段“(a1)、(a2,a3)、(a6,a7)、an,a(n+1)” 是穩(wěn)定的。
被截獲的待檢測程序能夠完成特定功能或結(jié)果的指令元數(shù)據(jù)序列為源序列。所有源序列的集合:E={e1,e2,e3,…,en,e(n+1)} ,其中e1,e2,e3,…等為具體的源序列,n為正整數(shù)。在系統(tǒng)S中,產(chǎn)生的源序列v1,v2,…,vi,就是待檢測程序在系統(tǒng)S中的蹤跡,其中vi∈E,i為正整數(shù),并且i≤n,每個源序列有時間性和執(zhí)行性為C(vi),指令執(zhí)行按時間排序,即對所有的i≥1,C(vi)<C(vi+1);假設(shè)執(zhí)行性為O(vi),表示指令的執(zhí)行性,用pid表示進(jìn)程,則O(vi)∈pid。對任意一個進(jìn)程pi,其指令序列v1,i1,v2,i2,…,vi,ii,vi+1,ii+1。其中,i1,……,ii+1分別對應(yīng)指令結(jié)果v1,v2,…,vi+1的執(zhí)行結(jié)果,進(jìn)程pi對應(yīng)的指令序列為進(jìn)程蹤跡??梢?,pi的進(jìn)程蹤跡是待檢測程序在系統(tǒng)S中蹤跡的子串。假設(shè)被檢測程序在正常運(yùn)行時產(chǎn)生的源序列為:V=v1,v2,…,vm(m≥k),則V可以看作由被檢測程序在系統(tǒng)S中的每一個進(jìn)程的執(zhí)行過程合并而成。按執(zhí)行的時間性將每一個進(jìn)程的子執(zhí)行過程合并排列,形成被檢測程序在正常運(yùn)行時產(chǎn)生的審計源序列V。假設(shè)被檢測程序運(yùn)行時有兩個進(jìn)程,則V有兩個子串記為V1⊙V2。設(shè)P為程序指令元,其中存儲的典型指令元序列或片斷以源序列V為基礎(chǔ),可以采用滑動窗口技術(shù)獲得。假設(shè)k為滑動窗口大小,則: P={(si,si+1,…,sj)|si,…,sj∈E,i≥1,j≤m,j-i+1=k,si=vi,si+1=vi+1,…,sj=vj},其中m為源序列V的長度,可見,程序指令元P中存儲的是源序列V的子集[1]。
設(shè)EXE1的有效指令全集是F(1),EXE2的有效指令全集是F(2),EXE3的有效指令全集是F(3),其中,F(xiàn)(1)∈F,F(xiàn)(2)∈F,F(xiàn)(3)∈F,F(xiàn)為包括F(1)、F(2)和F(3)的有效指令集。則,F(xiàn)(1)、F(2)、F(3)就是被檢測的程序的數(shù)據(jù)源,它們分別為不同的源序列V,是被檢測的對象。也即,通過預(yù)先定義的程序指令元:VF={y1,y2,y3…yn,y(n+1)},將VF中的元素分別與數(shù)據(jù)源F(1)、F(2)、F(3)進(jìn)行差異運(yùn)算,即可實現(xiàn)被檢測程序EXE1、EXE2、EXE3的執(zhí)行檢測。
采用滑動窗口、函數(shù)計算方式順序獲取待檢測程序中能夠完成特定功能或結(jié)果的指令元數(shù)據(jù)。假設(shè)k為滑動窗口的大小,被監(jiān)控程序在運(yùn)行時產(chǎn)生的源序列V:v1,v2,…,vm(m≥k),用滑動窗口在源序列V上滑動,則滑動窗口內(nèi)的k個事件序列(vi,vi+1,…,vi+k-1)即為待檢測指令元數(shù)據(jù)序列。在不同的實例中,滑動窗口的大小k,或者所述指令元數(shù)據(jù)序列的長度是不同的,比較典型的k為7~12,本文的k取值為10,如圖3所示。
1.3 形成病毒指令基因數(shù)據(jù)庫
v1、v2、v3、v4為具有相同或相似破壞方式的同一族已知病毒程序。
病毒程序v1的內(nèi)存數(shù)據(jù)00,01,h1,44,b1,a1,33,c1,bw,0i,22,8i,11,2s,yy。
病毒程序v2的內(nèi)存數(shù)據(jù)00,cc,ae,44,b1,q3,33,c1,kh,al,22,8i,11,s3,yy。
病毒程序v3的內(nèi)存數(shù)據(jù)00,2c,3e,44,b1,w3,33,c1,nh,a0,22,8i,11,l3,yy。
病毒程序v4的內(nèi)存數(shù)據(jù)00,24,3o,44,b1,wl,33,c1,0h,ui,22,8i,11,4n,yy。
將這些已知病毒程序的內(nèi)存數(shù)據(jù)相互間具有相同或相似的部分提取出來,其中,該類病毒程序運(yùn)行過程中的內(nèi)存數(shù)據(jù)相互間具有相同的部分:00\44,b1\33,c1\22,8i\,該相同部分的有序排列表示為:#00#44,b1#33,c1#22,8i#。該類病毒運(yùn)行過程中的內(nèi)存數(shù)據(jù)相互間具有相似的部分是:病毒程序v1的內(nèi)存數(shù)據(jù)末尾部分(11,2s,yy)相似于病毒v2的內(nèi)存數(shù)據(jù)末尾部分(11,s3,yy)相似于病毒v3的內(nèi)存數(shù)據(jù)末尾部分(11,l3,yy)相似于病毒程序v4的內(nèi)存數(shù)據(jù)末尾部分(11,4n,yy),該相似部分可用#11,**,yy#表示。符號“#”代表相同內(nèi)存數(shù)據(jù)以外的內(nèi)存數(shù)據(jù),符號“*”代表相似內(nèi)存數(shù)據(jù)中的不同部分。將#00#44,b1#33,c1#22,8i#存儲進(jìn)數(shù)據(jù)庫;將#11,**,yy#存儲進(jìn)數(shù)據(jù)庫。病毒的運(yùn)行特征數(shù)據(jù)是將已知病毒程序運(yùn)行過程中的內(nèi)存數(shù)據(jù)相互間具有相同或相似的部分提取出來,且按序排列進(jìn)行存儲形成病毒指令基因數(shù)據(jù)庫。
2 具體應(yīng)用描述
無論是待檢測程序還是病毒程序,其運(yùn)行特征數(shù)據(jù)不僅僅只限于運(yùn)行過程中的內(nèi)存數(shù)據(jù),例如某個程序被CPU執(zhí)行過程中的獨有的運(yùn)行特征數(shù)據(jù)。CIH類型的病毒利用中斷操作,從系統(tǒng)的用戶層強(qiáng)行到系統(tǒng)的內(nèi)核層,破壞計算機(jī)硬件。
因為此類病毒是從系統(tǒng)的用戶層轉(zhuǎn)到系統(tǒng)的內(nèi)核層,因此在CPU內(nèi)的高速緩存中存在從系統(tǒng)的用戶層到系統(tǒng)的內(nèi)核層區(qū)別于運(yùn)行其他程序的跡象,即:正常的程序被執(zhí)行時,高速緩存順序從內(nèi)存調(diào)取數(shù)據(jù),一般情況下應(yīng)用程序工作在系統(tǒng)的用戶層,此類病毒程序利用處理器的中斷操作從系統(tǒng)的用戶層強(qiáng)行轉(zhuǎn)到系統(tǒng)的內(nèi)核層,因此在高速緩存中存在一些從系統(tǒng)的用戶層向系統(tǒng)的內(nèi)核層跳轉(zhuǎn)的數(shù)據(jù)。但這些數(shù)據(jù)并非都是病毒程序,因為個別的正常程序也用到此方式,獲取跳轉(zhuǎn)到的內(nèi)存相應(yīng)的數(shù)據(jù),并提取此類型病毒對于這部分?jǐn)?shù)據(jù)所共有的部分。
(1)匯編指令:out 70h,al; in al,71h;xor ax,926h; ###jmp 2000:003;add al,bl→機(jī)器碼:9i 7u 16 14 5h a7 3t ### 77 e1 77 6c 00 d8(假設(shè)“###”左邊部分是利用中斷操作從系統(tǒng)的用戶層強(qiáng)行轉(zhuǎn)到系統(tǒng)的內(nèi)核層,“###”右邊部分是對BIOS芯片的破壞操作)。假定待檢測程序A的運(yùn)行特征如下:[匯編指令:mov ax,1016h]→機(jī)器碼:b8 31 2e;…;[匯編指令:out 70h,al]→機(jī)器碼:9i 7u(與病毒相同的指令基因);[匯編指令:in al,71h]→機(jī)器碼:16 14(與病毒相同的指令基因);[匯編指令:xor ax,926h]→機(jī)器碼:5h a7 3t(與病毒相同的指令基因);…;[匯編指令:mov ah,0]→機(jī)器碼:b4 00;…;[匯編指令:jmp 2000:003]→機(jī)器碼:77 e1 77 6c(與病毒相同的指令基因);[匯編指令:add al,bl]→機(jī)器碼:00 d8(與病毒相同的指令基因)。
(2)待檢測程序A的運(yùn)行特征:機(jī)器碼b8 31 2e 0e 21 4d 8h 63 5h 9i 7u 16 14 5h a7 3t 00 7c 2d b8 20 4e 05 16 14 04 9c b4 00 77 e1 77 6c 00 d8,其中,機(jī)器碼9i 7u 16 14 5h a7 3t是利用中斷操作從系統(tǒng)的用戶層強(qiáng)行轉(zhuǎn)到系統(tǒng)的內(nèi)核層;機(jī)器碼77 e1 77 6c 00 d8是對芯片的破壞操作。
(3)待檢測程序B的運(yùn)行特征:機(jī)器碼9i 02 11 6h 8i u8 e3 9i 7u 16 14 5h a7 3t b8 31 2e 0e 21 4d 8h 63 7c 2d b8 20 9c b4;雖然待檢測程序B的機(jī)器碼中也存在9i 7u 16 14 5h a7 3t,也同樣利用中斷操作從系統(tǒng)的用戶層強(qiáng)行轉(zhuǎn)到系統(tǒng)的內(nèi)核層,但是檢測程序B的機(jī)器碼中不存在對芯片進(jìn)行破壞的數(shù)據(jù)。
3 病毒的檢測
將(指令元1+指令元2+指令元3)→(結(jié)果1+結(jié)果2+結(jié)果3)=最終結(jié)果,存儲到所述的原則庫中,同時在原則庫中標(biāo)示出病毒程序的最終結(jié)果,表1所示為指令元、有效代碼序列(運(yùn)行特征代碼)、運(yùn)行結(jié)果、危險系數(shù)的關(guān)系。
將獲得的待檢測程序的指令元數(shù)據(jù)與建立的原則庫中的對應(yīng)關(guān)系表達(dá)式相應(yīng)部分進(jìn)行比較,對比較成功的次數(shù)進(jìn)行計數(shù),當(dāng)比較成功的次數(shù)等于或者超過設(shè)定的閥值時,判定所述待檢測程序為病毒程序。
獲得的待檢測程序指令元數(shù)據(jù)是:指令元1+指令元2+...指令元X;
原則庫中某項數(shù)據(jù)是:指令元11+指令元22+...指令元nn;
假定,指令元1=指令元11,指令元2=指令元22,則Y的值應(yīng)該等于2。
第二個意義的閾值是:待檢測程序的指令元數(shù)據(jù)或指令元數(shù)據(jù)的集合與所述的最終結(jié)果有關(guān)聯(lián)關(guān)系或者待檢測程序的指令元數(shù)據(jù)或指令元數(shù)據(jù)的集合能夠?qū)е滤龅淖罱K結(jié)果,此為第二個意義的閾值。如獲得的待檢測程序i.exe指令元數(shù)據(jù)是:指令元i1+指令元i2+指令元i3;獲得的待檢測程序g.exe指令元數(shù)據(jù)是:指令元g1+指令元g2+指令元g3+指令元g4+指令元g5;原則庫中某項數(shù)據(jù)是:(指令元1+指令元2+指令元3)→(結(jié)果1+結(jié)果2+結(jié)果3)=最終結(jié)果;其中,指令元(g1+指令元g2+指令元g3+指令元g4+指令元g5)=(指令元1+指令元2+指令元3)→(結(jié)果1+結(jié)果2+結(jié)果3)=最終結(jié)果;(指令元i1+指令元i2+指令元i3)≠(指令元1+指令元2+指令元3)。因此,待檢測程序i.exe判定為不是病毒程序,待檢測程序g.exe判定為病毒程序。
分別獲取待檢測程序l.exe與m.exe的運(yùn)行特征數(shù)據(jù):l.exe的運(yùn)行特征數(shù)據(jù)是:a0,qo,9i,80,5h,3h,jg,pq,ci,c1,8k,00,0k,ab,c3,ck;m.exe的運(yùn)行特征數(shù)據(jù)是:1a,2b,c3,4d,f5,6h,7k,j8,9k,10,11,22,33,44,55,6i;原則庫中某項數(shù)據(jù)是:(#qo,9i,80,**,3h,jg#)→病毒運(yùn)行后對系統(tǒng)造成的惡性結(jié)果;待檢測程序l.exe判定為病毒程序,m.exe判定為不是病毒程序。
4 實驗過程與結(jié)果
由于采用的是基于指令基因的方式,在實驗中不需真實且可運(yùn)行的病毒體,可直接指定待檢測出的指令基因數(shù)據(jù)集即可。Windows系統(tǒng)中可完成目標(biāo)功能的指令基因元為n,形成有效組合為m,對5個進(jìn)程進(jìn)行檢測,每個進(jìn)程包含的指令元為N,有效組合為M,N>n,M>m。根據(jù)表2,平均準(zhǔn)確率為91.7%,平均誤報率為0.19%,漏報率為0。檢測分類表如表2所示。
本技術(shù)解決了目前世界上非特征碼技術(shù)錯誤率高的技術(shù)難題。且能夠直接檢測程序運(yùn)行過程中的內(nèi)存數(shù)據(jù),不需要對加殼病毒等進(jìn)行解密、脫殼操作,極大地減少了對于系統(tǒng)資源的消耗。在實踐應(yīng)用中取得了較好的結(jié)果。
參考文獻(xiàn)
[1] 張衡,卞洪流,吳禮發(fā),等.基于LSM 的程序行為控制研究[J].軟件學(xué)報,2005,16(06):1151-1158.