查看原文
其他

简单病毒浅析

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587



微信公众号:计算机与网络安全

ID:Computer-network

编写病毒不是一件光彩的事情,而且随时都有让自己惹上官司的可能。我们介绍一个简单的病毒的编写只是为了进行研究,以便编出更好的防范工具。


一、病毒的感染


大部分病毒都有感染的功能,病毒会把自身当中的或者需要其他程序来完成的指定功能的代码感染给其他的正常的文件。就像人类的流行感冒,办公室中只要有一个人携带感冒病毒,就有可能所有人都会被传染。如果没被传染说明已经预防过了,因此在机器上安装杀毒软件还是非常有必要的。


病毒要感染其他文件也就是把病毒本身的攻击代码或者病毒期望其他程序要完成的功能代码写入到其他程序当中,而想要对其他程序写入代码就必须要有写入代码的空间。除了把代码写入到其他程序中以外,还必须让这些代码有机会被执行到。就上面两个问题而言都是比较容易解决的,下面分别来讨论一下。


病毒要对其他程序写入代码,必须确定目标程序有足够的空间让它把代码写入。通常情况下有两种比较容易实现的方法,第一种是添加一个节区,添加一个节区后就有足够的空间让病毒来写入了。第二种方法是缝隙查找,然后写入代码。在每个节与节之间,必然有没有使用到的空间,这个空间就叫缝隙。只要确定要写入代码的长度,然后根据这个长度来查找是否有满足该长度的缝隙就可以了。下面介绍第二种方法。


二、缝隙搜索的实现


通常情况下,每个节之间都是有未使用的空间的,搜索这些未使用的空间来把我们的代码写入到这个位置。由于只是一个测试代码,因此不会写具有攻击性的代码,我们写入目标程序的代码的功能是什么都不做,就是汇编中的“NOP”指令,其机器指令是0x90。简单地写入11个0x90就可以了。定义如下:

搜索缝隙的代码如下:

在代码节和紧挨代码节之后的节的中间搜索缝隙,搜索的方向是从代码节的末尾开始,反方向的搜索速度要快一些。通过该代码可以找到缝隙,但是也可能找不到缝隙,因此在调用完该函数后要做一些判断,以应变各种不同的情况。

三、感染目标程序文件


我们把代码添加到了目标文件中,但是这些代码如何才能被执行到呢,这就要修改目标可执行文件的入口地址。修改目标入口地址先来执行我们的代码,然后再跳转到原来程序的入口处继续执行,很多病毒都是这样工作的。修改一下机器码,定义如下:

把机器码的后几个字节改为一条mov指令和一条jmp指令,这个过程和inline hook有些类似。我们写一个程序,来调用上面的函数,并且将机器码写入到目标程序中,具体代码如下:

编译连接后,找个以前写的VC程序,将其改名为“hello.exe”,并放到同一个目录下,然后运行这个感染程序。用OD打开“hello.exe”程序看一下,如图1所示。

图1  被感染后的目标程序入口

从图1中可以看出,感染是成功的,而且jmp eax指令中的eax保存的是“hello.exe”的入口地址。运行被感染的目标程序,是可以运行的。再次对其进行一次感染,然后用OD打开看一下目标程序“hello.exe”,如图2所示。

图2  被二次感染的目标程序入口

可以看到目标程序被二次感染了。由于只是添加了一些简单的跳转指令,因此没有太大影响,但是如果是真正的病毒,很有可能导致被感染的目标程序无法正常运行。因此,需要对被感染过的文件写一个标志,这样就可以避免被二次感染了。

四、添加感染标志


为了避免重复感染目标程序,必须对目标程序写入感染标志以防被二次感染,导致目标程序无法执行。每次在对程序进行感染时都要先判断是否有感染标志,如果有感染标志则不进行感染,如果没有感染标志则进行感染。在PE文件结构中有非常多不实用的字段,可以找一个合适的位置写入感染标志。想必这个非常容易理解,下面直接看代码。写入感染标志的代码如下:

读取的感染标志的代码类似,代码如下:

每次在进行感染前先调用CheckSig()函数,判断是否有感染标志,然后根据是否被感染做出不同的选择,调用以上两个函数的方法如下:

在代码中我们把感染标志写到了 IMAGE_DOS_HEADER中的e_cblp这个位置处。IMAGE_DOS_HEADER中除了e_magic和e_lfanew这两个字段外,其余都是没有用的,大家可以放心写入。代码中的offsetof()是一个宏,该宏的定义如下:

该宏的作用是取得某字段在结构体中的偏移。对于IMAGE_DOS_HEADER结构体中的e_cblp来说,它在结构体中的偏移是2。那么offsetof(IMAGE_DOS_HEADER, e_cblp)返回的值则为2,大家可以调试跟踪一下。


五、自删除功能的实现


某些程序在首次运行以后就莫名其妙地消失。当人们意识到这是病毒木马时已经晚了,悔恨自己没装杀毒软件。其实病毒木马被执行后都把自己复制到系统盘里了,改个看起来很重要的文件名,并且把自己隐藏得很深。


下面介绍一下它是如何自删除的。自删除的方法有很多,最简单的方法就是创建一个“.cmd”的批处理文件。批处理文件中通过DOS命令del来删除可执行文件,再通过del删除自身。我们来看一下它的实现代码:

直接在main()函数中调用CreateBat()函数,编译连接并运行它。可以看到,编译好的程序消失了。其实,是创建的批处理文件将编译好的程序和批处理本身都删除掉了。这样就达到了自删除的功能了。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存