文獻標識碼: A
文章編號: 0258-7998(2012)10-0143-04
在互聯網高速發(fā)展的今天,網絡通信和網絡交易已經成為日常生活不可分割的一部分。但病毒生成技術的提高,已經嚴重影響到世界通信安全和國家的經濟命脈。早期特征碼技術已經無法單獨應對現在的計算機病毒。為了解決此問題,近些年國際上提出了依據程序行為識別病毒的技術。其原理就是監(jiān)控程序的行為,將程序行為與有害程序行為數據庫進行比較,判斷被監(jiān)控程序是否為病毒。目前為了提高識別病毒的精度,減少誤報和漏報情況,各國研究人員從不同的角度,定義程序的行為數據和獲取行為數據的方法,設置了不同行為數據類型的有害行為數據庫,但程序仍然存在很大的不穩(wěn)定性、誤識別率,且嚴重依賴系統并發(fā)資源。
本文提出的利用程序被執(zhí)行過程中的有效指令基因判斷病毒的模型摒棄了目前占主流地位的“通過獲取程序靜態(tài)行為”的思路,通過運算出程序被執(zhí)行過程中的動態(tài)指令基因達到精確識別病毒的目的,該模型突破了目前只能依靠“程序靜態(tài)行為”分析病毒方法,以及目前無法在程序被執(zhí)行過程中達到同步且動態(tài)實時監(jiān)控的目標,并取得了理想的效果,克服了互聯網防御病毒的技術障礙。
1 程序動態(tài)指令基因防御病毒的系統模型
通過滑動窗口實時動態(tài)掃描被檢測程序運行過程中在處理器以及存儲器中的數據流,計算出程序指令基因(有效指令結構的指紋數據)。
1.1 獲取待檢測程序被執(zhí)行過程中的數據流
獲取待檢測程序運行過程中的內存數據并將之輸出。使用函數createtoolhelp32snapshot()創(chuàng)建內存快照;將返回句柄傳遞給函數process32first(),函數process32next()遍歷內存中的進程,遇到待檢測程序的進程時,保存其進程id;用函數openprocess()打開該進程,獲得該進程的句柄;用函數readprocessmemory()讀取該進程句柄;獲得待檢測程序運行過程中的內存數據。圖1是程序的內存數據,標示的代碼就是有效指令代碼(指令基因)。

1.2 有效指令基因分析
利用滑動窗口動態(tài)掃描程序的有效指令基因數據,如圖2、圖3所示。定義該3個應用程序為: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)];采用“分段式多指針位移算法”將待掃描數據進行不間斷式取點分段,設定多項指針,通過指針段內位移,對數據進行掃描,在實現過程中采用線程結構。

