6.1.3 计算机病毒工作机制
计算机病毒的4个模块使得计算机病毒有三种大的工作机制,即感染机制、触发机制和破坏机制,下面分别介绍这三种机制。
1.感染机制
计算机病毒的感染机制又称传播机制。病毒是一种特殊的程序,它必须寄生在一个合法的程序中。这一点和生物病毒极其相似,它们有其自身的病毒体(病毒程序)和宿主。病毒生活在宿主中。一旦病毒程序成功感染某个合法程序,病毒就成了该程序的一部分,并拥有合法的地位。于是一个合法的程序就成了病毒程序的宿主,或称为病毒程序的载体。对于宿主而言,病毒几乎可以感染它的任何位置。可以理解为病毒和其宿主在感染后就是一个有机的整体,它们一同工作和生活;但是病毒又有自己的主张,当条件满足时它就会自己发作。病毒为了保证自己的被调用概率较高,会寄生于多个程序或区域中,而且它们的感染对象是有一定选择的,一定是使用频率很高的才会引起它们的注意,因为只有宿主活动它们才有被调用的机会。
一般来说,病毒的感染目标是一些可执行代码,计算机系统中可执行文件只有两种:引导程序和可执行文件。另一类经常被感染的目标是宏(Macro),宏是一种可执行代码,但是不能独立作为文件存在,它们所感染的是一类称为宏病毒的特殊病毒。病毒还会感染BIOS,不过由于现在基于Flash ROM的BIOS都带写保护,所以即使被感染,只需要重写BIOS即可消除病毒。病毒的一般感染目标主要有:硬盘系统分配表扇区(主引导扇区)、硬盘Boot扇区、软盘Boot扇区、覆盖文件(.OVL)、可执行文件(.EXE)、命令文件(.COM)、COMMAND文件、IBM-BIO文件、IBM-DOS文件。
病毒代码占据了原始的引导扇区的数据,为了能够让系统正常启动(系统不启动,病毒自己也没有办法行动,病毒和宿主的关系是“唇亡齿寒”),于是把真正的Boot扇区信息移到磁盘的其他扇区。当病毒的加载工作已经完成,进驻内存后,就会引导DOS到存储引导信息的新扇区,从而使系统和用户无法发觉信息被挪到新的地方。同时至少病毒的一个有效部分仍驻留在内存中,于是当新的磁盘插入时,病毒就会把自己写到新的磁盘上。当这个磁盘用于另一台机器时,病毒就会以同样的方法传播到那台机器的引导扇区上。这就是引导型病毒的传播方式,如同潜伏在系统启动过程中的必经之地,在每次启动的半途中,病毒程序便会夺取控制权,为病毒的感染做准备。此种感染方式的特点如下:
(1)病毒有频繁攻击的机会,系统每次启动病毒都会被激活;
(2)隐蔽性差,极易被发觉。
病毒必须保存好原Boot扇区或主引导扇区,否则自己也无法启动。如病毒长度大于512 B,需占用别的扇区(想想这是为什么?)。需要常驻内存的病毒一般需要将其代码隐藏到RAM内存区中,这个区域是用户一般不易注意到的地方,是病毒理想的栖身场所。病毒还要争取较长的病毒活动时间。宿主程序退出运行之后,病毒代码可独立地伺机继续攻击。此外病毒常驻内存的同时,还需要篡改系统中断,以便被激活。
病毒驻留内存的代码常常是病毒修改过的“中断处理程序”,病毒通过修改中断向量,使预定的中断发生时先运行驻留内存的病毒程序,以便进行感染和破坏。这些被修改的中断向量常常是操作系统程序和应用程序运行时经常涉及的中断。其中主要有INT 9H:用来读取键盘输入;INT 8H:计时中断;INT 13H:读、写磁盘;INT 25H:读磁盘逻辑扇区;INT 26H:写磁盘逻辑扇区;INT 21H的4BH:在可执行程序中调用另一程序。
当病毒感染宿主后,一般都会引起宿主程序长度的变化,因为它需要把自己放入宿主程序中。显然,不同病毒引起的宿主长度变化是不同的,因为病毒本身长度就随着种类不同而变化,加上感染方式各异,于是宿主长度变化量就千差万别。总体来说,宿主感染病毒后长度变化情况有以下4种:
(1)长度不变;
(2)增加的长度为恒定值;
(3)增加的长度在一个固定范围内变化;
(4)每次被病毒感染,宿主程序的长度都发生变化。
注意,能做到使目标宿主染毒后长度保持不变的病毒都采用了特殊编程技巧,其共同特点是要么隐蔽性极强,要么破坏力奇大。总之,具有这种能力的病毒一定是恶性病毒,需要特别提高警惕性。
根据感染次数来分类,又可将感染分为单次感染与重复性感染。
所谓单次感染,有的书上也称其为“一次性感染”,顾名思义就是指病毒对宿主只感染一次,若病毒在对感染目标检测发现其已经染上自己这种病毒就不再感染它。重复性感染则是指无论目标是否已被感染,病毒在设定次数内都会对其再次进行感染动作。重复感染过程如图6.2所示。
图6.2 重复感染过程图
根据感染次数是否有限,可将重复性感染分为简单重复感染与有限次重复感染。其中属于简单重复感染的病毒感染次数是没有设定上限的,且每次感染的病毒代码、代码长度及植入宿主的位置都是一样的。简单重复感染在很多时候并不是作者有意为之,而是编程错误所致,如著名的Jerusalem(耶路撒冷病毒)。属于有限次重复感染的病毒也比较简单,和简单重复感染相比的区别就是它们感染宿主的次数有一个预设值,达到这个值后则不再继续感染。
除了根据感染次数是否有上限来分类重复性感染,还可以将重复性感染分为变长度重复感染和变位重复感染。
(1)变长重复感染
此类病毒每次感染宿主都会造成宿主长度变化量的不定值增长。如果不给它设一个感染上限,则宿主的长度会不断增加,直到机器无法装载,从而死机或系统崩溃。这种感染方式看起来比较笨,但是作用效果却十分可怕。
(2)变位重复感染
这类病毒的特点在于其每次感染宿主时,植入病毒代码的位置都会发生改变。如1992年1月被发现的AUTO病毒,它的感染目标是COM文件,每次感染宿主的长度变化量都是129 B,但它每次感染的位置是不同的:第一次感染的植入点在宿主头部;以后每次感染的植入点在宿主尾部。变长重复感染与变位重复感染的感染方法如图6.3所示。
图6.3 两种感染方法示意图
以下为两种不同的感染引导区的方法。
(1)寄生式感染(Parasitic Infection)是最常见的感染方式,病毒将自身的代码植入宿主,只要这么做了,不论植入点在宿主的头部、尾部,还是中间部位,都称为寄生式感染。
1)感染DOS下COM文件,如图6.4所示。
图6.4 DOS感染示意图
2)感染MZ文件,如图6.5所示。
图6.5 MZ感染示意图
3)MZ感染驱动程序尾部的方法(两种),如图6.6所示。
图6.6 MZ感染驱动程序尾部示意图
(2)插入式感染
图6.7是插入式感染的示意图。
图6.7 插入式感染示意图
图6.8是RAM病毒插入示意图(逆插入)。
图6.8 RAM病毒插入示意图
滋生感染(Companion Infection)是一类很不常见的手法。由于其特殊的工作方式,使用滋生感染法的病毒一般又称为伴侣病毒。滋生感染一共有三种做法。
这一系列病毒首先在目录中搜索EXE文件,但是不去动它,而是生成一个和该EXE文件同名的COM文件。换句话说,这时的目录下面有了两个文件名相同但后缀一个是EXE,一个是COM的文件。EXE文件没有丝毫改变,而COM文件则完全就是病毒体本身。也就是说,滋生感染法病毒的病毒体是独立作为文件存在的,但是又不能脱开它的宿主。这时,只要用户输入那个文件名,根据DOS下COM文件运行优先级高于EXE文件的规则,运行的是病毒体。只要这个目录下的病毒文件还在,EXE文件就总不能被执行。显然这种办法只适用于DOS,且对于有经验的用户意义不大。
需要对目标文件的文件名略加修改(如改掉后缀名的最后一个字母),然后将病毒文件以原始目标文件名存放,同时现在几乎所有的这类病毒都会将被修改的目标文件的属性改为“隐藏”。这种做法比上面的使用范围要广得多,在Windows下同样适用。
另一种方法更少见,叫作PATH滋生。它利用DOS-PATH的搜索特点,具体来说又有三种做法:一是将自己存为目标文件的文件名,然后添加进DOS-PATH的高级目录中,这样根据执行的优先级就是病毒体先被激活;二是将目标文件移动到该目录的子目录下;三是将病毒体所在文件的文件名修改成比较吸引人的名字,诱骗用户单击。
DIR-Ⅱ病毒感染软盘的方式(链式感染)如图6.9所示。
图6.9 DIR-Ⅱ病毒感染软盘
零长度感染。病毒在感染宿主程序时,要将病毒程序放入宿主程序中,这样做一般会使宿主程序增长,很容易被人发现。而零长度感染病毒在感染时,虽然也把病毒程序放入宿主程序中,但宿主程序的长度却保持不变,这类病毒不易被发现,有很好的潜伏性。这类病毒采用特殊的编程技巧。具体说来有两种方法:空洞法和压缩法。
(1)空洞法。这种方法需要先在宿主程序中寻找到合适的“空洞”,然后病毒将修改宿主程序的开始部分使之指向自己,从而能保证自己首先运行。所谓“空洞”(Cavity)指的是宿主中具有的长度足够且全部为0的程序数据区或堆栈区。于1991年发现自保加利亚的Phoenix 2000病毒即为一例,它会事先检查目标中有没有连续的2 000 B的全0空间,如果有则将自身代码写入,否则不感染。
(2)压缩法。这种手法使用到文件压缩技术。为了说明清楚,假设被感染前的正常宿主为O1,压缩后的宿主为O2,病毒体为V,则具体压缩步骤如下:
(1)病毒发现O1,于是调用自带压缩模块对其进行压缩,使其变为O2,且V和O2的长度总和不大于O1;
(2)病毒将V放在O2的头部,组成一个长度等于O1的文件。
上面步骤也是感染的步骤,如果需要执行染毒程序,则将上述步骤倒过来,并将其中的压缩操作换位解压缩操作即可。
2.触发机制
计算机病毒有三种机制,前面已经介绍了感染机制,它负责病毒的传播。而破坏机制体现了病毒的杀伤能力。计算机用户每年由于病毒而产生的各种损失不计其数,使得病毒预防和处理也成为一个很大的产业。但病毒仅仅只有感染和破坏两个模块是不能够完成其设定任务的。过于频繁的感染和破坏会使病毒暴露,且令系统不稳定,让自己的生存环境也不太好;完全不破坏、不感染又会使病毒失去杀伤力。因此,病毒必须潜伏,少做动作以躲避检查而隐蔽自己;如果完全不动作,仅仅只是潜伏的话,病毒又失去了其存在的意义。所以,为了病毒最好地实现“静若处子,动若脱兔”,该安静的时候安静,该发作的时候也毫不犹豫,将这两点紧密联系在一起的就是触发机制。
触发机制是指病毒用于判断发作条件的方法,一旦环境合适就通知病毒进行感染或破坏。这是病毒用于调节发作和潜伏比例的游码。很多没有能广泛流行的病毒之所以失败的原因,除了自身设计问题以外,没有选取一个合适的触发机制占据了相当大的比例。在触发机制上,可以看到病毒作者那无与伦比的想象力和创造力。
触发条件是病毒中的敏感部分,由病毒作者事先定义。触发条件可以是时间、日期、文件类型、击键动作、开启邮件或某些特定数据,甚至是一个比较少用的中断,都能成为触发的理由。病毒被运行后就进驻内存,然后不停地扫描系统动作,这里触发模块就不停地检查定义的条件是否满足,环境是否合适。如果满足,则进行相应的感染或破坏动作;否则将继续潜伏。计算机安全人员在深入分析病毒时,往往需要一个安全的环境,因此很有必要搞懂手中病毒的触发机制,以便修改此部分代码,使病毒不会发作;或者当需要弄清病毒行为特征时也可以对此处进行修改,让病毒样本频繁发作,以研究对策。常见的触发条件有时间触发、操作触发、启动触发、中断触发、感染触发和其他触发形式。
3.破坏机制
如果说感染机制体现了病毒作者高超的编程技巧和对计算机系统的理解,触发机制体现了病毒作者的奇思妙想,那么破坏机制则是他们底层性格和品行的最好注解。有的人写出病毒只是开个小玩笑,中毒的人也就一笑而过;但是有的病毒则会对中毒者的计算机系统造成永久的、不可修复的毁灭性打击。本节会对最常见的病毒破坏行为进行归纳。其中常见的行为有对文件、系统、内存、硬件的破坏,混合攻击方式和其他攻击方式。
病毒对于文件破坏的行为主要有:删除文件、给文件改名、替换文件内容、擦除部分代码、颠倒内容、擦除写入时间、将宿主弄成碎片、将写操作改为只读操作。
病毒对系统的破坏的行为主要有:干扰DOS内部命令、不许系统打开文件、更换现行磁盘、重新启动、强制游戏、耗费系统资源。
病毒对内存的破坏的行为主要有:挤占大量内存、降低实际内存、逐步吃掉内存、禁止内存分配。
对硬件的破坏。有的病毒会利用打印端口,让打印机不停地工作或时断时续地工作等,如于1991年发现的1024 SBC病毒就会让打印机工作断断续续。有的病毒会让键盘无法输入字符,如于1990年1月产于法国的EDV病毒就是一例,它会将键盘输入完全堵塞。还有的病毒会让喇叭演奏一些预定好的曲目,如联邦德国的Ambulance Car病毒发作后就在屏幕下方显示出一个到处跑的救护车,同时机箱喇叭发出警笛声。总之,只要是连接上计算机的硬件设备都有被攻击的可能。
混合攻击方式。混合攻击方式就是病毒的破坏行为不是单纯的一种,而是将几种方式结合起来。甚至可以这么说,绝大部分的病毒都不止一种破坏行为。现在病毒的破坏和感染、触发已经不再是相互独立的做法,很多都已经实现了融合,它们在感染和触发时就已经对系统或文件造成了损害,已经很难界定病毒代码的某段是单纯地起什么作用了。
其他攻击方式。病毒的破坏方式实在是层出不穷,不胜枚举。例如,有攻击系统数据区的Year1992病毒,会将系统硬盘、分区表、引导区、根目录、FAT一起覆盖;有假冒系统文件的MANTA病毒,它会用一个假文件替换真正的Autoexec.bat和Config.sys文件;还有4096病毒,它能破坏数据文件,在硬盘上隐蔽而缓慢地生成交叉链,让被攻击的文件彻底失效,只能删除。