有一种木马和DLL文件息息相关,被很多人称之为“DLL木马”,那么这种木马的特殊性在哪里?它和DLL文件到底有什么关系?它采用了什么技术使得自己难以被用户察觉?我们又该如何查杀和清除这种木马?这些都是在本文中要谈到的话题。
要了解DLL木马,就必须知道这个“DLL”是什么意思。DOS时代,写程序是一件繁琐的事情,因为每个程序的代码都是独立的,程序员们把很多常用的代码集合放进一个独立的文件里,并把这个文件称为“库”(Library),在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不必自己再去写一大堆代码,这个技术被称为“静态链接”(Static Link)。后来,Windows系统出现了,它使用了一种新的被称为“动态链接”(Dynamic Link)的技术――Dynamic Link Library,DLL的名字就是这样来的。DLL技术的诞生,使编写程序变成一件简单的事情,Windows为我们提供了几千个函数接口,足以满足大多数程序员的需要。
说穿了,DLL文件也是可执行文件的一种,只是它不能自己运行。Windows在加载DLL的时候,需要一个入口函数,就如同可执行程序的main函数一样。
DLL与木马
那么,DLL与木马能扯上什么关系呢?你可能知道木马和病毒一样,也是程序的一种,但是DLL文件呢?DLL木马就是把一个实现了木马功能的代码加上一些特殊代码写成DLL文件,并导出相关的API。在用户看来,这只是一个普通的DLL,但是这个DLL却携带了完整的木马功能,这就是DLL木马的概念。也许有人会问,既然同样的代码就可以实现木马功能,那么直接写成可执行不就行了,为什么还要多此一举写成DLL呢?这是为了隐藏,因为DLL文件运行时直接挂在调用它的程序进程中,不会另外产生进程,所以相对于传统EXE木马来说,它很难被查到。
DLL木马技术分析及实现
到了这里,你也许会想:既然DLL木马有这么多好处,为什么现在的EXE木马还是比DLL木马要多呢?为什么不直接采用更高明的DLL方式实现木马呢?这主要在于:如果要实现同样的功能,DLL木马的编写难度要比EXE木马大很多。我们一起来看看DLL木马的主要技术。
Windows系统中,每个进程都有自己的私有内存空间,理论上别的进程是不允许对这个私人领地进行操作的。但是,实际上我们仍然可以利用种种方法进入并操作进程的私有内存,这就是所谓的“动态嵌入”技术,它是将自己的代码嵌入正在运行的进程中的技术。动态嵌入的实现方法有很多种,最常见的是“钩子”、API函数以及“远程线程”技术,现在的大多数DLL木马都采用“远程线程”技术把自己挂在一个正常系统进程中。
至于DLL木马的启动,有人也许会迫不及待地说,直接把这个DLL加入系统启动项目不就可以了?答案是不行,前面说过,DLL不能独立运行,所以要想让木马跑起来,就需要一个EXE使用动态嵌入技术让DLL搭上其他正常进程的车,让被嵌入的进程调用这个DLL的DllMain函数,激发木马运行,最后启动木马的EXE结束运行,木马启动完毕。
启动DLL木马的EXE是个重要角色,它被称为Loader,如果没有Loader,DLL木马就是破烂一堆,因此,一个成熟的DLL木马会想办法保护它的Loader不那么容易被毁灭。
Loader可以是多种多样的,Windows的rundll32.exe也被一些DLL木马用来做了Loader,这种木马一般不带动态嵌入技术,它直接挂着rundll32进程运行,即使你杀了rundll32进程,木马本体还是在的。利用这种方法除了可以用来启动木马之外,不少应用程序也采用了这种启动方式,一个最常见的例子是“3721中文实名”。
注册表的AppInit_DLLs键也被一些木马用来启动自己,如求职信病毒。利用注册表启动,就是让系统执行DllMain来达到启动木马的目的。有一些更复杂的DLL木马会通过svchost.exe启动,这种DLL木马必须写成NT-Service,入口函数是ServiceMain,这种木马比较少见,但是其隐蔽性很高,而且Loader有保障。
DLL木马的发现和查杀
DLL木马的查杀比一般病毒和木马的查杀要更加困难,建议用户经常看看系统的启动项中有没有多出莫名其妙的项目,这是DLL木马Loader可能存在的场所之一。如果用户有一定的编程知识和分析能力,还可以在Loader里查找DLL名称,或者从进程里看多挂接了什么陌生的DLL。对普通用户来说,最简单有效的方法还是用杀毒软件和防火墙来保护自己的计算机安全。