馬玉磊,李偉華,車(chē) 鳴
(西北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院,西安 710129)
病毒在達(dá)到目的前,總會(huì)表現(xiàn)出一些特殊的行為。有些行為是病毒的共同行為,且不太可能出現(xiàn)在正常程序中??梢岳貌《咎厥獾男袨樘卣鱽?lái)檢測(cè)病毒[1-2],監(jiān)視程序運(yùn)行時(shí)的行為,當(dāng)監(jiān)視到病毒行為時(shí),立即報(bào)警或阻斷。
文獻(xiàn)[3]使用蠕蟲(chóng)的多個(gè)行為特征來(lái)檢測(cè)蠕蟲(chóng),這些行為特征由蠕蟲(chóng)的傳播模型定義演化而來(lái)。文獻(xiàn)[4]將病毒的惡意行為表示為相應(yīng)的Win32 API 調(diào)用及其參數(shù)形式,跟蹤程序調(diào)用的API 和參數(shù),當(dāng)滿(mǎn)足一定條件時(shí),認(rèn)為發(fā)生了惡意行為。文獻(xiàn)[5]基于生物免疫的理論提出了基于病毒自我復(fù)制行為的行為特征檢測(cè)模型,實(shí)現(xiàn)對(duì)病毒復(fù)制行為的檢測(cè)。
病毒自我復(fù)制時(shí)執(zhí)行的操作會(huì)把病毒自身作為操作的“源”參數(shù)。給出了自源和自源復(fù)制行為的描述,以及檢測(cè)這種復(fù)制行為的方法。在實(shí)驗(yàn)中使用日志文件記錄每個(gè)病毒或正常程序調(diào)用的Win32 API,并分析這些日志文件來(lái)判斷病毒或正常程序是否出現(xiàn)了自源復(fù)制行為。
“計(jì)算機(jī)病毒是一種計(jì)算機(jī)程序,它遞歸地、明確地復(fù)制自己或其演化體”[1],自我復(fù)制是病毒的主要功能之一,是病毒都具有的基本特征。
運(yùn)行在Win32 平臺(tái)的一些病毒,會(huì)調(diào)用一序列的Win32 API 來(lái)完成自我復(fù)制。如病毒可以直接調(diào)用CopyFile 將自身復(fù)制到目標(biāo)文件中,或者間接調(diào)用ReadFile 將自身讀到內(nèi)存,再調(diào)用WriteFile 寫(xiě)到目標(biāo)文件中。表1 列出了上述API的參數(shù)。無(wú)論病毒直接或間接進(jìn)行自我復(fù)制,都要把自身作為復(fù)制的“源”,而執(zhí)行這種復(fù)制的又是病毒自身。這種復(fù)制行為在正常程序中是不太可能出現(xiàn)的,所以可以通過(guò)監(jiān)視進(jìn)程是否執(zhí)行了這種復(fù)制行為來(lái)檢測(cè)病毒。
將具有讀作用的API 用read 表示,具有寫(xiě)作用的API 用write 表示。病毒自我復(fù)制時(shí)執(zhí)行的read 和write的一個(gè)重要屬性是把病毒自身作為“源”參數(shù),稱(chēng)為自源屬性,使用自源的自我復(fù)制稱(chēng)為自源復(fù)制。
表1 Win32 API的參數(shù)
F:保存在存儲(chǔ)設(shè)備上的文件,文件名F.name
D:目標(biāo)文件,文件名D.name
Temp:臨時(shí)存儲(chǔ)單元
Pro:正在執(zhí)行的進(jìn)程,由文件F 創(chuàng)建,進(jìn)程名Pro.name
o:文件操作
Opr:操作集,Opr={read(s,d),write(s,d)},“源”參數(shù)s,“目標(biāo)”參數(shù)d
Source:“源”參數(shù)集,Source={Pro.name,Temp}
Dst:“目標(biāo)”參數(shù)集,Dst={Temp,D.name}
F的 文 件 名 和 路 徑 都 在 F.name 中,Pro.name=F.name,即Pro 由F 創(chuàng)建。
定義1 Pro 調(diào)用操作o,o∈Opr。當(dāng)o.s∈Source時(shí),SSrc(o)=true,即o 具有自源屬性。當(dāng)病毒間接復(fù)制時(shí),會(huì)執(zhí)行多個(gè)o,有些o的“源”參數(shù)不是病毒自身而是臨時(shí)存儲(chǔ)單元,所以當(dāng)SSrc(o)=true時(shí),存在兩種情況:
(1)當(dāng)o.s=Pro.name時(shí),Pro 試圖將F 寫(xiě)入o.d;
(2)當(dāng)o.s=Temp時(shí),Pro 試圖將Temp 寫(xiě)入o.d,此時(shí)Pro 已將F 寫(xiě)入Temp 中,即F=Temp。
定義2 Pro 調(diào)用的一序列操作o1(s1,d1)…on(sn,dn),任意操作oi(si,di),1≤i≤n,R(F,oi.si)表示F 和oi.si的關(guān)系。當(dāng)o1.s1=F,o1.d1=o2.s2,…,oi-1.di-1=oi.si,即F=oi.si時(shí),R(F,oi.si)=true。當(dāng)R(F,oi.si)=true時(shí),SSrc(oi(si,di))=true。
定義3 存在操作o1(s1,d1)…oi(si,di),1≤i≤n,當(dāng)o1.s1∈Source,oi(si,di)=write(s,d),oi.di=D.name,D.name≠Pro.name 且R(F,D)=true時(shí),SSRep(Pro)=true,即Pro 出現(xiàn)了自源復(fù)制。當(dāng)出現(xiàn)自源復(fù)制時(shí),把Pro 標(biāo)識(shí)為病毒進(jìn)程。
由定義3 可知,對(duì)自源復(fù)制的檢測(cè)相當(dāng)于檢測(cè)F 和D的關(guān)系,當(dāng)R(F,D)=true時(shí),SSRep(Pro)=true,否則SSRep(Pro)=false。由定義2 可知,當(dāng)R(F,D)=true時(shí),每一個(gè)操作的自源屬性都為真。
本文使用樹(shù)表示關(guān)系,稱(chēng)為關(guān)系樹(shù)。關(guān)系樹(shù)的節(jié)點(diǎn)={Pro.name,Temp,D.name},兩個(gè)節(jié)點(diǎn)之間的邊表示具有自源屬性的操作。每個(gè)進(jìn)程Pro 都有一個(gè)關(guān)系樹(shù),根節(jié)點(diǎn)的值等于Pro.name。
自源復(fù)制檢測(cè)流程如圖1 所示。
圖1 自源復(fù)制檢測(cè)流程
1)自源屬性檢測(cè)
Pro 調(diào)用操作oj(s,d),如果oj.s∈Source,oj.d∈Dst,則SSrc(oj(s,d))=true。
2)更新關(guān)系樹(shù)
當(dāng)SSrc(oj(s,d))=true時(shí)更新關(guān)系樹(shù)。更新關(guān)系樹(shù)時(shí),如果未創(chuàng)建關(guān)系樹(shù),存在以下情況:
(1)如果oj.s=Pro.name,創(chuàng)建關(guān)系樹(shù),添加根節(jié)點(diǎn)和根節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)。根節(jié)點(diǎn)等于oj.s,子節(jié)點(diǎn)等于oj.d,兩節(jié)點(diǎn)之間的邊表示oj(s,d);
(2)如果oj.s≠Pro.name,不更新關(guān)系樹(shù)。
如果已經(jīng)創(chuàng)建了關(guān)系樹(shù),存在以下情況:
(1)關(guān)系樹(shù)中存在一個(gè)節(jié)點(diǎn)等于oj.s,如果這個(gè)節(jié)點(diǎn)的子孫節(jié)點(diǎn)都不等于oj.d,為這個(gè)節(jié)點(diǎn)添加一個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)等于oj.d,兩節(jié)點(diǎn)之間的邊表示oj(s,d)。
(2)其他情況均不更新關(guān)系樹(shù)。圖2 中,read(T3,T7),存在路徑example→T3→T7和example→T5→T7,這兩條路徑都滿(mǎn)足R(example,T5)=true,所以不需要更新關(guān)系樹(shù)。
一個(gè)關(guān)系樹(shù)的例子如圖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)。按照調(diào)用的順序和更新規(guī)則,read1、write5、read9和read10沒(méi)有出現(xiàn)在關(guān)系樹(shù)中。read10(T7,T4)將T7讀到T4,由于從T7和T4都可以追溯到example,所以不需要更新關(guān)系樹(shù)。
圖2 關(guān)系樹(shù)
3)自源復(fù)制檢測(cè)
更新關(guān)系樹(shù)后,如果oi(s,d)=write(s,d),oi.d=D.name,D.name≠Pro.name,進(jìn)行自源復(fù)制檢測(cè)。如果Pro的關(guān)系樹(shù)中包含一條Pro.name 到D.name的路徑,即R(F,D)=true,則SSRep(Pro)=true。圖2 中,當(dāng)操作write7(T7,dst.exe)被加到關(guān)系樹(shù)中后,example 到dst.exe的關(guān)系R(example,dst.exe)=true,所以SSRep(example)=true。
構(gòu)造關(guān)系樹(shù)直到SSRep(Pro)=true,Pro 被標(biāo)識(shí)為病毒并采取處理措施。
實(shí)驗(yàn)選取了43個(gè)Win32 病毒樣本和50個(gè)正常的可執(zhí)行程序來(lái)驗(yàn)證使用自源復(fù)制檢測(cè)方法檢測(cè)病毒的可行性。病毒樣本來(lái)自http://bbs.kafan.cn/forum.php 和http://vx.netlux.org。實(shí)驗(yàn)在Virtual PC 虛擬機(jī)中進(jìn)行,病毒或正常程序在沒(méi)有安裝反病毒軟件的Windows XP 系統(tǒng)中單獨(dú)運(yùn)行。在病毒或正常程序運(yùn)行中,使用APISPY32 和Process Monitor軟件跟蹤每個(gè)病毒和程序調(diào)用的API 并記錄在日志文件中。被監(jiān)視的部分API 及其對(duì)應(yīng)的read/write操作如表2 所示。
表2 被監(jiān)視的Win32 API
分析每個(gè)病毒或程序調(diào)用的API 日志文件,并使用自源檢測(cè)方法構(gòu)造關(guān)系樹(shù),檢測(cè)病毒或程序在運(yùn)行中是否出現(xiàn)了自源復(fù)制行為。病毒樣本檢測(cè)結(jié)果如表3 所示。
表3 病毒樣本檢測(cè)結(jié)果
在實(shí)驗(yàn)中,正常程序沒(méi)有出現(xiàn)自源復(fù)制行為,表明自源復(fù)制行為不太可能出現(xiàn)在正常程序中。24個(gè)病毒在運(yùn)行中出現(xiàn)了自源復(fù)制行為,占病毒總數(shù)的55.8%。19個(gè)病毒沒(méi)有出現(xiàn)自源復(fù)制行為,可能的原因是病毒在運(yùn)行中沒(méi)有進(jìn)行自我復(fù)制、隱藏了復(fù)制行為或者沒(méi)有使用自源復(fù)制進(jìn)行復(fù)制。實(shí)驗(yàn)結(jié)果表明使用自源復(fù)制檢測(cè)方法檢測(cè)病毒是可行的。另外,檢測(cè)時(shí)不需要相關(guān)病毒的先驗(yàn)知識(shí),可同時(shí)實(shí)現(xiàn)對(duì)已知病毒和未知病毒的檢測(cè)。
給出了自源和自源復(fù)制的定義,以及利用自源復(fù)制行為來(lái)檢測(cè)病毒的方法。檢測(cè)方法使用病毒復(fù)制時(shí)執(zhí)行的具有自源屬性的read 和write 操作來(lái)構(gòu)造關(guān)系樹(shù),利用關(guān)系樹(shù)檢測(cè)自源復(fù)制行為,將出現(xiàn)自源復(fù)制行為的程序標(biāo)識(shí)為病毒。選取了部分病毒和正常程序進(jìn)行對(duì)比實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果證明可以使用自源復(fù)制檢測(cè)方法檢測(cè)病毒。這只是初步的實(shí)驗(yàn),下一步工作是實(shí)現(xiàn)一個(gè)檢測(cè)模型,進(jìn)一步驗(yàn)證這種檢測(cè)方法的可行性。
[1]Peter Szor,著.計(jì)算機(jī)病毒防范藝術(shù)[M].段海新,楊波,王德強(qiáng),譯.北京:機(jī)械工業(yè)出版社,2007.
[2]韓筱卿,王建峰,鐘瑋.計(jì)算機(jī)病毒分析與防范大全[M].北京:電子工業(yè)出版,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的未知病毒檢測(cè)[J].計(jì)算機(jī)應(yīng)用,2008,28(11):2829-2831.
[5]張濤,吳灝,奚琪.基于病毒復(fù)制行為的網(wǎng)絡(luò)免疫系統(tǒng)的研究[J].計(jì)算機(jī)應(yīng)用用,2005,25(1):150-153.