病毒感染与VB程序的一个防病毒特性

VB程序防病毒特性与病毒感染

作者:付博  兰州理工大学国际贸易专业 QQ:1151639935 

今天,我在研究有关病毒感染PE可执行文件过程时,偶尔发现VB6.0编译器编译的程序有一个特点,那就是可以防止某些病毒的感染(注意只是可以防止一部分病毒的感染)。那么这究竟是怎么回事呢?且看如下分析:

我在学习了一些病毒感染PE文件的原理后,为了验证对其知识的掌握准确性,于是想尝试着去手工感染另一个PE程序。目标程序是一个我用VB6.0编写的小程序(名为test.exe)。我们知道,病毒通常有以下几种方式感染PE可执行程序:

1.在目标程序中新插入一个Section(节),并将病毒体写到这个Section中,并在最后以一个jmp指令跳转到原程序入口点,将控制权交给目标程序。这种方式的病毒无疑会增加原目标程序的体积,不便于病毒的隐身,但这种方式在实现上比较简单,而且比较通用。

2.寻找目标程序各Section的空隙,并将病毒体复制到这些空隙中(用jmp指令将各节的病毒代码连接起来)同样在最后用一条jmp指令将控制权交给目标程序。这种方式的特点是不会增加原目标程序的大小,但有一个局限,要求是病毒体代码体积足够小,目标程序Section的间隙要能够容纳得下病毒体。而且这种方式实现起来也要比前一种方式较为复杂。

    由于上述两种方式中,第2种方式其病毒体插入的实现要依赖于目标程序Section间隙的总大小,成攻具有一定的随机性,况且实现起来较为复杂。于是我先测试第一种方式:

步骤1.先在目标程序中插入一个新Section

步骤2.在新插入的Section中先直接以一条简单的jmp指令将控制权交给原目标程序,do nothing。好吧,先看第1步:

 

 

 上图是目标程序未插入新节时的状态,绕圈处就是原程序原有的三个节(.text  .data  .rsrc,现在来看插入新节后的状态:

 

     如上图,我插入的新的节,节名为".test"。现在先不管新代码的写入,先保存文件为test1.exe运行一下试试。Fuck,出现了如下错误提示:

 

     按理来说我只是新插入了一个节并且没有任何代码,程序正常运行应该没什么问题吧。好吧现在来分析一下可能出错的原因:

插入一个新节后,会在节表中多出一个节头。

假设1:问题出现在新节头这里,让我们来看看节头处,比较一下插入节前和插入节后的节头有什么不同:

 

上图是新插入的节.test的节头,下图的未插入新节前最后一个节.rsrc的节头。

 

这里我们看到一个奇怪的现象,未插入新节前的图中,最后一个节后面似乎有什么数据存在。按理来说最后一个节后就该为0的啊。于是我猜想,可能是新插入的节头覆盖了原有的数据,为了验证我的猜想,我在不插入新节的情况下将最后一节头.rsrc后面的数据置为0,然后运行一下程序,这步是测试最后一个节头.rsrc节头后的数据对程序有没有影响。

下图是将.rsrc节头后数据置0后的状态:

 

 

然后保存文件为test1.exe运行一下,fuck,出现如下图所示消息框:

 

好了,我可以现在肯定的是,最后一节.rsrc后的数据确实不能随便覆盖,难怪我插入一个新节后程序就运行不正常了。但是,即然由VB6编译器编写的程序最后一个节头后的数据不能覆盖,那么就不能靠插入一个新节来感染VB程序了吗?答案是“非也”。办法总是由人想出来的,我们现在来分析一下:覆盖数据后,程序就运行不起来,具体来说是程序根本没有加载成攻(由前面的错误消息框可以看出,程序是在初始化并加载dll时出现错误的),谈何运行呢?那么再分析一下,到低是什么地方的指令变态地用到了节头后的数据呢?我们现在要来找可能应用节头后数据处RVA地址的地方。由上图可看出,最后一个节头.rsrc后数据地扯是00000228H,我们现在在PE文件头的数据目录中找一下看看。很巧,在IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT目录处找了对地址00000228H的应用,如下图红圈中

 

看来是IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT这个绑定输入目录用到了最后一个节头.rsrc后的数据,简直是变态,一般情况下数据全都存放在数据节.data中,而我还没见过将数据放在节头位置的。

我们知道,绑定输入目录在确定dll加载位置的情况下用来定位Dll函数地址的,而当dll不能加载到预定的内存地址时就要由连接器重新填写IAT表了,这时绑定输入目录就变得无用了。这样说来,其实绑定输入目录是可以没有的,好吧,我们现在将绑定输入目录IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT置为0,表示不用绑定输入,然后新添加一个节再运行来看看。

 

这样一修改,我的程序test1.exe终于在插入了一个新节后运行成攻了。

现在我再在新插入的节中加入一条直接返回原程序入口点的jmp指令:

 

修改程序入口点为新节起始RVA,并在新节处插入jmp指令跳转到原入口处,如上图。保存文件为

Test1.exe然后运行,程序可正常运行,可是,嘿嘿,程序入口流程己被我改变了。

 

好了,现在总结一下:我发现,VB6编译器编写的程序,将IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT绑定输入目录数据放在紧跟PE文件最后一个节头后,这样,无论微软是有意还是无意,一些通过添加新节来感染程序的病毒感染VB程序后并不能正常运行。当然,病毒们又可以通过将绑定输入目录项置为0成攻加载。事实上,其他的编译器一般不会将绑定输入目录的数据部分放到节头后。这样说来,VB程序相对于其他程序还是有一定防病毒能力的。虽然这个防病毒能力不强,但我们今后是否可以通过将VB的这个特点进行扩展,使得PE可执行程序通过某种方式具有自防病毒的能力呢,这值进一步研究。

 

posted @ 2013-05-02 12:59  ShadowlessWalker  阅读(783)  评论(0编辑  收藏  举报