馬玉磊,李偉華,車 鳴
(西北工業大學計算機學院,西安 710129)
病毒在達到目的前,總會表現出一些特殊的行為。有些行為是病毒的共同行為,且不太可能出現在正常程序中。可以利用病毒特殊的行為特征來檢測病毒[1-2],監視程序運行時的行為,當監視到病毒行為時,立即報警或阻斷。
文獻[3]使用蠕蟲的多個行為特征來檢測蠕蟲,這些行為特征由蠕蟲的傳播模型定義演化而來。文獻[4]將病毒的惡意行為表示為相應的Win32 API 調用及其參數形式,跟蹤程序調用的API 和參數,當滿足一定條件時,認為發生了惡意行為。文獻[5]基于生物免疫的理論提出了基于病毒自我復制行為的行為特征檢測模型,實現對病毒復制行為的檢測。
病毒自我復制時執行的操作會把病毒自身作為操作的“源”參數。給出了自源和自源復制行為的描述,以及檢測這種復制行為的方法。在實驗中使用日志文件記錄每個病毒或正常程序調用的Win32 API,并分析這些日志文件來判斷病毒或正常程序是否出現了自源復制行為。
“計算機病毒是一種計算機程序,它遞歸地、明確地復制自己或其演化體”[1],自我復制是病毒的主要功能之一,是病毒都具有的基本特征。
運行在Win32 平臺的一些病毒,會調用一序列的Win32 API 來完成自我復制。如病毒可以直接調用CopyFile 將自身復制到目標文件中,或者間接調用ReadFile 將自身讀到內存,再調用WriteFile 寫到目標文件中。表1 列出了上述API的參數。無論病毒直接或間接進行自我復制,都要把自身作為復制的“源”,而執行這種復制的又是病毒自身。這種復制行為在正常程序中是不太可能出現的,所以可以通過監視進程是否執行了這種復制行為來檢測病毒。
將具有讀作用的API 用read 表示,具有寫作用的API 用write 表示。病毒自我復制時執行的read 和write的一個重要屬性是把病毒自身作為“源”參數,稱為自源屬性,使用自源的自我復制稱為自源復制。

表1 Win32 API的參數
F:保存在存儲設備上的文件,文件名F.name
D:目標文件,文件名D.name
Temp:臨時存儲單元
Pro:正在執行的進程,由文件F 創建,進程名Pro.name
o:文件操作
Opr:操作集,Opr={read(s,d),write(s,d)},“源”參數s,“目標”參數d
Source:“源”參數集,Source={Pro.name,Temp}
Dst:“目標”參數集,Dst={Temp,D.name}
F的 文 件 名 和 路 徑 都 在 F.name 中,Pro.name=F.name,即Pro 由F 創建。
定義1 Pro 調用操作o,o∈Opr。當o.s∈Source時,SSrc(o)=true,即o 具有自源屬性。當病毒間接復制時,會執行多個o,有些o的“源”參數不是病毒自身而是臨時存儲單元,所以當SSrc(o)=true時,存在兩種情況:
(1)當o.s=Pro.name時,Pro 試圖將F 寫入o.d;
(2)當o.s=Temp時,Pro 試圖將Temp 寫入o.d,此時Pro 已將F 寫入Temp 中,即F=Temp。
定義2 Pro 調用的一序列操作o1(s1,d1)…on(sn,dn),任意操作oi(si,di),1≤i≤n,R(F,oi.si)表示F 和oi.si的關系。當o1.s1=F,o1.d1=o2.s2,…,oi-1.di-1=oi.si,即F=oi.si時,R(F,oi.si)=true。當R(F,oi.si)=true時,SSrc(oi(si,di))=true。
定義3 存在操作o1(s1,d1)…oi(si,di),1≤i≤n,當o1.s1∈Source,oi(si,di)=write(s,d),oi.di=D.name,D.name≠Pro.name 且R(F,D)=true時,SSRep(Pro)=true,即Pro 出現了自源復制。當出現自源復制時,把Pro 標識為病毒進程。
由定義3 可知,對自源復制的檢測相當于檢測F 和D的關系,當R(F,D)=true時,SSRep(Pro)=true,否則SSRep(Pro)=false。由定義2 可知,當R(F,D)=true時,每一個操作的自源屬性都為真。
本文使用樹表示關系,稱為關系樹。關系樹的節點={Pro.name,Temp,D.name},兩個節點之間的邊表示具有自源屬性的操作。每個進程Pro 都有一個關系樹,根節點的值等于Pro.name。
自源復制檢測流程如圖1 所示。

