中原教育网教育互联信息集群系统,快速检索学校!. . 快速检索学校: 查找 高级检索
首页 | 资讯 | 教师 | 学生 | 家长 | 中小学 | 大学 | 青春话题 | 教育人物 | 学习社区 | 教育民生
高招 | 留学 | 人才 | 博客 | 考试 | 邮 件 | 读书 | 早教幼教 | 每周一校 | 联招中心 | 教育网址
中考 | 高考 | 自考 | 成考 | 外语 | 考研 | 司法类| 公务员 | 计算机 | 医卫类 | MBA |  MPA | 财会类 | 工程类 | 其它
 最新动态|计算机等级考试|软件水平考试|IT认证|考生心路|IT职场
当前所在位置:-考试-计算机-软件水平考试-辅导资料
大揭秘系统DLL技术助力木马静态变动态
http://www.henanedu.com/ 日期:2007-4-10 9:02:22
  很多朋友依然不知道近年兴起的“DLL木马”为何物。什么是“DLL木马”呢?它与一般的木马有什么不同?


  一、从DLL技术说起


  要了解DLL木马,就必须知道这个“DLL”是什么意思,所以,让我们追溯到几年前,DOS系统大行其道的日子里。在那时候,写程序是一件繁琐的事情,因为每个程序的代码都是独立的,有时候为了实现一个功能,就要为此写很多代码,后来随着编程技术发展,程序员们把很多常用的代码集合(通用代码)放进一个独立的文件里,并把这个文件称为“库”(Library),在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不必自己再去写一大堆代码,这个技术被称为“静态链接”(Static Link)。静态链接技术让劳累的程序员松了口气,一切似乎都很美好。可是事实证明,美好的事物不会存在太久,因为静态链接就像一个粗鲁的推销员,不管你想不想要宣传单,他都全部塞到你的手上来。写一个程序只想用到一个库文件包含的某个图形效果,就因为这个,你不得不把这个库文件携带的所有的图形效果都加入程序,留着它们当花瓶摆设,这倒没什么重要,可是这些花瓶却把道路都阻塞了――静态链接技术让最终的程序成了大块头,因为编译器把整个库文件也算进去了。


  时代在发展,静态链接技术由于天生的弊端,不能满足程序员的愿望,人们开始寻找一种更好的方法来解决代码重复的难题。后来,Windows系统出现了,时代的分水岭终于出现。Windows系统使用一种新的链接技术,这种被称为“动态链接”(Dynamic Link)的新技术同样也是使用库文件,微软称它们为“动态链接库”――Dynamic Link Library,DLL的名字就是这样来的。动态链接本身和静态链接没什么区别,也是把通用代码写进一些独立文件里,但是在编译方面,微软绕了个圈子,并没有采取把库文件加进程序的方法,而是把库文件做成已经编译好的程序文件,给它们开个交换数据的接口,程序员写程序的时候,一旦要使用某个库文件的一个功能函数,系统就把这个库文件调入内存,连接上这个程序占有的任务进程,然后执行程序要用的功能函数,并把结果返回给程序显示出来,在我们看来,就像是程序自己带有的功能一样。完成需要的功能后,这个DLL停止运行,整个调用过程结束。微软让这些库文件能被多个程序调用,实现了比较完美的共享,程序员无论要写什么程序,只要在代码里加入对相关DLL的调用声明就能使用它的全部功能。最重要的是,DLL绝对不会让你多拿一个花瓶,你要什么它就给你什么,你不要的东西它才不会给你。这样,写出来的程序就不能再携带一大堆垃圾了――绝对不会让你把吃剩的东西带回家,否则罚款,这是自助餐。


  DLL技术的诞生,使编写程序变成一件简单的事情,Windows为我们提供了几千个函数接口,足以满足大多数程序员的需要。而且,Windows系统自身就是由几千个DLL文件组成,这些DLL相互扶持,组成了强大的Windows系统。如果Windows使用静态链接技术,它的体积会有多大?我不敢想。


  二、应用程序接口API


  上面我们对DLL技术做了个大概分析,在里面我提到了“接口”,这又是什么呢?因为DLL不能像静态库文件那样塞进程序里,所以,如何让程序知道实现功能的代码和文件成了问题,微软就为DLL技术做了标准规范,让一个DLL文件像奶酪一样开了许多小洞,每个洞口都注明里面存放的功能的名字,程序只要根据标准规范找到相关洞口就可以取得它要的美味了,这个洞口就是“应用程序接口”(Application Programming Interface),每个DLL带的接口都不相同,尽最大可能的减少了代码的重复。用Steven的一句话:API就是一个工具箱,你根据需要取出螺丝刀、扳手,用完后再把它们放回原处。在Windows里,最基本的3个DLL文件是kernel32.dll、user32.dll、gdi32.dll。它们共同构成了基本的系统框架。


  三、DLL与木马


  DLL是编译好的代码,与一般程序没什么大差别,只是它不能独立运行,需要程序调用。那么,DLL与木马能扯上什么关系呢?如果你学过编程并且写过DLL,就会发现,其实DLL的代码和其他程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,DLL就变成一个独立的程序了。当然,DLL文件是没有程序逻辑的,这里并不是说DLL=EXE,不过,依然可以把DLL看做缺少了main入口的EXE,DLL带的各个功能函数可以看作一个程序的几个函数模块。DLL木马就是把一个实现了木马功能的代码,加上一些特殊代码写成DLL文件,导出相关的API,在别人看来,这只是一个普通的DLL,但是这个DLL却携带了完整的木马功能,这就是DLL木马的概念。也许有人会问,既然同样的代码就可以实现木马功能,那么直接做程序就可以,为什么还要多此一举写成DLL呢?这是为了隐藏,因为DLL运行时是直接挂在调用它的程序的进程里的,并不会另外产生进程,所以相对于传统EXE木马来说,它很难被查到。


  四、DLL的运行


  虽然DLL不能自己运行,可是Windows在加载DLL的时候,需要一个入口函数,就如同EXE的main一样,否则系统无法引用DLL。所以根据编写规范,Windows必须查找并执行DLL里的一个函数DllMain作为加载DLL的依据,这个函数不作为API导出,而是内部函数。DllMain函数使DLL得以保留在内存里,有的DLL里面没有DllMain函数,可是依然能使用,这是因为Windows在找不到DllMain的时候,会从其它运行库中找一个不做任何操作的缺省DllMain函数启动这个DLL使它能被载入,并不是说DLL可以放弃DllMain函数。
 

  五、DLL木马技术分析


  到了这里,您也许会想,既然DLL木马有那么多好处,以后写木马都采用DLL方式不就好了吗?话虽然是这么说没错,但是DLL木马并不是一些人想象的那么容易写的。要写一个能用的DLL木马,你需要了解更多知识。


  1. 木马的主体


  千万别把木马模块写得真的像个API库一样,这不是开发WINAPI。DLL木马可以导出几个辅助函数,但是必须有一个过程负责主要执行代码,否则这个DLL只能是一堆零碎API函数,别提工作了。


  如果涉及一些通用代码,可以在DLL里写一些内部函数,供自己的代码使用,而不是把所有代码都开放成接口,这样它自己本身都难调用了,更不可能发挥作用。


  DLL木马的标准执行入口为DllMain,所以必须在DllMain里写好DLL木马运行的代码,或者指向DLL木马的执行模块。


  2. 动态嵌入技术


  Windows中,每个进程都有自己的私有内存空间,别的进程是不允许对这个私人领地进行操作的,但是,实际上我们仍然可以利用种种方法进入并操作进程的私有内存,这就是动态嵌入,它是将自己的代码嵌入正在运行的进程中的技术。动态嵌入有很多种,最常见的是钩子、API以及远程线程技术,现在的大多数DLL木马都采用远程线程技术把自己挂在一个正常系统进程中。其实动态嵌入并不少见,罗技的MouseWare驱动就挂着每一个系统进程。


  远程线程技术就是通过在另一个进程中创建远程线程(RemoteThread)的方法进入那个进程的内存地址空间。在DLL木马的范畴里,这个技术也叫做“注入”,当载体在那个被注入的进程里创建了远程线程并命令它加载DLL时,木马就挂上去执行了,没有新进程产生,要想让木马停止惟有让挂接这个木马DLL的进程退出运行。但是,很多时候我们只能束手无策――它和Explorer.exe挂在一起了,你确定要关闭Windows吗?


  3. 木马的启动


  有人也许会迫不及待的说,直接把这个DLL加入系统启动项目不就可以了。答案是NO,前面说过,DLL不能独立运行,所以无法在启动项目里直接启动它。要想让木马跑起来,就需要一个EXE使用动态嵌入技术让DLL搭上其他正常进程的车,让被嵌入的进程调用这个DLL的DllMain函数,激发木马运行,最后启动木马的EXE结束运行,木马启动完毕。


  启动DLL木马的EXE是个重要角色,它被称为Loader,如果没有Loader,DLL木马就是破烂一堆,因此,一个算得上成熟的DLL木马会想办法保护它的Loader不会那么容易被毁灭。记得狼狈为奸的故事吗?DLL木马就是爬在狼Loader上的狈。


  Loader可以是多种多样的,Windows的rundll32.exe也被一些DLL木马用来做了Loader,这种木马一般不带动态嵌入技术,它直接挂着rundll32进程运行,用rundll32的方法(rundll32.exe [DLL名],[函数] [参数])像调用API一样去引用这个DLL的启动函数激发木马模块开始执行,即使你杀了rundll32,木马本体还是在的,一个最常见的例子就是3721中文实名,虽然它不是木马。


  注册表的AppInit_DLLs键也被一些木马用来启动自己,如求职信病毒。利用注册表启动,就是让系统执行DllMain来达到启动木马的目的。因为它是kernel调入的,对这个DLL的稳定性有很大要求,稍有错误就会导致系统崩溃,所以很少看到这种木马。


  有一些更复杂点的DLL木马通过svchost.exe启动,这种DLL木马必须写成NT-Service,入口函数是ServiceMain,但是这种木马的隐蔽性也不错,而且Loader有保障。


  4. 其它


  到这里大家也应该对DLL木马有个了解了,是不是很想写一个?别急,由于DLL木马挂着系统进程运行,如果它本身写得不好,例如没有防止运行错误的代码或者没有严格规范用户的输入,DLL就会出错崩溃。别紧张,一般的EXE也是这样完蛋的,但是DLL崩溃会导致它挂着的程序跟着遭殃,别忘记它挂接的是系统进程哦,结局就是……惨不忍睹。所以写一个能公布的DLL木马,在排错检查方面做的工作要比一般的EXE木马多……


  六、DLL木马的发现和查杀


  经常看看启动项有没有多出莫名其妙的项目,这是Loader的所在,只要杀了狼,狈就不能再狂了。而DLL木马本体比较难发现,需要你有一定编程知识和分析能力,在Loader里查找DLL名称,或者从进程里看多挂接了什么陌生的DLL,可是对新手来说……总之就是比较难啊比较难,所以,最简单的方法:杀毒软件和防火墙。
 
  目前两项最热门的技术就是网格计算和 Web 服务,但是这两者是兼容的吗?在本文中,Martin C. Brown 告诉我们这两个系统实际上兼容程度是相当高的,并描述了在网格应用程序中使用 Web 服务的好处。为了确定网格计算和 Web 服务是否相互兼容,我们需要研究一下网格计算的工作方式,看看我们是否真的可以将一个典型的网格系统分解成若干个相对分散的单元。网格计算的架构依赖于相当基本的原理,即在多台客户机和多台服务器之间传送简单的请求。 Web 服务依赖于处理从一台客户机发送到一台服务器上的请求。

  如果您尚未看到这一点是如何适应已有的网格结构的,本文将探讨两种最常见的网格系统:请求架构和分发架构。请求系统依赖于客户机请求工作,而分发系统依赖于代理直接给客户机提供工作。这两种系统在与 Web 服务结合的时候面对的是不同的问题,这一点我们也会讨论到。

  网格通信

  在网格计算中,基本存在两种主要的组件类型 —— 服务器和客户机。服务器用于分发工作请求及保存有关构成整个工作的独立工作单元的信息。客户机(典型情况下有多个)负责处理独立的工作单元。这两者之间的通信方式有多种,但是系统的核心是对工作的分发。再次指出,系统采用两种工作方式中的一种,要么是客户机管理自己的工作流,并向服务器请求新的工作单元,要么是服务器将工作单元分发给客户机。

  通信过程并不是到这里就停止了;通常还需要额外的服务器和服务来支持网格服务器的基础设施,它们相互之间需要进行对话,并交换信息。关键的问题在于,通常情况下网格解决方案中交换的是相当分散的信息片断。在客户机和服务器之间交换的是原始的工作单元和处理之后的响应。甚至在数据负载相当高的情况之下,如进行数据处理或视频呈现时,我们依然在交换信息包,而不是在客户机和服务器元素之间建立完全、双向、永久的通信。

  新版的 WebSphere 扩展包中的网格思想更为激进,甚至允许将到 WebSphere 应用程序的 Web 请求通过 WebSphere 服务器进行分发。这个例子也证明了网格管理与实际的工作分发都可以通过相当简单的数据交换来完成。

  规则中当然总有例外。并不是所有的网格系统都依赖于如此直接的简单包交换。比如说,资源网格通常依赖于网格提供者(客户机)之间相当繁重的相互通信,这样才能在网格上实现实时的存储请求。不过在这些情况下,即便当客户机之间直接进行通信时,依然是一种基本的信息交换。因此,如果我们仅仅在交换信息,当然就应该用一种标准的方法在服务器和客户机之间进行通信。这也就是 Web 服务的用武之地。

  Web 服务概览

  在我们能够理解 Web 服务如何为我们的网格解决方案提供支柱之前,我们需要理解 Web 服务的工作方式。最简单的方法是将其想像成一种远程过程调用(RPC),通过这种方式我们可以从一台计算机(客户机)上调用某个功能,而代码和实际的功能是在另外一台计算机(服务器)上执行的。

  各种各样的 RPC 中不存在新东西。一段时间以来,各种不同的平台上都有不同的实现。也许最有名的 RPC 实现是 UNIX 机上的。这一实现使用了一组复杂的函数,可以使客户机与服务器之间进行信息交换,它将一种基本的 C 结构转换成一种可以在网络上广播的标准化格式,即外部数据表示(External Data Representation, XDR)格式。这种方法对数据进行了序列化和标准化的处理,转换后的数据格式可以被该 RPC 架构下的任何客户机或服务器解码出来。

  最近 Web 的爆炸式发展意味着,每当我们访问某个 Web 站点的时候,我们很自然就是在进行远程过程调用。我们的客户机就是浏览器,它向一台服务器(如 Apache, IIS 等)请求一个文件,然后,处理并显示得到的信息。这是一个简单的数据交换过程。有了公共网关接口(Common Gateway Interface, CGI)、JSP、ASP 这样的动态技术,我们才真正是在调用远程过程。交换过程是以 HTTP 请求和 HTML 响应的形式进行的,但是达到的效果一样:我们调用远程机器上的过程,然后获得一个响应。

  通过以某种方式标准化信息的交换过程,我们就得到了 Web 服务。请求和响应都以 XML 编码。从基本相同的技术派生出两个变种:XML-RPC 的设计目标与它的缩写名所暗示的完全一样 —— 发送和接收用 XML 格式化的远程过程调用;简单对象访问协议(Simple Object Access Protocol, SOAP)更加高级。SOAP 的核心依然是一种 RPC 技术,但是这种技术经过增强,可以实现对一个对象的远程操纵。这样 SOAP 就不是一种简单的 RPC 调用,而是可以创建对象、操纵对象、并用这个对象在服务器和客户机之间进行更加确切和格式化的信息交换。

  Web 服务可以由任何一种 Web 服务器提供,可以在几乎所有的支持平台上用几乎所有的语言书写,其中包括 Perl、Python、C/C++、Java 语言以及 Visual Basic。Web 服务的核心基本上是 Web 服务器上的一个动态组件,它能够正确地处理 Web 服务请求和响应。这意味着,在很多情况下,您可以很容易在您的已有系统中创建一个 Web 服务的接口。您需要做的只是在通常进行的常规系统调用外围编写一个包装器。

  网格与 Web 服务之间的界限逐渐模糊

  到目前为止,我们已经探讨了通过交换信息而实现的网格技术,这种交换既可以在服务器和客户机之间进行,也可以直接在客户机之间进行,从而实现对信息的处理和分发。但是这种交换系统需要借用某种方式进行真正的信息交换。这些年来,人们使用了很多种系统,包括 FTP 协议和定制的协议系统。

  目前,在 Web 服务阵营之中,我们已经拥有了一种通用的工具,可以用来在两台机器之间交换信息,比如说请求执行某项特定的功能(如 getnewworkunit()),或是简单地在这两者之间交换信息。因为 Web 服务是建立在 XML 等其他标准之上的,因此很容易开发并扩展到各种不同环境中,并且也容易部署。我们摆脱了不同系统间数据交换的所有问题,并且不需要担心处理器字节中的位次序(endian-ness),也不需要将我们传递的信息转换成中性格式,因为 Web 服务的标准已经替我们做了这些事情。

  因为我们需要用某种类型的侦听程序/分发服务来处理请求、分发工作以及收集结果,所以 Web 服务就是最理想的选择。Web 服务系统带来的主要益处在于,因为它依赖于 HTTP 协议,因此很容易将 Web 服务集成到已有的 HTTP 平台、路由器、防火墙以及其他系统中。大多数组织已经运行了 HTTP 服务,因此您可以用已有的技术和安全系统来支持您的网格系统,而不需要对网络进行改造,也不会对网格系统中的设备造成限制。

  这样,用 Web 服务开发网格系统就具有了一些无可比拟的优势,其中包括:
    ·增强的兼容性。
    ·增强的灵活性。
    ·通过消除数据交换的复杂性,使跨平台开发成为可能。
    ·很容易部署在已有的 Web 服务器上。
    ·很容易通过已有的 HTTP 安全机制与防火墙的支持来提供安全性。
    ·通过 Intranet 或 Internet 访问网格组件的难度降低,这样就使得通信变得容易,可访问性增强。

  出于所有上面这些理由,以及更多的原因,Web 服务已经逐渐成为新的网格服务标准 —— 开放网格服务架构(Open Grid Services Architecture, OGSA)以及与之相伴的开放网格服务基础设施(Open Grid Services Infrastructure, OGSI)—— 的一个组成部分。Globus Toolkit 3.0 是第一个完全支持 OGSA/OGSI 标准的网格平台,它支持将 Web 服务作为数据交换的平台。IBM 作为 OGSA 标准和 Globus 系统的关键参与者,给 Web 服务提供了强有力的支持,现在正推荐人们在业务开发平台中广泛使用 Web 服务。Globus 支持 SOAP Web 服务协议。

来源:考试大
作者:
责任编辑:chenlin
    本网注明:“来源:XXX”(非中原教育网)的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其具有的真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行。
字体 】 【打印】 【关闭】 【发送给好友
姓名: Email:
评论:
  • 文章评论
以下网友留言只代表其个人观点,不代表本站的观点或立场
  • 该篇没有评论信息
相关新闻信息

 

关于我们 | 联系方式 | 友情链接 | 招聘精英 | 本网法律顾问
河南教育网版权所有 河南创新教育产业发展有限公司 制作维护
电话:0371-66238380 66230820 传真:0371-66285389 电子邮件hnedu@henanedu.com info@henanedu.com
本公司保留所有权力 法律顾问:天坤律师事务所陈海州律师