比較3個程序的功能和執(zhí)行結果,得出:K=EXE1=EXE2=EXE3。分別考察EXE1、EXE2和EXE3,得出(a1)、(a2,a3)、(a6,a7)、an,a(n+1)是有效的基因序列,其余的是相對于執(zhí)行結果無效代碼,也就是對于特定的K,其指令元數據序列片段“(a1)、(a2,a3)、(a6,a7)、an,a(n+1)” 是穩(wěn)定的。
被截獲的待檢測程序能夠完成特定功能或結果的指令元數據序列為源序列。所有源序列的集合:E={e1,e2,e3,…,en,e(n+1)} ,其中e1,e2,e3,…等為具體的源序列,n為正整數。在系統S中,產生的源序列v1,v2,…,vi,就是待檢測程序在系統S中的蹤跡,其中vi∈E,i為正整數,并且i≤n,每個源序列有時間性和執(zhí)行性為C(vi),指令執(zhí)行按時間排序,即對所有的i≥1,C(vi)<C(vi+1);假設執(zhí)行性為O(vi),表示指令的執(zhí)行性,用pid表示進程,則O(vi)∈pid。對任意一個進程pi,其指令序列v1,i1,v2,i2,…,vi,ii,vi+1,ii+1。其中,i1,……,ii+1分別對應指令結果v1,v2,…,vi+1的執(zhí)行結果,進程pi對應的指令序列為進程蹤跡??梢?,pi的進程蹤跡是待檢測程序在系統S中蹤跡的子串。假設被檢測程序在正常運行時產生的源序列為:V=v1,v2,…,vm(m≥k),則V可以看作由被檢測程序在系統S中的每一個進程的執(zhí)行過程合并而成。按執(zhí)行的時間性將每一個進程的子執(zhí)行過程合并排列,形成被檢測程序在正常運行時產生的審計源序列V。假設被檢測程序運行時有兩個進程,則V有兩個子串記為V1⊙V2。設P為程序指令元,其中存儲的典型指令元序列或片斷以源序列V為基礎,可以采用滑動窗口技術獲得。假設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]。
設EXE1的有效指令全集是F(1),EXE2的有效指令全集是F(2),EXE3的有效指令全集是F(3),其中,F(1)∈F,F(2)∈F,F(3)∈F,F為包括F(1)、F(2)和F(3)的有效指令集。則,F(1)、F(2)、F(3)就是被檢測的程序的數據源,它們分別為不同的源序列V,是被檢測的對象。也即,通過預先定義的程序指令元:VF={y1,y2,y3…yn,y(n+1)},將VF中的元素分別與數據源F(1)、F(2)、F(3)進行差異運算,即可實現被檢測程序EXE1、EXE2、EXE3的執(zhí)行檢測。
采用滑動窗口、函數計算方式順序獲取待檢測程序中能夠完成特定功能或結果的指令元數據。假設k為滑動窗口的大小,被監(jiān)控程序在運行時產生的源序列V:v1,v2,…,vm(m≥k),用滑動窗口在源序列V上滑動,則滑動窗口內的k個事件序列(vi,vi+1,…,vi+k-1)即為待檢測指令元數據序列。在不同的實例中,滑動窗口的大小k,或者所述指令元數據序列的長度是不同的,比較典型的k為7~12,本文的k取值為10,如圖3所示。
1.3 形成病毒指令基因數據庫
v1、v2、v3、v4為具有相同或相似破壞方式的同一族已知病毒程序。
病毒程序v1的內存數據00,01,h1,44,b1,a1,33,c1,bw,0i,22,8i,11,2s,yy。
病毒程序v2的內存數據00,cc,ae,44,b1,q3,33,c1,kh,al,22,8i,11,s3,yy。
病毒程序v3的內存數據00,2c,3e,44,b1,w3,33,c1,nh,a0,22,8i,11,l3,yy。
病毒程序v4的內存數據00,24,3o,44,b1,wl,33,c1,0h,ui,22,8i,11,4n,yy。
將這些已知病毒程序的內存數據相互間具有相同或相似的部分提取出來,其中,該類病毒程序運行過程中的內存數據相互間具有相同的部分:00\44,b1\33,c1\22,8i\,該相同部分的有序排列表示為:#00#44,b1#33,c1#22,8i#。該類病毒運行過程中的內存數據相互間具有相似的部分是:病毒程序v1的內存數據末尾部分(11,2s,yy)相似于病毒v2的內存數據末尾部分(11,s3,yy)相似于病毒v3的內存數據末尾部分(11,l3,yy)相似于病毒程序v4的內存數據末尾部分(11,4n,yy),該相似部分可用#11,**,yy#表示。符號“#”代表相同內存數據以外的內存數據,符號“*”代表相似內存數據中的不同部分。將#00#44,b1#33,c1#22,8i#存儲進數據庫;將#11,**,yy#存儲進數據庫。病毒的運行特征數據是將已知病毒程序運行過程中的內存數據相互間具有相同或相似的部分提取出來,且按序排列進行存儲形成病毒指令基因數據庫。
2 具體應用描述
無論是待檢測程序還是病毒程序,其運行特征數據不僅僅只限于運行過程中的內存數據,例如某個程序被CPU執(zhí)行過程中的獨有的運行特征數據。CIH類型的病毒利用中斷操作,從系統的用戶層強行到系統的內核層,破壞計算機硬件。
因為此類病毒是從系統的用戶層轉到系統的內核層,因此在CPU內的高速緩存中存在從系統的用戶層到系統的內核層區(qū)別于運行其他程序的跡象,即:正常的程序被執(zhí)行時,高速緩存順序從內存調取數據,一般情況下應用程序工作在系統的用戶層,此類病毒程序利用處理器的中斷操作從系統的用戶層強行轉到系統的內核層,因此在高速緩存中存在一些從系統的用戶層向系統的內核層跳轉的數據。但這些數據并非都是病毒程序,因為個別的正常程序也用到此方式,獲取跳轉到的內存相應的數據,并提取此類型病毒對于這部分數據所共有的部分。
(1)匯編指令:out 70h,al; in al,71h;xor ax,926h; ###jmp 2000:003;add al,bl→機器碼:9i 7u 16 14 5h a7 3t ### 77 e1 77 6c 00 d8(假設“###”左邊部分是利用中斷操作從系統的用戶層強行轉到系統的內核層,“###”右邊部分是對BIOS芯片的破壞操作)。假定待檢測程序A的運行特征如下:[匯編指令:mov ax,1016h]→機器碼:b8 31 2e;…;[匯編指令:out 70h,al]→機器碼:9i 7u(與病毒相同的指令基因);[匯編指令:in al,71h]→機器碼:16 14(與病毒相同的指令基因);[匯編指令:xor ax,926h]→機器碼:5h a7 3t(與病毒相同的指令基因);…;[匯編指令:mov ah,0]→機器碼:b4 00;…;[匯編指令:jmp 2000:003]→機器碼:77 e1 77 6c(與病毒相同的指令基因);[匯編指令:add al,bl]→機器碼:00 d8(與病毒相同的指令基因)。
(2)待檢測程序A的運行特征:機器碼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,其中,機器碼9i 7u 16 14 5h a7 3t是利用中斷操作從系統的用戶層強行轉到系統的內核層;機器碼77 e1 77 6c 00 d8是對芯片的破壞操作。
(3)待檢測程序B的運行特征:機器碼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的機器碼中也存在9i 7u 16 14 5h a7 3t,也同樣利用中斷操作從系統的用戶層強行轉到系統的內核層,但是檢測程序B的機器碼中不存在對芯片進行破壞的數據。
3 病毒的檢測
將(指令元1+指令元2+指令元3)→(結果1+結果2+結果3)=最終結果,存儲到所述的原則庫中,同時在原則庫中標示出病毒程序的最終結果,表1所示為指令元、有效代碼序列(運行特征代碼)、運行結果、危險系數的關系。

