病毒發展
電腦病毒發展初期因為作業系統大多為DOS系統,指針對DOS作業系統開發的病毒。目前幾乎沒有新製作的DOS病毒,由於Windows9X病毒的出現,DOS病毒幾乎絕跡。但DOS病毒在Win9X環境中仍可以發生感染,因此若執行染毒檔案,Win9X用戶也會被感染。
DOS病毒是一般只能在DOS環境下運行(引導型病毒不局限於DOS作業系統而存在,早期的某些單純占用引導記錄來作為病毒體的病毒,至今仍可破壞計算機硬碟引導記錄),傳染的計算機病毒,是最早出現的計算機病毒。感染主引導扇區和引導扇區的DOS病毒稱為引導型病毒,米氏病毒、6.4病毒等均屬於此類病毒。這一類病毒在數量上與其他類病毒相比雖然不多,但卻是感染率最高的DOS病毒。
要學DOS下的病毒,首先你必須要學會或掌握彙編語言。DOS下病毒一般分為引導型病毒、檔案型病毒、混合型病毒等。大部分病毒是感染COM和EXE檔案,因此你必須了解COM檔案和EXE檔案結構。
COM檔案
COM檔案結構及原理
.COM 檔案比較簡單,.COM檔案包含程式的一個絕對映象―――就是說,為了運行程式準確的處理器指令和記憶體中的數據,MS-DOS通過直接把該映象從檔案拷貝到記憶體而載入.COM程式,它不作任何改變。為載入一個.COM程式,MS-DOS首先試圖分配記憶體,因為.COM程式必須位於一個64K的段中,所以.COM檔案的大小不能超過65,024(64K減去用於PSP的256位元組和用於一個起始堆疊的至少256位元組)。如果MS-DOS不能為程式、一個PSP、一個起始堆疊分配足夠記憶體,則分配嘗試失敗。否則,MS-DOS分配儘可能多的記憶體(直至所有保留記憶體),即使.COM程式本身不能大於64K。在試圖運行另一個程式或分配另外的記憶體之前,大部分.COM程式釋放任何不需要的記憶體。
分配記憶體後,MS-DOS在該記憶體的頭256位元組建立一個PSP,如果PSP中的第一個FCB含有一個有效驅動器標識符,則置AL為00h,否則為0FFh。MS-DOS還置AH為00h或0FFh,這依賴於第二個FCB是否含有一個有效驅動器標識符。建造PSP後,MS-DOS在PSP後立即開始(偏移100h)載入.COM檔案,它置SS,DS和ES為PSP的段地址,接著創建一個堆疊.為創建一個堆疊,MS-DOS置SP為0000h,若已分配了至少64K記憶體;否則,它置暫存器為比所分配的位元組總數大2的值.最後,它把0000h推進棧(這是為了保證與在早期MS-DOS版本上設計的程式的兼容性)。MS-DOS通過把控制傳遞偏移100h處的指令而啟動程式.程式設計者必須保證.COM檔案的第一條指令是程式的入口點。注意,因為程式是在偏移100h處載入,因此所有代碼和數據偏移也必須相對於100h.彙編語言程式設計者可通過置程式的初值為100h而保證這一點(例如通過在原程式的開始使用語句org 100h).
EXE檔案結構
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 ┤............ ┤
―――――――――――――――――――――――――
.EXE檔案包含一個檔案頭和一個可重定位程式映象。檔案頭包含MS-DOS用於載入程式的信息,例如程式的大小和暫存器的初始值。檔案頭還指向一個重定位表,該表包含指向程式映象中可重定位段地址的指針鍊表。檔案頭的形式與EXEHEADER結構對應:
EXEHEADER STRUC
exSignature dw 5A4Dh ;.EXE標誌
exExraBytes dw ? ;最後(部分)頁中的位元組數
exPages dw ? ;檔案中的全部和部分頁數
exRelocItems dw ? ;重定位表中的指針數
exHeaderSize dw ? ;以位元組為單位的檔案頭大小
exMinAlloc dw ? ;最小分配大小
exMaxAlloc dw ? ;最大分配大小
exInitSS dw ? ;初始SS值
exInitSP dw ? ;初始SP值
exChechSum dw ? ;補碼校驗值
exInitIP dw ? ;初始IP值
exInitCS dw ? ;初始CS值
exRelocTable dw ? ;重定位表的位元組偏移量
exOverlay dw ? ;覆蓋號
EXEHEADER ENDS程式映象,包含處理器代碼和程式的初始數據,緊接在檔案頭之後。它的大小以位元組為單位,等於.EXE檔案的大小減去檔案頭的大小,也等於exHeaderSize的域的值乘以16。MS-DOS通過把該映象直接從檔案拷貝到記憶體載入.EXE程式然後調整定位表中說明的可重定位段地址。
定位表是一個重定位指針數組,每個指向程式映象中的可重定位段地址。檔案頭中的exRelocItems域說明了數組中指針的個數,exRelocTable域說明了分配表的起始檔案偏移量。每個重定位指針由兩個16位值組成:偏移量和段值。為載入.EXE程式,MS-DOS首先讀檔案頭以確定.EXE標誌並計算程式映象的大小。然後它試圖申請記憶體。首先,它計算程式映象檔案的大小加上PSP的大小再加上EXEHEADER結構中的exMinAlloc域說明的記憶體大小這三者之和,如果總和超過最大可用記憶體塊的大小。則MS-DOS停止載入程式並返回一個出錯值。否則面,它計算程式映象的大小加上PSP的大小再加上EXEHEADER結構中exMaxAlloc域說明的記憶體大小之和,如果第二個總和小於最大可用記憶體塊的大小,則MS-DOS 分配計算得到的記憶體量。否則,它分配最大可用記憶體塊。分配完記憶體後,MS-DOS確定段地址,也稱為起始段地址,MS-DOS從此處載入程式映象。如果exMinAlloc域和exMaxAlloc域中的值都為零,則MS-DOS把映象儘可能地載入到記憶體最高端。否則,它把映象載入到緊挨著PSP域之上。接下來,MS-DOS讀取重定位表中的項目調整所有由可重定位指針說明的段地址。對於重定位表中的每個指針,MS-DOS尋找程式映象中相應的可重定位段地址,並把起始段地址加到它之上。一旦調整完畢,段地址便指向了記憶體中被載入程式的代碼和數據段。 MS-DOS在所分配記憶體的最低部分建造256位元組的PSP,把AL和AH設定為載入 .COM程式時所設定的值。MS-DOS使用檔案頭中的值設定SP與SS,調整SS初始值,把起始地址加到它之上。MS-DOS還把ES和DS設定為PSP的段地址.最後,MS-DOS從程式檔案頭讀取CS和IP的初始值,把起始段地址加到CS之上,把控制轉移到位於調整後地址處的程式。
分類和原理
檔案型病毒
DOS病毒的絕大部分是感染DOS執行檔,如:。EXE,。COM,甚至是。BAT等檔案。這類病毒被稱為檔案型病毒。像“黑色星期五”、“1575"、“卡死脖”病毒(CASPER)等就是檔案型病毒。
DOS檔案型病毒一般通過將病毒本體連結到執行檔(。EXE、。COM)上進行保存自身,並在該執行檔得到執行後,主動或被動的找到其他執行檔進行感染,複製自身代碼,並在適當的時機發作,破壞計算機內的檔案。DOS檔案型病毒常見的攻擊對象有命令解釋器command和DOS系統的執行檔等。例如:在病毒進入記憶體並得到執行,普通的一個dir /a/s命令可以感染該目錄及子目錄下的所有執行檔。
引導性病毒
既感染主引導區或引導區,又感染感染檔案的病毒被稱為混合型病毒。如:“幽靈”病毒(ONEHALF),Natas病毒等。
DOS引導型病毒分為單純引導型病毒、檔案/引導混合型病毒,該類病毒一般會感染主引導記錄和DOS引導記錄,將病毒體直接寫入對應的扇區內,在BIOS執行完畢,將硬碟引導記錄調入記憶體,並開始引導時,病毒就已經進入記憶體。一般情況下該類病毒修改INT13的中斷服務程式,以達到獲取控制權的目的。在發生磁碟IO時,INT13被調用,病毒就開始傳染和發作。嚴重時此類病毒會將引導記錄和分區表同時篡改,造成整個計算機內磁碟數據的丟失,危害極大。
如果主引導區感染了病毒,用格式化程式(FORMAT)是不能清除該病毒的,可以用FDISK/MBR清除該病毒。但如果是被MONKEY或ONEHALF這類的病毒感染,採用FDISK/MBR會丟失數據或使C糟無法找到。
引導區感染了病毒,用格式化程式(FORMAT)可清除病毒。
其他
Windows 9X時代的DOS病毒
有相當一部分DOS病毒可在Windows的DOS視窗下運行,並傳播。另一部分DOS病毒在Windows下運行時,可能會導致系統當機或程式運行異常。
因為Windows3.X至Windows9X的作業系統的基礎是基於DOS和FAT檔案系統開發的,在Windows作業系統啟動之前需要先引導DOS作業系統。同時因為Windows9X及以前的版本是直接繼承的BIOS API接口和中斷調用方式,系統引導DOS時,很多DOS病毒就已經修改了中斷調用函式,取得了控制權,可以繼續傳染和對系統進行破壞。