更新时间:2023-12-11 00:45
文件型病毒是计算机病毒的一种,主要通过感染计算机中的可执行文件(.exe)和命令文件(.com)。文件型病毒是对计算机的源文件进行修改,使其成为新的带毒文件。一旦计算机运行该文件就会被感染,从而达到传播的目的。
我们把所有通过操作系统的文件系统进行感染的病毒都称作文件病毒,所以这是一类数目非常巨大的病毒。理论上可以制造这样一个病毒,该病毒可以感染基本上所有操作系统的可执行文件。已经存在这样的文件病毒,可以感染所有标准的DOS可执行文件:包括批处理文件、DOS下的可加载驱动程序(.SYS)文件以及普通的COM/EXE可执行文件。当然还有感染所有视窗操作系统可执行文件的病毒,可感染文件的种类包括:视窗3.X版本,视窗9X版本,视窗NT和视窗2000版本下的可执行文件,后缀名是EXE、DLL或者VXD、SYS。
除此之外,还有一些病毒可以感染高级语言程序的源代码,开发库和编译过程所生成的中间文件。病毒也可能隐藏在普通的数据文件中,但是这些隐藏在数据文件中的病毒不是独立存在的,必须需要隐藏在普通可执行文件中的病毒部分来加载这些代码。从某种意义上,宏病毒—隐藏在字处理文档或者电子数据表中的病毒也是一种文件型病毒。
文件型病毒分两类:一种是将病毒加在COM前部,一种是加在文件尾部。文件型病毒传染的对象主要是.COM和.EXE文件。
针对文件型病毒是通过文件进行传播,所以当使用来历不明文件的时候,先用最新升级过的杀毒软件进行检查,确认没有文件型病毒之后方可使用。切记不要双击打开或复制。
要了解文件型病毒的原理,首先要了解文件的结构.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”形式的字符串,则在则在这一行的后面加上病毒代码,这样编译出来的文件就包括了病毒。