將獲得的待檢測程序的指令元數據與建立的原則庫中的對應關系表達式相應部分進行比較,對比較成功的次數進行計數,當比較成功的次數等于或者超過設定的閥值時,判定所述待檢測程序為病毒程序。
獲得的待檢測程序指令元數據是:指令元1+指令元2+...指令元X;
原則庫中某項數據是:指令元11+指令元22+...指令元nn;
假定,指令元1=指令元11,指令元2=指令元22,則Y的值應該等于2。
第二個意義的閾值是:待檢測程序的指令元數據或指令元數據的集合與所述的最終結果有關聯關系或者待檢測程序的指令元數據或指令元數據的集合能夠導致所述的最終結果,此為第二個意義的閾值。如獲得的待檢測程序i.exe指令元數據是:指令元i1+指令元i2+指令元i3;獲得的待檢測程序g.exe指令元數據是:指令元g1+指令元g2+指令元g3+指令元g4+指令元g5;原則庫中某項數據是:(指令元1+指令元2+指令元3)→(結果1+結果2+結果3)=最終結果;其中,指令元(g1+指令元g2+指令元g3+指令元g4+指令元g5)=(指令元1+指令元2+指令元3)→(結果1+結果2+結果3)=最終結果;(指令元i1+指令元i2+指令元i3)≠(指令元1+指令元2+指令元3)。因此,待檢測程序i.exe判定為不是病毒程序,待檢測程序g.exe判定為病毒程序。
分別獲取待檢測程序l.exe與m.exe的運行特征數據:l.exe的運行特征數據是:a0,qo,9i,80,5h,3h,jg,pq,ci,c1,8k,00,0k,ab,c3,ck;m.exe的運行特征數據是:1a,2b,c3,4d,f5,6h,7k,j8,9k,10,11,22,33,44,55,6i;原則庫中某項數據是:(#qo,9i,80,**,3h,jg#)→病毒運行后對系統造成的惡性結果;待檢測程序l.exe判定為病毒程序,m.exe判定為不是病毒程序。
4 實驗過程與結果
由于采用的是基于指令基因的方式,在實驗中不需真實且可運行的病毒體,可直接指定待檢測出的指令基因數據集即可。Windows系統中可完成目標功能的指令基因元為n,形成有效組合為m,對5個進程進行檢測,每個進程包含的指令元為N,有效組合為M,N>n,M>m。根據表2,平均準確率為91.7%,平均誤報率為0.19%,漏報率為0。檢測分類表如表2所示。

本技術解決了目前世界上非特征碼技術錯誤率高的技術難題。且能夠直接檢測程序運行過程中的內存數據,不需要對加殼病毒等進行解密、脫殼操作,極大地減少了對于系統資源的消耗。在實踐應用中取得了較好的結果。
參考文獻
[1] 張衡,卞洪流,吳禮發(fā),等.基于LSM 的程序行為控制研究[J].軟件學報,2005,16(06):1151-1158.
