DOS病毒是一般只能在DOS環境下運行(引導型病毒不局限於DOS作業系統而存在,早期的某些單純占用引導記錄來作為病毒體的病毒,至今仍可破壞計算機硬碟引導記錄),傳染的計算機病毒,是最早出現的計算機病毒。感染主引導扇區和引導扇區的DOS病毒稱為引導型病毒,米氏病毒、6.4病毒等均屬於此類病毒。這一類病毒在數量上與其他類病毒相比雖然不多,但卻是感染率最高的DOS病毒。
基本介紹
病毒發展
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檔案頭信息
―――――――――――――――――――
├ 偏移量 ┤ 意義 ┤
├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之上,把控制轉移到位於調整後地址處的程式。