文件型病毒
文件型病毒
文件型病毒系計算機病毒的一種,主要通過感染計算機中的可執行文件(.exe)和命令文件(.com)。文件型病毒是對計算機的源文件進行修改,使其成為新的帶毒文件。一旦計算機運行該文件就會被感染,從而達到傳播的目的。
文件型病毒分兩類:一種是將病毒加在COM前部,一種是加在文件尾部。
文件型病毒傳染的對象主要是.COM和.EXE文件。
我們把所有通過操作系統的文件系統進行感染的病毒都稱作文件病毒,所以這是一類數目非常巨大的病毒。理論上可以製造這樣一個病毒,該病毒可以感染基本上所有操作系統的可執行文件。已經存在這樣的文件病毒,可以感染所有標準的DOS可執行文件:包括批處理文件、DOS下的可載入驅動程序(.SYS)文件以及普通的COM/EXE可執行文件。當然還有感染所有視窗操作系統可執行文件的病毒,可感染文件的種類包括:視窗3.X版本,視窗9X版本,視窗NT和視窗2000版本下的可執行文件,後綴名是EXE、DLL或者VXD、SYS。
除此之外,還有一些病毒可以感染高級語言程序的源代碼,開發庫和編譯過程所生成的中間文件。病毒也可能隱藏在普通的數據文件中,但是這些隱藏在數據文件中的病毒不是獨立存在的,必須需要隱藏在普通可執行文件中的病毒部分來載入這些代碼。從某種意義上,宏病毒—隱藏在字處理文檔或者電子數據表中的病毒也是一種文件型病毒。
針對文件型病毒是通過文件進行傳播,所以當使用來歷不明文件的時候,先用最新升級過的殺毒軟體進行檢查,確認沒有文件型病毒之後方可使用。切記 不要雙擊打開或複製。
要了解文件型病毒的原理,首先要了解文件的結構.COM 文件比較簡單, 病毒要感染COM文件有兩種方法,一種是將病毒加在COM前部,一種是加在文件尾部,見下圖:
A B
-------- ---------------
|-病毒 | |JMP XXXX:XXXX| (原文件的前3位元組被修改)
-------- ---------------
|原文件| ├ 原程序 ┤
-------- --------------
├ 病毒 ┤
--------------
EXE 文件比較複雜,每個EXE文件都有一個文件頭,結構如下:
EXE文件頭信息
-------------------------------------
├偏移量┤ 意義 ┤
├00h-01h ┤MZ‘EXE文件標記 ┤
├2h-03h ┤文件長度除512的餘數 ┤
├04h-05h ┤...............商 ┤
├06h-07h ┤重定位項的個數 ┤
├08h-09h ┤文件頭除16的商 ┤
├0ah-0bh ┤程序運行所需最小段 數 ┤
├0ch-0dh ┤..............大..... ┤
├oeh-0fh ┤堆棧段的段值 (SS) ┤
├10h-11h ┤........sp ┤
├12h-13h ┤文件校驗和 ┤
├14h-15h ┤IP ┤
├16h-17h ┤CS ┤
├18h-19h ┤............ ┤
├1ah-1bh ┤............ ┤
├1ch ┤............ ┤
------------------------------------
當DOS載入EXE文件時,根據文件頭信息,調入一定長度的文件,設置SS,SP 從CS:IP 開始執行。病毒一般將自己加在文件的末端,並修改CS,IP的值指向病毒起始地址,並修改文件長度信息和SS,SP。
當被感染程序執行之後,病毒會立刻(入口點被改成病毒代碼)或者在隨後的某個時間(“無入口點病毒”)獲得控制權,獲得控制權后,病毒通常會進行下面的操作(某個具體的病毒不一定進行了所有這些操作,操作的順序也很可能不一樣):
· 內存駐留的病毒首先檢查系統可用內存,查看內存中是否已經有病毒代碼存在,如果沒有將病毒代碼裝入內存中。非內存駐留病毒會在這個時候進行感染,查找當前目錄、根目錄或者環境變數PATH中包含的目錄,發現可以被感染的可執行文件就進行感染。
環境變數:首先在DOS操作系統下出現,是由操作系統保存,對所有程序都一樣的一些定義的值,比如說環境變數PATH是執行程序時搜索的路徑列表,環境變數PROMPT是執行DOS命令時的提示信息。在視窗操作系統下也有環境變數,但是除了搜索路徑以外的視窗操作系統的環境變數基本上在DOS框裡面才會用到。
· 執行病毒的一些其他功能,比如說破壞功能,顯示信息或者病毒精心製作的動畫等等,對於駐留內存的病毒來說,執行這些功能的時間可以是開始執行的時候,也可以是滿足某個條件的時候,比如說定時或者當天的日期是13號恰好又是星期五等等。為了實現這種定時的發作,病毒往往會修改系統的時鐘中斷,以便在合適的時候激活。
· 完成這些工作之後,將控制權交回被感染的程序。為了保證原來程序的正確執行,寄生病毒在執行被感染程序的之前,會把原來的程序還原,伴隨病毒會直接調用原來的程序,覆蓋病毒和其他一些破壞性感染的病毒會把控制權交回DOS操作系統。
· 對於內存駐留病毒來說,駐留時會把一些DOS或者基本輸入輸出系統(BIOS)的中斷指向病毒代碼,比如說INT13H或者INT 21H,這樣系統執行正常的文件/磁碟操作的時候,就會調用病毒駐留在內存中的代碼,進行進一步的破壞或者感染。
對於中了文件夾病毒的計算機,一個顯著的特點就是打開文件方式為“在不同窗口打開不同文件夾”,並且WINDOWS任務管理器被禁用。
首先要確定有哪幾個分區中了文件夾病毒,如果系統分區連同其他分區一起中了此病毒,建議重新安裝系統,安裝完成後打開工具——文件夾選項——查看——勾去隱藏已知文件類型的擴展名,之後手動刪除其他分區的後綴名為.exe的文件夾,並且恢復其他文件夾為不隱藏。
這類病毒在感染的時候,將病毒代碼加入正常程序之中,原來程序的功能部分或者全部被保留。根據病毒代碼加入的方式不同,寄生病毒可以分為“頭寄生”、“尾寄生”、“中間插入”和“空洞利用”四種:
“頭寄生”:
實現將病毒代碼放到程序的頭上有兩種方法,一種是將原來程序的前面一部分拷貝到程序的最後,然後將文件頭用病毒代碼覆蓋;另外一種是生成一個新的文件,首先在頭的位置寫上病毒代碼,然後將原來的可執行文件放在病毒代碼的後面,再用新的文件替換原來的文件從而完成感染。使用“頭寄生”方式的病毒基本上感染的是批處理病毒和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(”形式的字元串,則在則在這一行的後面加上病毒代碼,這樣編譯出來的文件就包括了病毒。