

图:作为系统核心之一的user32.dll,正因为是dll文件,它能结合到每个程序进程,提供必要的系统支持
所以我们就知道,以dll格式存在的病毒无法直接运行,他们需要另一个如exe的程序事先加载后才能工作(有3种可供参考的方式,一是另一个exe程序也是病毒体,它直接加载dll文件作为自身一部分,第二种方式采用系统自带的rundll32.exe加载,第三种是比较讨厌的情况,dll文件开始又另一个exe文件主动加载后,利用被称为钩子hook技术将dll注入到其他的程序进程中。这用的病毒是最难清除的)。

图:在任务管理器中看到的rundll32.exe的进程实际起作用是加载了的dll文件
如果病毒主体以dll文件存在以后,他必须指明加载它的程序,这可能给其传播造成一定障碍,但有带来了很多优势。比如:
1.由于windows自带的进程管理器(WindowNT)只能以主进程文件为单位察看进程,可以认为是只能看到正在运行的exe文件,而一般看不到正在执行的dll文件(因为dll是exe加载的,它映射到了exe为进程的地址空间了)。所以一般在没有第3放工具的情况下,是无法通过任务管理器找到正在运行的dll文件病毒的。
2.无法直接将正在运行的dll文件病毒关闭,这样说是因为dll文件都映射到了加载它的exe文件中了,利用进程管理器只能将它属于的进程程序一起关闭。比如word因中毒而加载了virus.dll病毒的文件体,那么想从内存中清除病毒只能把word也关闭了
3.利用上面的特点,可以做到病毒体永远驻留内存而无法清除。其实方法很简单,利用钩子技术,将dll注入到系统所有的进程中,同时这些dll监控着每个进程是否被自己注入,如果没有则重新注入。这样除非关闭所有程序,否则永远无法关闭运行中的病毒。

图:采用PEid自带的任务察看器,可以发现实际上所有进程都加载了其他的dll文件。而且无法把其中莫一个dll关闭
当然还有更极端的情况,那就是利用驱动程序来编写病毒(几乎没有这种情况,所以你可以跳过)。
首先这里说一下x86保护模式的事情。你应该知道目前你正在运行windows的CPU工作在成为32位保护模式的环境下。你不用被这个神秘的名词吓倒,他其实就是一种等级管理机制:程序在运行时有ring0和ring3的2种权限,ring0程序拥有很高的权利,它能操作计算机所有的硬件设备,而ring3程序则十分可怜,他只能乖乖受ring0程序管理,同时基本上无法直接对硬件进行操作,而必须通过ring0的程序中转。
这就是windows中各类程序的现状:操作系统的内核、一些服务程序、驱动程序都是ring0级别的,他们能对你的电脑做任何能做的事情,而一般意义上的程序,如exe文件的程序都是ring3的。
这样做一方面是为了实现多任务环境,同时更重要的是能使系统运行的非常稳定:ring3程序无法直接控制硬件,必须通过ring0程序,这样如果有个设计有缺陷或者不怀好意的程序企图进行破坏性操作时,他就能被ring0程序截获并强行中止。
所以可以知道,如果病毒写成了一个驱动程序(ring0级别),那是很危险的,最好的例子就是CIH!
这类病毒的名字往往以wdm和drv为主(后者是win9x的标准,在最新的windows内核中以被淘汰)。不果他们和dll文件一样,无法自我加载。
上面以程序文件的角度分析了几类病毒格式的工作方式,当然大家不用被提到的极端例子吓怕了。下回将告诉你这些病毒是如何感染并永久的在系统中存活下去的
CSK版权所有,演讲ppt在ftp.csksoft.net中下载。