概述
檔案型病毒系計算機病毒的一種,主要通過感染計算機中的執行檔(.exe)和命令檔案(.com)。檔案型病毒是對計算機的源檔案進行修改,使其成為新的帶毒檔案。一旦計算機運行該檔案就會被感染,從而達到傳播的目的。檔案型病毒分兩類:一種是將病毒加在COM前部,一種是加在檔案尾部。
檔案型病毒傳染的對象主要是.COM和.EXE檔案。
詳細說明
我們把所有通過作業系統的檔案系統進行感染的病毒都稱作檔案病毒,所以這是一類數目非常巨大的病毒。理論上可以製造這樣一個病毒,該病毒可以感染基本上所有作業系統的執行檔。目前已經存在這樣的檔案病毒,可以感染所有標準的DOS執行檔:包括批處理檔案、DOS下的可載入驅動程式(.SYS)檔案以及普通的COM/EXE執行檔。當然還有感染所有視窗作業系統執行檔的病毒,可感染檔案的種類包括:視窗3.X版本,視窗9X版本,視窗NT和視窗2000版本下的執行檔,後綴名是EXE、DLL或者VXD、SYS。除此之外,還有一些病毒可以感染高級語言程式的原始碼,開發庫和編譯過程所生成的中間檔案。病毒也可能隱藏在普通的數據檔案中,但是這些隱藏在數據檔案中的病毒不是獨立存在的,必須需要隱藏在普通執行檔中的病毒部分來載入這些代碼。從某種意義上,宏病毒—隱藏在字處理文檔或者電子數據表中的病毒也是一種檔案型病毒。
防止方法
針對檔案型病毒是通過檔案進行傳播,所以當使用來歷不明檔案的時候,先用最新升級過的防毒軟體進行檢查,確認沒有檔案型病毒之後方可使用。切忌不要雙擊打開或複製。分類
寄生病毒
這類病毒在感染的時候,將病毒代碼加入正常程式之中,原來程式的功能部分或者全部被保留。根據病毒代碼加入的方式不同,寄生病毒可以分為“頭寄生”、“尾寄生”、“中間插入”和“空洞利用”四種:“頭寄生”:
實現將病毒代碼放到程式的頭上有兩種方法,一種是將原來程式的前面一部分拷貝到程式的最後,然後將檔案頭用病毒代碼覆蓋;另外一種是生成一個新的檔案,首先在頭的位置寫上病毒代碼,然後將原來的執行檔放在病毒代碼的後面,再用新的檔案替換原來的檔案從而完成感染。使用“頭寄生”方式的病毒基本上感染的是批處理病毒和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(”形式的字元串,則在則在這一行的後面加上病毒代碼,這樣編譯出來的檔案就包括了病毒。
檔案型病毒原理
圖示
要了解檔案型病毒的原理,首先要了解檔案的結構.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,這樣系統執行正常的檔案/磁碟操作的時候,就會調用病毒駐留在記憶體中的代碼,進行進一步的破壞或者感染。