正如生物进化通过自组织的内部机制,使内部各组成部分相互作用,自发形成日趋复杂、完善、有序的结构和功能,计算机病毒进化的内部机制同样遵循自组织理论。自组织是计算机病毒进化的内因、内在动力,为计算机病毒进化提供了基本素材,并由此形成了多样性的新物种:蠕虫、木马、后门、Rootkit、逻辑炸弹、僵尸、流氓软件、勒索软件、间谍软件、挖矿软件等。
计算机病毒进化的自组织内部机制,主要表现为两大机制:①获得性遗传机制,促使优秀基因得以保存;②基因突变与重组机制,促使物种多样性发展。
1809年,法国博物学家拉马克在其《动物哲学》一书中系统地提出了生物进化学说,其主要内容之一是“用进废退”和“获得性遗传”。书中写道:“这些种类,由于长期受生活地域之环境约束的影响,以致某部分器官特别常用,某部分器官恒常不用;影响所至,自然就使物种的个体获得某部分器官或丧失某部分器官。因此,新生的个体,世代累积地存续着上代的特质。”由此可见,拉马克认为物种受环境长期影响所产生的变异是生物进化的主要原因,在“用进废退”的作用下,物种因环境长期影响所“获得”的变异是能够遗传给后代的。
获得性遗传学说从其诞生及其后的发展,始终处于世人的批判甚至围攻之中。获得性遗传理论之所以引起种种非议,在于人们试图用实验的方法去验证是极为困难的。根据拉马克学说,获得性遗传是一个漫长的历史过程,要通过多代人用多个实验来验证是不现实的。拉马克说:“时间和良好的环境约束,是两个自然为造成一切生成物所用的主要手段;谁都知道,时间对于自然是没有任何限制的。”
然而,生命科学的迅猛发展使获得性遗传学说再获生机。20世纪70年代,“反转录酶(Reverse Transcriptase)”的发现及“逆中心法则(Inverse Central Rule)”的问世,使获得性遗传理论在过去的宏观依据基础上又找到了分子水平上的科学依据。
计算机病毒是一段可自我复制、自我隐蔽、自行传播且具有某种破坏作用的程序代码。为适应外部运行环境,计算机病毒已进化出一些特定代码结构,以匹配其相关行为模式。而此类特定的代码结构,通常是计算机病毒成功实现自身相关功能、适应外部运行环境,且被实践证明了的行之有效的代码结构。借由获得性遗传机制,此类特定代码结构通过从父代遗传至子代而得以完好保存,并以此推动计算机病毒不断进化,以更好地适应外部运行环境。
计算机病毒获得性遗传机制主要体现在代码结构上,可遗传的代码结构分两类:宏观逻辑结构和微观功能结构。
正如自然界中飞禽的翼、走兽的爪、游鱼的鳍,都是适应其各自环境的身体结构进化最合理的体现,计算机病毒的宏观逻辑结构,也是充分利用外部运行环境资源、用进废退的最合理体现。因此,此类宏观逻辑结构是计算机病毒获得性遗传机制的直接证据与具体体现。计算机病毒的宏观逻辑结构通常有5个部分:感染标志、引导模块、感染模块、触发模块、表现模块。
(1)感染标志是一些以ASCII码方式存储于宿主程序中的数字或字符串,是计算机病毒决定是否实施感染的依据。不同的计算机病毒,感染标志的位置、内容通常不同。例如,曾经造成Windows 9×系统大面积感染的CIH病毒,其感染标志是调试寄存器DR0的值是否为0。如该寄存器值为0,则CIH病毒实施感染。耶路撒冷病毒的感染标志是在调用中断21H的E0H功能时返回码是否为03H。如其返回码不为03H,则将感染宿主程序。
(2)引导模块是指通过检查外部运行环境,将计算机病毒主体代码加载至内存、设置病毒激活条件,并保护病毒免受破坏的先行引导性代码。当然,在不同环境中运行的计算机病毒,其引导模块通常不同。例如,CIH病毒主要利用Windows 9×的VXD技术,其引导模块首先会检查系统是否为Windows 9×,如是则实施病毒加载,否则退出。
(3)感染模块是负责实现计算机病毒感染机制、实施感染操作的程序代码。该模块主要负责搜寻感染目标,检查目标是否满足感染条件,在满足条件时实施感染,否则退出。
(4)触发模块是实现计算机病毒特定触发条件判断的代码,通常借由相关触发条件以决定是否触发病毒,有触发日期、触发按键输入等。例如,CIH病毒的触发条件为系统日期是26日;黑色星期五病毒的触发条件为既是13日又是星期五的这一天;小球病毒的触发条件为当系统时钟处于半点或整点且系统又在进行读盘操作。
(5)表现模块是表现病毒行为、实施破坏操作的程序代码。计算机病毒的表现症状和破坏程度,取决于病毒的表现模块。例如,CIH病毒发作时,将破坏硬盘数据,还可能破坏BIOS程序。在破坏硬盘数据时,将以2048个扇区为单位从硬盘主引导区开始依次往硬盘中写入垃圾数据,直到写满整个硬盘数据为止,造成硬盘数据全部被破坏。在破坏BIOS芯片程序时,将垃圾数据写入某些主板的E 2 PROM芯片,从而导致BIOS程序被清除而无法再次启动机器。
计算机病毒的获得性遗传机制,除了体现在计算机病毒宏观逻辑结构中,更多地体现于微观功能结构中。计算机病毒的微观功能结构,是指计算机病毒为更好地适应外部运行环境,在实现某一特定功能时所表现出的机器指令代码结构,例如,计算机病毒的重定位结构、自我复制结构、自我隐匿结构、搜寻目标结构、自我删除结构、花指令变形结构等。经过长期进化,计算机病毒的此类微观功能结构通常稳定性较好。即使计算机病毒在行为方面发生了较大的改变,但其微观功能结构通常也只在一定范围内变化,表现较为稳定。
(1)重定位结构。通常而言,正常程序不用去关心变量、常量的位置,只因其位置在编译源程序中就已被计算好了。当程序被加载至内存时,系统不用为其重定位,在需要调用相关变量或常量时,直接利用其变量名进行访问即可。同样地,计算机病毒作为一段程序,自然也会用到变量或常量。当计算机病毒感染宿主程序时,由于其依附在宿主程序的位置各有不同,导致计算机病毒中的各个变量或常量在内存中的位置也各不相同。既然这些变量没有固定的地址,那么计算机病毒在运行时该如何引用这些变量或常量呢?答案就在计算机病毒的重定位结构中。
重定位结构是计算机病毒借以确定其相关变量或常量在内存中的位置,并能正常访问相关系统资源的代码结构。通常,计算机病毒的重定位结构位于病毒程序开始处,且代码少、变化不大。
DOS系统中重定位结构的汇编代码如下:
Windows系统中重定位结构的汇编代码如下:
首先,通过call vstart获得变量vstart在内存中的实际地址。其次,通过offset vstart获取变量vstart与重定位点的偏移。再次,通过sub ebx,offset vstart获得重定位点在内存中的地址。最后,在确定其他变量xxx时,用这个重定位点ImagePosition加上变量的偏移即可,即add ImagePosition,offset xxx。
在DOS时代,计算机病毒为感染EXE文件需要重定位结构;到了Windows时代,计算机病毒感染EXE文件仍需要重定位结构。然而,随着外部运行环境的变迁:①Windows系统与DOS系统的字节长度不一样:Windows系统为32/64位,DOS系统为16位;②Windows系统中的EXE文件格式与DOS系统中的EXE文件格式不同,计算机病毒的重定位结构的变化也是其进化的见证。其一,体现在遗传变异机制上,Windows系统中计算机病毒重定位结构基本遗传继承了DOS系统中的重定位结构,只在寄存器使用上出现了变异。其二,体现在自然选择机制上,Windows系统中计算机病毒重定位结构之所以出现少量变异,是因为CPU寄存器已由DOS系统的16位改变为Windows系统的32/64位。外部运行环境的改变,迫使计算机病毒为适应之而进化自身,自然选择的威力可见一斑。
(2)自我复制结构。在自然界中,自我复制是指生物体内通过代谢作用,按照原有结构复制成为完全相同的结构的生物合成过程。例如,脱氧核糖核酸(DNA)在生物体内以原有的DNA分子为模板,合成两个完全相同的DNA分子。
计算机病毒在搜寻到目标后,需要将自身代码复制到宿主程序中,以实现感染目的。计算机系统的特殊性使得计算机程序代码的自我复制相对简单,只需要不断循环地将数据从源寄存器移动至目的寄存器。通常,简单的rep movsb命令、rep movsw命令、rep movsd命令或copy命令即可完成计算机病毒的自我复制。
(3)搜寻目标结构。为最大可能地感染目标,计算机病毒会竭尽所能搜寻满足其设定条件的目标文件,以扩大其感染范围与影响。搜寻目标结构,就是计算机病毒为达到这个目的而设置的目标文件搜索代码结构。通常而言,不同的计算机病毒所采用的搜寻目标代码会有所不同,但大同小异,所实现的功能是相似的。目标搜寻功能在DOS系统中有INT 21h的4Eh/4Fh服务:4Eh查找第一个匹配项,4Fh查找下一个匹配项。在Windows系统中有两个等价的API函数:FindFirstFile()和FindNextFile()。
可见,随着计算机病毒外部运行环境的改变——从DOS系统变为Windows系统,计算机病毒的搜寻目标结构也发生了相应改变:由DOS系统的INT 21h的4Eh/4Fh服务变为Windows系统中的FindFirstFile()和FindNextFile()。上述计算机病毒的搜寻目标结构的变迁,进一步印证了计算机病毒不断进化以适应环境的事实。
(4)自我隐藏结构。为逃避反病毒软件的查杀,计算机病毒通常会进行自我隐藏:隐藏病毒特征,以长期潜伏于宿主程序或操作系统环境中。无论是DOS时代的中断向量隐藏、扇区隐藏、目录隐藏,还是Windows时代借助Rootkit技术实现的系统对象(包括文件、进程、驱动、注册表项、开放端口、网络连接等)隐藏,都是计算机病毒在其进化过程中所展现的自我防卫、自我保护技能。
在DOS时代,计算机病毒实现自我隐藏的方法很多,但以钩挂中断向量为主。例如,为将自身复制到已写保护的软盘,要避免DOS系统出现“Abort,Retry,Ignore”这个错误提示信息,需取代原来的INT 24h中断向量,并以mov al,3和iret指令替代。
在Windows时代,Rootkit(通过修改操作系统内核或更改指令执行路径)等技术方法的出现使得计算机病毒能随心所欲地实现自我隐藏功能。从上述计算机病毒的自我隐藏结构的进化可知,计算机病毒外部运行环境的改变,导致计算机病毒自我隐匿结构的改变,且变得更复杂更高级。这又是计算机病毒进化的明证。
(5)自我删除结构。为规避反病毒软件的扫描检测,除自我隐藏结构外,部分计算机病毒还进化出有些许悲壮色彩的自我删除结构。一旦计算机病毒在目标系统中执行,就会运行自我删除结构,启动自我删除功能,将其自身从目标文件系统中删除。
可见,在面临不同外部运行环境时,计算机病毒的自我删除结构也能进行相应的调整:既可利用DOS系统命令,又可利用汇编语言和堆栈平衡机制,还能利用解释环境中的脚本命令。这些改进与自我完善,也是计算机病毒进化的明证。
(6)多线程结构。在计算机科学中,进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(进程创建的文件、管道、同步对象等)组成。线程是进程中的一个单一的顺序控制流程。一个应用程序可以有一个或多个进程,同样地,一个进程可以有一个或多个线程,其中一个是主线程。线程是操作系统分时调度分配CPU时间的基本实体。一个线程可以执行程序任意部分的代码,即使这部分代码被另一个线程并发地执行;一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源。
多线程(Multithreading)是指从软件或硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,进而提升整体处理性能。多线程通过同步完成多项任务,来提高资源使用效率,进而提高系统运行效率。
对于计算机病毒而言,多线程是其梦寐以求的技术:①可使计算机病毒与宿主程序同时运行,且互不干扰。②能给感染用户以系统运行正常的假象,使其以为“天下无毒”。③更好地隐蔽自身,扩大传播感染范围。
众所周知,由于DOS系统是单线程、单任务系统,计算机病毒无法实现多线程功能。当Windows系统取代DOS系统成为主流系统平台后,为减少占用系统资源并尽量完成自身功能,计算机病毒进化发展出多线程结构。这也是计算机病毒进化的证明。
(7)SEH(Structured Exception Handling,结构化异常处理)结构。SEH是Windows操作系统处理程序错误或异常的一种系统机制,与特定的程序设计语言无关。Windows系统的重要理念是消息传递与事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(回调函数),传递的参数就是这个消息。同样地,可将异常视为一种消息,当应用程序发生异常时就触发并将该消息告知系统,系统接收异常后会自动去找它的回调函数(异常处理例程)。当然,如果程序中没有异常处理例程,将弹出常见的应用程序错误框并结束该程序。
任何程序都有可能出错,计算机病毒也不例外。如果计算机病毒出错,在弹出错误信息框后将被强制结束,这既让计算机病毒易被发现,又不利于计算机病毒运行。因此,利用Windows系统中正常的SEH机制来处理计算机病毒设计中可能出现的错误,可让计算机病毒正常运行,避免被反病毒软件查杀。SEH机制是Windows系统所特有的,对于DOS时代的计算机病毒而言根本无此结构,因此,Windows时代的计算机病毒逐渐拥有此结构,再次无可辩驳地表明计算机病毒的进化。
(8)EPO(Entry Point Obscuring,入口点模糊)结构。EPO结构是计算机病毒为对抗反病毒软件常规入口点检测而进化发展出的一种规避技术。由于多数反病毒软件只会对PE文件入口处的代码进行启发式检查,如只是简单地修改PE入口点,则极易被其识别、查杀;如将病毒代码隐藏至PE文件中间某个位置,则将为反病毒软件制造困难,使其难以检测。EPO结构正是这种思想的代码体现,通过把计算机病毒入口置于PE文件中某个不明显的位置,来减少被检测查杀的可能性。
在大多数程序中,代码段通常都不是最后一个节。而计算机病毒多在PE文件最后添加新节或将代码附加于最后一个节中。如果反病毒软件发现入口在最后一个节,则认为可能感染病毒。在计算机病毒采用EPO时,通常采用改变程序入口处的代码,例如,改成JMP VirStart,跳转到病毒体执行。这种方法只能躲避最原始的对代码入口是否正常的检查。
后来,计算机病毒通过进化,选择了其他EPO实现方法,概括起来有如下两类:①在PE文件代码中的任意指令位置,将其替换成JMP VirStart或CALL或其他转移指令跳转到病毒体去执行。②将IAT中的函数打补丁。前者的困难在于难以判断PE文件中任意位置是否为一条指令的开始,后者的困难在于PE loader加载PE文件时会用正确的函数地址填充这些地址,而计算机病毒所实现的IAT函数补丁就会被覆盖。
(9)花指令结构。指令是计算机系统中用来进行某种运算或实现某种控制的代码。花指令,简称“花”,指像花儿一样的指令,吸引用户去观赏其美丽“花朵”,而忘记或忽略“花朵”后面的“果实”。
所谓花指令,是指在程序中的无用代码或垃圾代码,有之程序能照常运行,无之也不影响程序运行。花指令通常是一些看似杂乱实则另有目的的汇编指令,能让程序逻辑进行跳转,使得反病毒软件不能正常判断病毒特征,从而增加反病毒软件查杀难度。
在构造花指令时,一般可采取4种方法:①替换法,即将花指令原有的一句或多句汇编代码用功能相同的其他汇编代码进行替换。②添加法,即在原有的花指令中再加入一些汇编代码,使得这段花指令有锦上添花的意味。③移位法,即将原有的花指令顺序进行一些调整,例如,将前后代码进行互换,或者将第三句和第四句代码互换。④去除法,即将原来花指令中某些汇编代码删除,使得这段花指令变得更加简单实用。
基因是遗传的物质基础,是DNA(脱氧核糖核酸)分子上具有遗传信息的特定核苷酸序列的总称,是具有遗传效应的DNA分子片段。基因通过复制把遗传信息传递给下一代,使子代出现与亲代相似的性状。基因是生命的密码,存储着生命孕育、生长、凋亡过程的全部信息,通过复制、表达、修复,完成生命繁衍、细胞分裂和蛋白质合成等重要生理过程。
生物的遗传变异有3种:基因突变、染色体变异和基因重组。通常将前二者统称为基因突变。基因突变是某个基因上的某些碱基对的增添、缺失或替换,从而导致基因结构的改变,可产生新的基因。对于发生基因突变的生物而言,如果突变发生在可表达的基因(编码区)上,则会导致性状改变;如果发生在非编码区或内含子上,或者发生突变后编码的氨基酸种类不变,将不会发生性状改变。
染色体变异是指因染色体片段的缺失,引起染色体上基因的数目或排列顺序发生改变,从而导致性状改变。一般而言,染色体变异后会对个体性状产生一定的影响,很多变异会导致个体不育甚至死亡。
基因重组是生物变异中最普遍的现象,它普遍存在于有性生殖过程中,主要是在减数分裂中染色体的重新组合,与积木推倒重建类似,并未产生新的基因,只是原有基因的重新排列组合。
基因突变是指DNA分子中因发生碱基对的替换、增添和缺失而引起的基因结构改变,包括单个碱基改变所引起的点突变,以及多个碱基的缺失、重复和插入等基因突变。基因虽然非常稳定,能在细胞分裂时精确地复制自己,但这种稳定也是相对的,在一定条件下基因也可以从原来的存在形式突然改变成另一种新的存在形式,于是后代就会突然出现祖先从未有的新性状。这可能是新物种不断产生的分子学解释。
计算机病毒是一种程序代码,不管其源代码由何种计算机语言编写,其最终生成的且能在计算机系统上运行的只能是二进制形式的机器码。为表达简便,计算机系统中还存在除二进制外的另一种数制:十六进制。其实,十六进制和二进制在本质是一样的,只是表现形式不同。在二进制中,只有两个原子形式:0和1。在十六进制中,则有多达16种表示形式:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。如果将这些数制的基本表示形式视为基因,那么,对于二进制代码而言,有两种基因,对于十六机制代码而言,则有16种基因。因此,从数字基因的角度来看,计算机病毒或更广义的计算机程序,就是由诸多数字基因构建的、有特殊功能的、能自动运行的人工生命体。
倘若计算机病毒能使其基因突变,改变自身的某些基因,尽管不能造就新的计算机病毒,但能改变自身某些性状(特征码),从而逃避反病毒软件查杀,更好地适应外部运行环境,最大可能地保护自身。
下面将以重定位码为例,介绍计算机病毒基因突变机制。
前面已介绍了计算机病毒的重定位结构,它是计算机病毒用来确定其变量或常量在内存中的位置以正常访问相关系统资源的功能代码结构。对于文件感染型计算机病毒,重定位码是不可或缺的。因此,重定位码成了某些反病毒软件查杀文件型计算机病毒的重要特征码依据。如果计算机病毒能在重定位码上实施基因突变,又不影响重定位功能的话,则会增强其免杀能力,从而有利于其更好地生存发展。
计算机病毒重定位结构汇编代码与其对应的重定位基因码如表2-1所示。
表2-1 计算机病毒重定位汇编代码及其对应的基因码
从表2-1中不难发现,计算机病毒重定位结构的功能一样,但寄存器不同,其最终基因码将发生改变。具体而言,①当寄存器由edx→ebx时,其基因码的差别仅为A→B;用二进制数表示即为1010→1011,差别在于最后一个基因由0→1。②当寄存器由ebx→ebp时,其基因码的差别仅为B→D;用二进制数表示即为1011→1101,差别在于中间两个基因发生突变:0←→1。③当寄存器由ebp→esi时,其基因码的差别仅为D→E;用二进制数表示即为1101→1110,差别在于最后两个基因发生突变:0←→1。④当寄存器由esi→edi时,其基因码的差别仅为E→F;用二进制数表示即为1110→1111,差别在于最后一个基因发生突变:0→1。
从基因突变的角度来看,计算机病毒仅通过改变一个基因或最多两个基因,即可完成病毒特征码改变且不影响其特定功能。通过此例不难理解,作为一种可能的人工生命体,计算机病毒的基因突变机制尽管不能造就新型计算机病毒种类出现,但确实能导致其相关特征码的改变,从而规避反病毒软件查杀,更好地适应外部运行环境。
基因重组是指一个基因的DNA序列是由两个或两个以上的亲本DNA组合而成的。基因重组是遗传的基本现象,病毒、原核生物和真核生物都存在基因重组现象。基因重组是对基因的重新排列组合,不影响基因(序列)本身。从广义上说,任何造成基因型变化的基因交流过程,都可视为基因重组。
基因重组是一种广泛存在的生物遗传机制。无论在高等生物体内,还是在细菌、病毒中,都存在基因重组现象。不仅在减数分裂过程中会发生基因重组,在高等生物的体细胞中也会发生基因重组。基因重组不仅可以发生在细胞核内的基因之间,也可以发生在线粒体和叶绿体的基因之间。只要有DNA,就可能发生基因重组。
类似于生物学上的基因重组,计算机病毒基因重组是计算机病毒进化过程中重要的遗传变异机制,是计算机病毒同源性的重要依据。纵观计算机病毒进化史,不难发现计算机病毒基因重组机制无处不在,已成为推动计算机病毒自我进化的重要内在动力。
其实,任何造成特征码变化的计算机病毒代码交流过程,都可视为计算机病毒基因重组。从计算机病毒演化历史来看,计算机病毒从简单到复杂、由低级向高级、从单一平台到多平台的发展趋势表明,计算机病毒基因重组机制发挥了重要作用。计算机病毒通过相互借鉴、相互参考、相互学习、相互交流的方式进行病毒基因重组,从而取长补短、共臻进化佳境,在种类、数量、复杂性、隐蔽性、破坏性等诸多方面完成进化史上的嬗变,实现不断突破与超越发展。
下面将从计算机病毒种类、数量及同源性3个方面,探讨计算机病毒基因重组机制在计算机病毒进化中的重要作用与地位。
在计算机病毒种类方面,病毒基因重组机制至关重要。计算机病毒从最初单一的感染型病毒进化到蠕虫、木马、间谍软件、Rootkit、僵尸网络等多种类型,病毒基因重组机制扮演着重要角色。
计算机病毒的本质特征是自我复制。在计算机病毒进化史上,随着计算机病毒外部运行环境的升级更替,出现了其他不同的计算机病毒种类,但其自我复制的本质特征却一直未变。对于当初原始简单的DOS病毒而言,不论其寄生于可执行文件还是引导区,其自我复制基因都将一直代代相传。一旦感染成功,计算机病毒就会借助自我复制基因进一步繁殖自身、扩大感染影响范围。当绝大部分计算机病毒仍徘徊在DOS系统平台感染文件系统之际,计算机网络环境的出现让计算机病毒看到了进化曙光。为适应新的网络计算环境,计算机病毒开始突变为网络蠕虫,并利用网络漏洞疯狂自我复制,极尽所能拓展感染领地。例如,1988年Morris蠕虫诞生后,其利用UNIX系统中sendmail、Finger、rsh/rexec等程序的已知漏洞及薄弱口令,通过网络自我复制而感染的主机数高达6000多台。
在程序结构上,木马尽管不同于计算机病毒的单一程序结构而进化为C/S结构,但其自我复制基因却一直未变。木马通常借助两种方式传播自身:①通过E-mail,控制端将木马程序以附件形式在邮件中发送出去,收件人只要打开附件就会感染木马;②通过软件下载,一些非正规网站常以提供软件下载为幌子,将木马捆绑在软件安装程序上,一旦下载并运行此类程序,木马就会自动安装。
间谍软件其实是木马或后门中的一类,通常定义为从计算机系统中搜集信息,并在未得到授权许可时就将信息传递到第三方的计算机病毒,包括监视击键、搜集机密信息(密码、信用卡号、PIN码等)、获取电子邮件地址、跟踪浏览习惯等。间谍软件尽管不同于传统计算机病毒,但其自我复制基因仍未改变,一般也会借助E-mail或软件下载来传播自身。
Rootkit是一种特殊的计算机病毒,能在目标系统中隐藏自身及指定的文件、进程和网络链接等信息。Rootkit常与蠕虫、木马、后门等其他计算机病毒类型结合使用,因而其所具有的自然复制基因同样代代相承。
僵尸网络(Botnet)是指采用一种或多种传播手段,使Bot程序感染大量目标主机,从而在控制者和被感染主机之间形成一对多的控制网络。攻击者通过各种途径传播僵尸程序以感染网上的大量目标主机,而被感染的主机将通过一个控制信道接收攻击者的指令,从而组成一个僵尸网络。僵尸网络可视为木马的扩大升级版,其自我复制基因依然根深蒂固,常借助漏洞、E-mail、即时通信软件、网页脚本等方式传播。
综上,计算机病毒基因重组机制所导致的病毒同源性,是分析计算机病毒性质、划分计算机病毒种类、跟踪计算机病毒进化、提取计算机病毒特征的重要理论依据。
在计算机病毒数量方面,病毒基因重组机制功不可没。在计算机病毒进化史中,DOS时代的计算机病毒在数量上有限,以致当时的反病毒软件在应付病毒时胸有成竹、游刃有余,完全占据了病毒攻防战的上风。然而,随着计算机病毒生产机的诞生,计算机病毒在数量上彻底颠覆了反病毒软件的预期,呈指数级增长态势,从而扭转了病毒攻防战的战略劣势。计算机病毒生产机就是利用计算机病毒基因重组机制而自动生成新的计算机病毒。
下面将以脚本病毒为例,介绍计算机病毒基因重组机制。
脚本病毒是使用VBScript、JavaScript、PHP、Python等脚本语言编写的,利用Windows系统的开放性,通过调用系统内置的对象、组件,可直接操作文件系统、注册表等,功能非常强大。例如,2000年5月4日在欧美暴发的“爱虫”病毒,通过电子邮件系统传播,致使该病毒在短短几天内狂袭全球数以百万计的计算机,包括Microsoft、Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元。
脚本病毒生产机之所以能生成大量病毒,就在于其应用病毒基因重组机制,通过对脚本病毒源代码进行分模块修改、重组,即可在短时间内产生大量具有类似功能的脚本病毒。
计算机病毒是一个包含很多数据结构、关键功能,且由特定编译器实现的模块化程序。如果将这些特定数据结构、关键功能函数、编译器架构及模块结构视为基因,则计算机病毒就是一个由很多病毒基因积木通过特定算法组合而成的病毒基因集合体。借助病毒基因重组机制,计算机病毒相互借鉴、不断衍生、持续进化,呈现“从低级向高级,由简单到复杂”的快速发展态势。这更是计算机病毒同源性的重要依据。
下面以Stuxnet病毒和Duqu病毒为例,从计算机病毒模块结构、数据结构、关键功能、编译器架构等方面,论证病毒基因重组机制在计算机病毒同源性的重要作用。
(1)Stuxnet病毒简介。Stuxnet病毒于2010年7月在伊朗暴发。它利用Windows系统中的漏洞,伪造驱动程序数字签名,通过完整的入侵和传播流程,突破工业专用局域网的物理限制;同时利用WinCC系统漏洞,对其进行破坏性攻击。Stuxnet病毒感染并破坏了伊朗纳坦兹的核设施,严重滞后了伊朗核计划。Duqu病毒于2011年10月首次暴发,被称为Stuxnet二代病毒。与Stuxnet病毒主要破坏工业基础设施不同,Duqu病毒被用来收集与其攻击目标相关的各种信息。
(2)模块结构。在程序模块结构方面,Duqu病毒与Stuxnet病毒有惊人的相似性。Stuxnet病毒主要由3个模块组成:使用数字签名的驱动模块、动态链接库模块、配置文件模块。其中,驱动模块完成两个功能:①Rootkit隐蔽功能,用于躲避反病毒软件;②解密注入功能。动态链接库模块和配置文件模块,均以加密形式存储于磁盘中,仅在需要时解密至内存。Stuxnet病毒的漏洞攻击代码和工控系统攻击代码均存储在动态链接库模块的资源节中,在需要时释放,动态链接库中包含用于与C&C服务器通信的功能。
Duqu病毒也由3个模块组成:使用数字签名的驱动模块、动态链接库模块、配置文件模块。其中,驱动模块用于解密载荷代码和注入系统进程;动态链接库模块和配置文件模块,均以加密形式存储于磁盘中,仅在需要时解密至内存。动态链接库模块中包含一个负责进程注入的动态链接库模块;该无名模块提供了多种注入方式,通过这些注入方式将自身的资源节代码注入目标进程,用于与C&C服务器通信。
(3)数据结构。在数据结构方面,Duqu病毒与Stuxnet病毒有惊人的同源性,主要体现在两者的配置文件和注册表数据上。两者的配置文件结构相似性表现在如下4个方面。
① 配置文件的前4B(被用识别标记)内容相同,均为0x90、0x05、0x79、0xae。
② 文件偏移4B为配置文件头部长度。
③ 文件偏移12B处为文件长度,区别只是长度的大小不一样。
④ 均包含生存周期。
尽管Stuxnet病毒配置文件中记录的时间为自我卸载日期,Duqu病毒记录的日期为感染日期,但后者会在感染后指定的时间内完成自我卸载。因此,两者记录日期目的相同,均为控制生存周期,防止分析人员追踪、分析样本。
Duqu病毒和Stuxnet病毒均由驱动从注册表中读取数据,注册表主键为Data键和Filter键,均为二进制数据格式,然后实施DLL注入。其中,Duqu病毒的键名有所变化,但两者注册表的数据结构几乎相同,主要包括DLL模块解密密钥、注入目标进程名、注入目标模块路径。
(4)关键功能。在关键功能方面,Duqu病毒和Stuxnet病毒也有惊人的相似性,主要体现在代码注入方式和RPC服务。Duqu病毒和Stuxnet病毒均采用DLL注入方式来隐藏自身模块,以躲避反病毒软件。两者均通过PsSetLoadImageNotifyRoutine设置回调函数来完成驱动层注入,且回调函数的功能基本一致。尽管两者采用不同的编译器,且注册表和主DLL文件的解密算法也不同,但两者的代码逻辑大致相似。两者的用户层DLL注入功能则通过挂钩Ntdll.dll中的如下函数来完成:ZwQueryAttriutesFile、ZwCloseFile、ZwOpen、ZwMapViewOfSection、ZwCreateSection、ZwQuerySection。Duqu病毒和Stuxnet病毒均提供RPC服务以完成点对点通信。
(5)编译器架构。在编译器架构方面,Duqu病毒和Stuxnet病毒也有惊人的相似性:Duqu病毒采用Microsoft Visual C++ 6.0编译,Stuxnet病毒则采用Microsoft Visual C++ 7.0编译。此外,Duqu病毒和Stuxnet病毒的主DLL都采用UPX压缩壳,且两者的主DLL模块资源节中的DLL文件都采用Microsoft Visual C++编译。