初探计算机病毒(2)--感染解释

时间:2022-08-19 15:02:52

    这篇文章是对上一篇文章中代码的解释。
    最近几天,在我的一通“扳凿斧锯”之下,第一个病毒终于被我打造出来了。被感染的程序运行将会弹出一个对话框,询问是否运行该程序,如果选择是,则会遍历当前目录下的所有exe文件,尝试在文件中插入病毒病毒代码(即弹对话框询问是否运行,选是就尝试感染当前目录下的所有exe文件)。如果该exe文件被感染过,则不反复感染。可以说这只是一个PE病毒的雏形,不具破坏能力。或者可以把它比做是远程导弹试射成功,这里导弹弹头没装炸药,更没装核弹。
    先来说说病毒的原理。WINDOWS的可执行文件是PE(Portable Executable)格式的。PE文件都会有一个464字节的头信息,在里面记录了程序运行的一些必要信息。平时我们运行一个程序可能会看到提示“不是一个有效的WIN32程序”,就是因为WINDOWS系统读取这个头信息,发现里面有错误就停止运行了。在头信息里记录了程序运行的第一条指令的位置。病毒的原理就是把病毒代码想办法附加到一个正常的程序里,然后再修改头信息中入口指令的位置为病毒的第一条指令的位置,等病毒运行完成后,再跳转到原来的正常的指令运行。
    那现在首要问题是如何把代码附加到程序里面。有两种方法,一是在原来的文件后面新加入代码;二是在原来文件中代码的空隙中加入代码。
    1.  在文件后新加入代码。这里可不能简单在正常的exe文件后面直接写入病毒程序,这样做windows系统是会报错的。因为在PE文件的头信息以及PE头后面的节表(关于节表我们稍后讲述)记录了数据区的详细属性,突然在后面加入代码,就好像有异物突然侵入人体一样,就会本能的产生排异反映。windows为了自身的稳定,也必须对一些数据进行校验,如果不能通过校验,也是不允许程序运行的。所以还有要修改PE头里面的信息以及要增加一个节表。
    这里我们来说说节(SECTION)和节表(SECTION TABLE)。在464个字节的PE头之后会跟有若干个40字节的数据。每个40个字节的数据就是一个节表。节的概念是这样的。在这些节表之后就是真正的数据区了,无论是代码、数据、资源等等都存放在这里。然而这些数据的功能不一样,属性也就不一样。比如代码,是应该可以读取、运行的,而不能改写;数据,即程序中用到的数据,一般会存储一些变量,那它们是可以被读、写的,但不能运行;那资源呢,则只能别读取,而不能被写和运行。这样那些属性相同的数据通常就会被放到同一节(SECTION)里面,比如所有的代码通常被放到同一节里面,资源被同一节里面。那么节表(SECTION TABLE)就是描述这些节的信息,每个节表对应一节数据区域。节表当中记录了这一节的起始位置、节数据的大小、读写运行属性等。可以说节表就像书的目录一样,记录了书中文字属哪个章节。
    要新加数据在文件末尾,就得在原来的最后一个节表后再填加一个节表(因为节表都是连续存储的),幸亏一般在最后一个节表到数据区还有一些空隙,通常会大于40个字节(一个节表的大小)。新加的这个节表会记录文件最后附加的所谓的病毒代码的各种属性。另外还需要修改PE头信息里面的一些数据,比如SizeOfImage,SizeOfCode。这种方法修改完后文件大小会增加。
   这种方法详见罗云彬著的《Windows环境下32位汇编语言程序设计》第十七章AddCode源码。
   2. 利用相临两节之间的空隙空间插入病毒代码。
    每个节中的数据可能是随意长度的,但是在文件中存储的时候,都要按照一个值对齐,即存储的空间必定是这个值的整数倍。这是为了系统读取磁盘信息的时候可以整块整块的读取提高效率。这个值在PE头中可以找到,字段名称叫FileAllignment。比如代码节里面的代码长度是534个字节,而FileAllignment=400,则代码节在文件中存储就占800个字节。这样就有276个字节的空隙。
    第二种方法,就是遍历所有的节表,看每节在文件中存储的空隙是否够放下“病毒”的代码。如果够放,在把“病毒”的代码放在原来正常的数据后面。这样除了入口地址以外,其他根本PE头信息和节表信息几乎不用动一个字节就可以完成感染。
    这种方法的好处是,感染代码短小,文件大小可以保持不变(因为我们是利用原有数据的空隙)。
    上一篇《初探计算机病毒(2)--完成》就是用的这种方法。
    当然这种方法也有缺点,就是如果找不到一个节可以容纳“病毒代码”就无法感染了。当然还可以把“病毒”代码分成几份,分别放在不同节的数据空隙里。但对于非常小的文件,这种办法也是无能为力的。比如文件本身就几百字节,比你病毒的SIZE还小,当然也就无法用这种办法感染了。