如果是位经常玩“马马”的朋友,那么一般情况下都会或多或少掌握一些木马的特性,然而,很多朋
友还是不知道“DLL 木马”是什么东东。那到底什么是“DLL 木马”呢?它与一般的木马又有什么不
同?带着这些疑问,一起开始这次揭密之旅吧!
一、追根溯源从 DLL 说起
要了解什么是“DLL 木马”,就必须知道“DLL”是什么意思!说起 DLL,就不能不涉及到久远
的 DOS 时代。在 DOS 大行其道的时代,写程序是一件繁琐的事情,因为每个程序的代码都是需要
独立的,这时为了实现一个普通的功能,甚至都要为此编写很多代码。后来随着编程技术发展与进步,
程序员们开始把很多常用的代码集合(也就是通用代码)放进一个独立的文件里,并把这个文件称为
“库”(Library)。在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不
必自己再去写一大堆代码,这个技术被称为“静态链接”(Static Link)。静态链接技术让劳累的程序
员松了口气,一切似乎都很美好。然而静态链接技术的最大缺陷就是极度消耗和浪费资源,当一个程
序只想用到一个库文件包含的某个图形效果时,系统将把这个库文件携带的所有的图形效果都加入程
序,这样就使得程序非常臃肿。虽然这并不重要,可是这些臃肿的程序却把道路都阻塞了——静态链
接技术让最终的程序成了大块头,因为编译器把整个库文件都加载进去了。
技术永远是在发展的,静态链接技术由于无法避免的弊端,不能满足程序员和编程的需要,人们
开始寻找一种更好的方法来解决代码重复的难题。随着 Windows 系统的出现, Windows 系统使用
一种被称为“动态链接库”(Dynamic Link Library)的新技术,它同样也是使用库文件,DLL 的名字
就是这样来的。动态链接本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在
编译方面,微软把库文件做成已经编译好的程序文件,给它们开发一个交换数据的接口。程序员编写
程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程
序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来。完成需要的功能
后,这个 DLL 停止运行,整个调用过程结束。微软让这些库文件能被多个程序调用,实现了比较完
美的共享,程序员无论要写什么程序,只要在代码里加入对相关 DLL 的调用声明就能使用它的全部
功能。这样,写出来的程序就不能再携带一大堆无用的垃圾了。
DLL 技术的诞生,使编写程序变成一件简单的事情,Windows 为我们提供了几千个函数接口,
足以满足大多数程序员的需要。而且,Windows 系统自身就是由几千个 DLL 文件组成,这些 DLL 相
互扶持,组成了庞大的 Windows 系统。如果 Windows 依然使用静态链接技术,那将是不可想象的。
二、什么是 API
在前面提到的“接口”又是什么呢?因为 DLL 不能像静态库文件那样塞进程序里,如何让程序
知道实现功能的代码和文件成了问题,微软就为 DLL 技术做了标准规范,为每个 DLL 文件都明确地
标注好它的功能名称,程序只要根据标准规范找到相关的名称进行调用就行了,这就是 API
(Application Programming Interface)应用程序接口,每个 DLL 带的接口都不尽相同,最大限度地
减少了程序代码的重复。在Windows 里,最基本的 3个 DLL文件是kernel32.dll、user32.dll、gdi32.dll。
它们共同构成了基本的系统框架。
三、DLL 与木马
DLL 是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。那么,
DLL 与木马能扯上什么关系呢?如果你学过编程并且写过 DLL,就会发现,其实 DLL 的代码和其他
程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,DLL 就变成一个独立的
程序了。
当然,DLL 文件是没有程序逻辑的,其实 DLL 并不等于 EXE。不过,依然可以把 DLL 看做缺少
了 main 入口的程序,DLL 带的各个功能函数可以看作一个程序的几个函数模块。DLL 木马就是把一
个实现了木马功能的代码,加上一些特殊代码写成 DLL 文件,导出相关的 API,在别人看来,这只是
一个普通的 DLL,但是这个 DLL 却携带了完整的木马功能,这就是 DLL 木马的概念。也许有人会问,