圖1 自源復制檢測流程
1)自源屬性檢測
Pro 調用操作oj(s,d),如果oj.s∈Source,oj.d∈Dst,則SSrc(oj(s,d))=true。
2)更新關系樹
當SSrc(oj(s,d))=true時更新關系樹。更新關系樹時,如果未創建關系樹,存在以下情況:
(1)如果oj.s=Pro.name,創建關系樹,添加根節點和根節點的一個子節點。根節點等于oj.s,子節點等于oj.d,兩節點之間的邊表示oj(s,d);
(2)如果oj.s≠Pro.name,不更新關系樹。
如果已經創建了關系樹,存在以下情況:
(1)關系樹中存在一個節點等于oj.s,如果這個節點的子孫節點都不等于oj.d,為這個節點添加一個子節點,子節點等于oj.d,兩節點之間的邊表示oj(s,d)。
(2)其他情況均不更新關系樹。圖2 中,read(T3,T7),存在路徑example→T3→T7和example→T5→T7,這兩條路徑都滿足R(example,T5)=true,所以不需要更新關系樹。
一個關系樹的例子如圖2 所示,Pro.name=example,操作read1(T1,T2),read2(example,T3),read3(T3,T4),read4(example,T5),write5(T6,dst.exe),read6(T5,T7),write7(T7,dst.exe),read8(T5,T8),read9(T3,T4),read10(T7,T4)。按照調用的順序和更新規則,read1、write5、read9和read10沒有出現在關系樹中。read10(T7,T4)將T7讀到T4,由于從T7和T4都可以追溯到example,所以不需要更新關系樹。

圖2 關系樹
3)自源復制檢測
更新關系樹后,如果oi(s,d)=write(s,d),oi.d=D.name,D.name≠Pro.name,進行自源復制檢測。如果Pro的關系樹中包含一條Pro.name 到D.name的路徑,即R(F,D)=true,則SSRep(Pro)=true。圖2 中,當操作write7(T7,dst.exe)被加到關系樹中后,example 到dst.exe的關系R(example,dst.exe)=true,所以SSRep(example)=true。
構造關系樹直到SSRep(Pro)=true,Pro 被標識為病毒并采取處理措施。
實驗選取了43個Win32 病毒樣本和50個正常的可執行程序來驗證使用自源復制檢測方法檢測病毒的可行性。病毒樣本來自http://bbs.kafan.cn/forum.php 和http://vx.netlux.org。實驗在Virtual PC 虛擬機中進行,病毒或正常程序在沒有安裝反病毒軟件的Windows XP 系統中單獨運行。在病毒或正常程序運行中,使用APISPY32 和Process Monitor軟件跟蹤每個病毒和程序調用的API 并記錄在日志文件中。被監視的部分API 及其對應的read/write操作如表2 所示。

表2 被監視的Win32 API
分析每個病毒或程序調用的API 日志文件,并使用自源檢測方法構造關系樹,檢測病毒或程序在運行中是否出現了自源復制行為。病毒樣本檢測結果如表3 所示。

表3 病毒樣本檢測結果
在實驗中,正常程序沒有出現自源復制行為,表明自源復制行為不太可能出現在正常程序中。24個病毒在運行中出現了自源復制行為,占病毒總數的55.8%。19個病毒沒有出現自源復制行為,可能的原因是病毒在運行中沒有進行自我復制、隱藏了復制行為或者沒有使用自源復制進行復制。實驗結果表明使用自源復制檢測方法檢測病毒是可行的。另外,檢測時不需要相關病毒的先驗知識,可同時實現對已知病毒和未知病毒的檢測。
給出了自源和自源復制的定義,以及利用自源復制行為來檢測病毒的方法。檢測方法使用病毒復制時執行的具有自源屬性的read 和write 操作來構造關系樹,利用關系樹檢測自源復制行為,將出現自源復制行為的程序標識為病毒。選取了部分病毒和正常程序進行對比實驗,實驗結果證明可以使用自源復制檢測方法檢測病毒。這只是初步的實驗,下一步工作是實現一個檢測模型,進一步驗證這種檢測方法的可行性。
[1]Peter Szor,著.計算機病毒防范藝術[M].段海新,楊波,王德強,譯.北京:機械工業出版社,2007.
[2]韓筱卿,王建峰,鐘瑋.計算機病毒分析與防范大全[M].北京:電子工業出版,2008.
[3]Daniel R Ellis,John G.Aiken,Kira S.Attwood.A behavioral approach to worm detection[C].Proceedings of the 2004 ACM workshop on Rapid malcode,2004.New York:ACM Press,2004.
[4]陳亮,鄭寧.基于Win32 API的未知病毒檢測[J].計算機應用,2008,28(11):2829-2831.
[5]張濤,吳灝,奚琪.基于病毒復制行為的網絡免疫系統的研究[J].計算機應用用,2005,25(1):150-153.