标题：DOS病毒
DOS病毒发展
电脑病毒发展初期因为操作系统大多为DOS系统，指针对DOS操作系统开发的病毒。目前几乎没有新制作的DOS病毒，由于Windows9X病毒的出现，DOS病毒几乎绝迹。但DOS病毒在Win9X环境中仍可以发生感染，因此若执行染毒文件，Win9X用户也会被感染。
DOS病毒是一般只能在DOS环境下运行（引导型病毒不局限于DOS操作系统而存在，早期的某些单纯占用引导记录来作为病毒体的病毒，至今仍可破坏计算机硬盘引导记录），传染的计算机病毒，是最早出现的计算机病毒。感染主引导扇区和引导扇区的DOS病毒称为引导型病毒，米氏病毒、6.4病毒等均属于此类病毒。这一类病毒在数量上与其他类病毒相比虽然不多，但却是感染率最高的DOS病毒。
要学DOS下的病毒，首先你必须要学会或掌握汇编语言。DOS下病毒一般分为引导型病毒、文件型病毒、混合型病毒等。大部分病毒是感染COM和EXE文件，因此你必须了解COM文件和EXE文件结构。 一.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病毒就已经修改了中断调用函数，取得了控制权，可以继续传染和对系统进行破坏。