文件型病毒的查殺方法
這類病毒在感染的時候,將病毒代碼加入正常程序之中,原來程序的功能部分或者全部被保留。根據病毒代碼加入的方式不同,寄生病毒可以分為“頭寄生”、“尾寄生”、“中間插入”和“空洞利用”四種:
“頭寄生”:
實現將病毒代碼放到程序的頭上有兩種方法,壹種是將原來程序的前面壹部分拷貝到程序的最後,然後將文件頭用病毒代碼覆蓋;另外壹種是生成壹個新的文件,首先在頭的位置寫上病毒代碼,然後將原來的可執行文件放在病毒代碼的後面,再用新的文件替換原來的文件從而完成感染。使用“頭寄生”方式的病毒基本上感染的是批處理病毒和COM格式的文件,因為這些文件在運行的時候不需要重新定位,所以可以任意調換代碼的位置而不發生錯誤。
當然,隨著病毒制作水平的提高,很多感染DOS下的EXE文件和視窗系統的EXE文件的病毒也是用了頭寄生的方式,為使得被感染的文件仍然能夠正常運行,病毒在執行原來程序之前會還原出原來沒有感染過的文件用來正常執行,執行完畢之後再進行壹次感染,保證硬盤上的文件處於感染狀態,而執行的文件又是壹切正常的。
“尾寄生”:
由於在頭部寄生不可避免的會遇到重新定位的問題,所以最簡單也是最常用的寄生方法就是直接將病毒代碼附加到可執行程序的尾部。對於DOS環境下COM可執行文件來說,由於COM文件就是簡單的二進制代碼,沒有任何結構信息,所以可以直接將病毒代碼附加到程序的尾部,然後改動COM文件開始的3個字節為跳轉指令:
JMP [病毒代碼開始地址]
對於DOS環境下的EXE文件,有兩種處理的方法,壹種是將EXE格式轉換成COM格式再進行感染,另外壹種需要修改EXE文件的文件頭,壹般會修改EXE文件頭的下面幾個部分:
代碼的開始地址
可執行文件的長度
文件的CRC校驗值
堆棧寄存器的指針也可能被修改。
對於視窗操作系統下的EXE文件,病毒感染後同樣需要修改文件的頭,這次修改的是PE或者NE的頭,相對於DOS下EXE文件的頭來說,這項工作要復雜很多,需要修改程序入口地址、段的開始地址、段的屬性等等,由於這項工作的復雜性,所以很多病毒在編寫感染代碼的時候會包括壹些小錯誤,造成這些病毒在感染壹些文件的時候會出錯無法繼續,從而幸運的造成這些病毒無法大規模的流行。
感染DOS環境下設備驅動程序(.SYS文件)的病毒會在DOS啟動之後立刻進入系統,而且對於隨後加載的任何軟件(包括殺毒軟件)來說,所有的文件操作(包括可能的查病毒和殺病毒操作)都在病毒的監控之下,在這種情況下幹凈的清除病毒基本上是不可能的。
“插入寄生”:
病毒將自己插入被感染的程序中,可以整段的插入,也可以分成很多段,有的病毒通過壓縮原來的代碼的方法,保持被感染文件的大小不變。前面論述的更改文件頭等基本操作同樣需要,對於中間插入來說,要求程序的編寫更加嚴謹,
所以采用這種方式的病毒相對比較少,即使采用了這種方式,很多病毒也由於程序編寫上的錯誤沒有真正流行起來。
“空洞利用”:
對於視窗環境下的可執行文件,還有壹種更加巧妙的方法,由於視窗程序的結構非常復雜,壹般裏面都會有很多沒有使用的部分,壹般是空的段,或者每個段的最後部分。病毒尋找這些沒有使用的部分,然後將病毒代碼分散到其中,這樣就實現了神不知鬼不覺的感染(著名的“CIH”病毒就是用了這種方法)。
寄生病毒精確的實現了病毒的定義,“寄生在宿主程序的之上,並且不破壞宿主程序的正常功能”,所以寄生病毒設計的初衷都希望能夠完整的保存原來程序的所有內容,因此除了某些由於程序設計失誤造成原來的程序不能恢復的病毒以外,寄生型病毒基本上都是可以安全清除的。
除了改變文件頭、將自己插入被感染程序中以外,寄生病毒還會采用壹些方法來隱藏自己:如果被感染文件是只讀文件,病毒在感染時首先改變文件的屬性為可讀寫,然後進行感染,感染完畢之後再把屬性改回只讀,病毒在感染時往往還會記錄文件最後壹次訪問的日期,感染完畢之後再改回原來的日期,這樣用戶就不會通過日期的變化覺察到文件已經被修改過了。
根據病毒感染後,被感染文件的信息是不是有丟失,我們把病毒感染分成兩種最基本的類型,破壞性感染和非破壞性感染,對於非破壞性感染的文件,只要殺毒軟件清楚的掌握了病毒感染的基本原理,準確的進行還原是可能的,在這種情況下,我們稱這個病毒是可清除的。而對於破壞性感染,由於病毒刪除或者覆蓋了原來文件的全部/部分內容,所以這種病毒是不能清除的,只能刪除感染文件,或者用沒有被感染的原始文件覆蓋被感染的文件。
DOS環境下的COM和EXE文件具有完全不同的結構,所以病毒感染的方法也完全不壹樣,有的病毒根據文件後綴名來判斷感染的是COM還是EXE文件,而另外壹種更加準確的方法是比較文件頭,看看是不是符合EXE文件的定義。根據文件後綴名來進行感染經常會造成錯誤,壹個最典型的例子是視窗95系統目錄下的文件,後綴名顯示它是壹個COM文件,但是這個大小超過90K的文件實際上是壹個EXE文件。那些根據文件後綴名進行感染的病毒壹旦感染這個文件就會造成文件的損壞,這也是很多用戶發現自己在視窗下無法打開DOS框的原因。 這種病毒並不是真正沒有入口點,只是在被感染程序執行的時候,沒有立刻跳轉到病毒的代碼處開始執行。也就是說,沒有在COM文件的開始放置壹條跳轉指令,也沒有改變EXE文件的程序入口點。病毒代碼無聲無息的潛伏在被感染的程序中,可能在非常偶然的條件下才會被觸發開始執行,采用這種方式感染的病毒非常隱蔽,殺毒軟件很難發現在程序的某個隨機的部位,有這樣壹些在程序運行過程中會被執行到的病毒代碼!
那麽,這種病毒必須修改原來程序中的某些指令,使得在原來程序運行中可以跳轉到病毒代碼處。我們知道x86機器的指令是不等長,也就是說無法斷定什麽地方開始的是壹條有效地、可以執行到的指令,將這條指令改成跳轉指令就可以切換到病毒代碼了。聰明的病毒制造者從來不會被這種小兒科的問題難倒,他們發現了壹系列的方法可以做這件事情:
大量的可執行文件是使用C或者帕斯卡語言編寫的,使用這些語言編寫的程序有這樣壹個特點,程序中會使用壹些基本的庫函數,比如說字符串處理、基本的輸入輸出等,在啟動用戶開發的程序之前,編譯器會增加壹些代碼對庫進行初始化,病毒可以尋找特定的初始化代碼,然後使用修改這段代碼的開始跳轉到病毒代碼處,執行完病毒之後再執行通常的初始化工作。“紐克瑞希爾”病毒就采用了這種方法進行感染。
病毒的感染部分包括了壹個小型的反匯編軟件,感染的時候,將被感染文件加載到內存中,然後壹條壹條代碼的進行反匯編,當滿足某個特定的條件的時候(病毒認為可以很安全的改變代碼了),將原來的指令替換成壹條跳轉指令,跳轉到病毒代碼中,“CNTV”和“中間感染”病毒是用這種方法插入跳轉到病毒的指令。
還有壹種方法僅僅適用於TSR程序,病毒修改TSR程序的中斷服務代碼,這樣當操作系統執行中斷的時候就會跳轉到病毒代碼中。(比如說修改21H號中斷,這樣任何DOS調用都會首先通過病毒進行了)
TSR(Terminal Still Resident中止仍然駐留)程序,是DOS操作系統下壹類非常重要的程序,包括所有的DOS環境下的中文操作系統(CCDOS、中國龍等)等壹大類程序都是TSR程序。這類程序的特點是程序執行完畢之後仍然部分駐留在內存中,駐留的部分基本上都是中斷服務程序,可以完成特定的中斷服務任務。
除此之外,還有另外壹種比較少見的獲得程序控制權的方法是通過EXE文件的重定位表完成的 這種病毒不改變被感染的文件,而是為被感染的文件創建壹個伴隨文件(病毒文件),這樣當妳執行被感染文件的時候,實際上執行的是病毒文件。
其中壹種伴隨病毒利用了DOS執行文件的壹個特性,當同壹個目錄中同時存在同名的後綴名為.COM的文件和後綴名為.EXE的文件時,會首先執行後綴名為COM的文件,例如,DOS操作系統帶了壹個XCOPY.EXE程序,如果在DOS目錄中壹個叫做XCOPY. COM的文件是壹個病毒,那麽當妳敲入“XCOPY (回車換行)”的時候,實際執行的是病毒文件。
還有壹種伴隨方式是將原來的文件改名,比如說將XCOPY.EXE改成XCOPY.OLD,然後生成壹個新的XCOPY.EXE(實際上就是病毒文件),這樣妳敲入“XCOPY (回車換行)”的時候,執行的同樣是病毒文件,然後病毒文件再去加載原來的程序執行。
另外壹種伴隨方式利用了DOS或者視窗操作系統的搜索路徑,比如說視窗系統首先會搜索操作系統安裝的系統目錄,這樣病毒可以在最先搜索目錄存放和感染文件同名的可執行文件,當執行的時候首先會去執行病毒文件,最新的“尼姆達”病毒就大量使用這種方法進行傳染。
文件蠕蟲:
文件蠕蟲和伴隨病毒很相似,但是不利用路徑的優先順序或者其他手段執行,病毒只是生成壹個具有“INSTALL.BAT”或者“SETUP.EXE”等名字的文件(就是病毒文件的拷貝),誘使用戶在看到文件之後執行。
還有壹些蠕蟲使用了更加高級的技術,主要是針對壓縮文件的,這些病毒可以發現硬盤上的壓縮文件,然後直接將自己加到壓縮包中,病毒支持的壓縮包主要是ARJ和ZIP,可能主要原因是因為這兩種壓縮格式的資料最全,壓縮算法也是公開的,所以病毒可以方便的實現自己的壓縮/增加方法。
針對批處理的病毒也存在,病毒會在以BAT結尾的批處理文件中增加執行病毒的語句,從而實現病毒的傳播。 這類病毒的數量比較少,但是有壹個特別是在中國鼎鼎大名的“目錄2”(DIRII)病毒。病毒並沒有在硬盤上生成壹個專門的病毒文件,而是將自己隱藏在文件系統的某個地方,“目錄2”病毒將自己隱藏在驅動器的最後壹個簇中,然後修改文件分配表,使目錄區中文件文件的開始簇指向病毒代碼,這種感染方式的特點是每壹個邏輯驅動器上只有壹份病毒的拷貝。
簇:由於硬盤上每壹個扇區的大小壹般只有512字節,如果壹個文件分布在很多的扇區中,要想完整的在文件分配表中表示這個文件占用的扇區將會使用非常多非常多的目錄空間,例如1個1M的文件,將需要2K字節的空間表示文件占用扇區的情況。所以所有的文件系統都引入了簇的概念,壹個簇就是很多個扇區,但是組合在壹起作為文件分配的最小單位,簇的大小有4K、16K、32K等多種。
在視窗NT和視窗2000操作系統中,還有壹種新的鏈接病毒,這種病毒只存在於NTFS文件系統的邏輯磁盤上,使用了NTFS文件系統的隱藏流來存放病毒代碼,被這種病毒感染之後,殺毒軟件很難找到病毒代碼並且安全的清除。 這類病毒的數量非常少,總數大概不會超過10個,病毒感染編譯器生成的中間對象文件(OBJ文件),或者編譯器使用的庫文件(.LIB)文件,由於這些文件不是直接的可執行文件,所以病毒感染這些文件之後並不能直接的傳染,必須使用被感染的OBJ或者LIB鏈接生成EXE(COM)程序之後才能實際的完成感染過程,所生成的文件中包含了病毒。
源代碼病毒直接對源代碼進行修改,在源代碼文件中增加病毒的內容,例如搜索所有後綴名是“.C”的文件,如果在裏面找到“main(”形式的字符串,則在則在這壹行的後面加上病毒代碼,這樣編譯出來的文件就包括了病毒。