从流氓软件说说DLL动态插入技术与Rootkit技术

来源:百度文库 编辑:神马文学网 时间:2024/04/30 16:45:02
流氓软件,Rootkit,DLL,动态,技术
第一篇
从技术角度解析流氓软件
作者:不详 文章来源:华盟收集 点击数: 144 更新时间:2007-8-13 1:21:14
早期,流氓软件在没有被正式定性为恶意程序时,流氓软件使用的技术比较简单,往往是修改主页,使用户只要一登陆浏览器,就自动跳转到流氓软件提供的广告网址,或者安装到系统中后,私下收集用户的信息发送出去。而后来,随着利益的驱动和流氓软件正式作为恶意程序被反病毒厂商绞杀,流氓软件采用的技术也越来越先进,如今已经形成了与杀毒软件对抗的态势,魔道之争真正进入白热化。
了解了它们使用的技术,会对它们有一个更加清晰的认识,以下便是流氓软件使用的经典技术。
秘密潜入-流氓软件的隐藏技术
隐藏是流氓软件的天性,也是病毒的一个特征,任何流氓软件都希望在用户的电脑中隐藏起来不被发现,由于隐藏的目的,衍生出隐藏的技术。
首先是隐藏窗口。我们知道,在Windows操作系统下,所有的程序执行时都是以窗口的形式出现的,每个窗口都有不同的属性,流氓软件的目的就是不想为人所知,因此它们在运行的过程会将自己的程序窗口的属性设为“不可见”,这样用户就看不到程序的窗口了。
但是,我们知道,每个程序运行时虽然用户看到的是窗口,但是对于系统来说,其实是执行了一个进程,对于稍微专业的用户来说,虽然窗口不能看见,但是程序产生的进程却是很容易通过系统的任务管理器看到,从而使流氓软件暴露。因此便出现了隐藏进程技术。
隐藏进程其实是调用了微软的一个未公开函数,将流氓软件本身注册为服务,这样系统的任务管理器就无法显示这类程序的进程了,从而达到了隐藏自己的目的。
对于一些细心的用户来说,电脑出现了新的文件会引起他们的怀疑,因此流氓软件作者又采用了隐藏文件技术。它们在安装时会将自身拷贝到系统目录,然后将文件的属性设置为隐藏,这样,用户如果采用的是默认系统设置,则就无法看到他们。
但是,这些都是初级的隐藏技术,对电脑熟悉的用户,只要利用系统提供的工具就可以找到这些流氓软件的蛛丝马迹,或者安装一个防火墙软件,只要有程序访问网络,立刻就会报警,从而能够暴露流氓软件的行踪。
我中有你-流氓软件的线程插入技术
为了更好地隐藏自己,流氓软件开始大量采用线程插入技术。
上面讲到,一个程序进入系统中,会首先产生文件,该文件运行时,会产生窗口,在内存中产生进程。进程说白了就是一个被激活了的程序文件。而进程又会产生许多线程。
线程是Windows系统为程序提供的并行处理机制,它允许一个程序在同一时间建立不同的线程,完成不同的操作。另外,由于Windows操作系统为了提高软件的复用性,减少重复开发的开销,采用了动态链接库机制,即将一些公用的程序放在DLL文件中,程序不用包括这些代码,只要在运行时对这些DLL文件直接进行调用就可以完成各种功能,因此每一个可执行程序除了自身的程序体外,还包括许多外部的模块。如果我们用一些内存查看工具的话,能看到每一个应用程序都包含了大量的DLL动态链接库文件。
而流氓软件正是利用了这一点。他们的可执行程序并不是EXE形式的,而是DLL形式,这类文件一般是存在于系统中,由可执行程序进行调用。
而流氓则是将DLL文件载入内存,然后通过“线程插入”的方式,插入到某个进程的地址空间。一般地,如果流氓软件想控制浏览器,则它们往往会将自己注入到浏览器(explorer.exe)的进程空间,只要浏览器运行,就会自动调用该流氓软件。
由于浏览器程序本身会调用大量的DLL文件,因此即使用户用第三方进程查看工具,也分辨不清哪个DLL是流氓软件。面且,采用线程注入技术的流氓软件由于已经并入了正常程序的内存空间,即使是防火墙程序也不会拦截,从而可以在用户电脑自由出入。
销声匿迹-流氓软件的RootKit技术
线程插入对于普通用户来说,或者对于用户的手工清除来说,是很难处理的, 但是这些招数对于杀毒软件来说,是非常简单的,为了能够躲避杀毒软件的追杀,流氓软件的研制者又引入了RootKit技术。
本来RootKit是LINUX的概念,指能够以透明的方式隐藏于系统,并获得LINUX系统最高权限的一组程序集。而后来被病毒制作者借鉴,病毒的RootKit技术指的是那些能够绕过操作系统的API调用,直接利用更底层的调用,然后接管系统的高级API调用,当有程序试图查找它们时,便返回假信息,从而得以隐藏自己的技术。由于目前的杀毒软件都是直接调用系统API来进行病毒扫描的,因此采用这种技术的病毒,都能够轻松躲避杀毒软件的追杀,因为如此,所以目前的流氓软件开始越来越多地采用这种方式来保护自己。
不过,杀毒软件也开始绕过API调用,通过更加底层的应用,来对抗这种技术。
借尸还魂-流氓软件的碎片技术
流氓软件之所以要流氓,那是因为巨大的利益,而为了巨大的利益,流氓就变得更流氓。目前流氓软件大多数还会采用一项流行的技术,那就是碎片技术。这种技术的思想其实很简单,就是在进入用户系统时,就产生多个或相同,或不同的碎片文件,这些文件除了分布在系统目录、一些盘符的根目录下,它们还会隐藏在其它软件的目录、临时文件夹、甚至回收站里。
这些文件之间互相保护,一旦一个文件被删除了,另一些碎片就会重新将这个文件恢复。只要系统中存在有这样的碎片文件,这些碎片文件只要有一个能够激活,在用户连接网络的时候,就能够连通网络进行升级,从而重新还原成一个完整的流氓软件体系,而且一旦升级,这些新升级的流氓软件还会将这些碎片文件删除,然后产生新的碎片文件,从而能够在一定程度上躲过了反病毒软件的查杀。
有的流氓软件多达数十个碎片文件,这对于手动清除的用户来说,几乎是不可能完成的任务,而即便是杀毒软件也未必能够将数十种碎片文件都一一识别,因此会产生杀不干净的问题,即使是只有一个碎片,流氓软件就有可能通过升级和下载借尸还魂,继续为恶。
以上便是目前流氓软件用得最多的技术,当然,随着同各种反病毒软件的对抗,它们会采用越来越多的底层技术,有些流氓已经开始采用写固件的方式,通过BIOS来进行传播了。而随着流氓软件的发展,手工清除越来越不可能,人们将会越来越依赖于专业的流氓软件清除工具。
流氓软件的8大症状
1.强迫性安装:不经用户许可自动安装,或者是不给出明显提示,欺骗用户安装 。
2.无法卸载:不提供正常的卸载程序,或当用户选择卸载时,不真正卸载。
3.弹出广告窗:在用户上网时,频繁弹出广告窗口,干扰用户正常使用电脑
4.首页修改:浏览器的默认首页,在没有经过用户的同意擅自被修改。
5.修改浏览器:在菜单栏上添加不需要的按钮,在浏览器的地址栏中添非法内容,自动添加菜单。
6.资源占用:CPU资源被大量占用,系统变得越来越慢。
7.使浏览器崩溃:流氓软件由于太信赖于浏览器,因此,经常会出现使浏览器莫名崩溃的情况。
8.干扰软件:流氓软件为了达到它的常久生存的目的,总是干扰一些如杀毒软件的正常运行,使这些软件出现莫名其妙的错误。
--
收藏分享
(芽)
发短消息加为好友
xhlgwei (芽)
精华
1
性别

在线时间
9 小时
最后登录
2010-6-16


中级站友

帖子
187
积分
440
贡献值
5
表现值
377
飘香币
3759
状态
当前离线
 
沙发回复
xhlgwei(楼主)发表于 2007-11-1 21:49 |只看该作者
Re: 从流氓软件说说DLL动态插入技术与Rootkit技术
第二篇
系统DLL技术助力木马静态变动态
作者:未知 文章来源:网络 点击数:8 更新时间:2007-8-24 1:38:05
很多朋友依然不知道近年兴起的“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,可是对新手来说……总之就是比较难啊比较难,所以,最简单的方法:杀毒软件和防火墙。
--
(芽)
发短消息加为好友
xhlgwei (芽)
精华
1
性别

在线时间
9 小时
最后登录
2010-6-16


中级站友

帖子
187
积分
440
贡献值
5
表现值
377
飘香币
3759
状态
当前离线
TOP
板凳回复
xhlgwei(楼主)发表于 2007-11-1 21:50 |只看该作者
Re: 从流氓软件说说DLL动态插入技术与Rootkit技术
第三篇
教你Rootkit技术的木马知识
作者:未知 文章来源:网络 点击数:3 更新时间:2007-8-24 1:25:35
自从“广外幽灵”开创了dll木马时代的先河以来,现在采用线程注射的dll木马和恶意程序已经随处可见了,除了普遍被采用的另行编写dll加载器程序躲在启动项里运行加载dll主体之外,“求职信”还带来了一种比较少见的通过注册表“hkey_local_machine\software\microsoft\windows nt\currentversion\windows\appinit_dlls”项目加载自身dll的启动方法,而相对于以上几种早期方法,现在更有一种直接利用系统服务启动自身的木马程序,这才是真正的难缠!
“服务”是windows系统的一大核心部分,在nt架构系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是底层(接近硬件)程序。通过网络提供服务时,服务可以在active directy中发布,从而促进了以服务为中心的管理和使用。服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、web服务器、数据库服务器以及其他基于服务器的应用程序。 “服务”自身也是一种程序,由于使用的领域和作用不同,服务程序也有两种形式:exe和dll,采用dll形式的服务是因为dll能实现hook,这是一些服务必需的数据交换行为,而nt架构系统采用一个被称为“svchost.exe”的程序来执行dll的加载过程,所有服务dll都统一由这个程序根据特定分组载入内存,然而,如今越来越多病毒作者瞄上了这个系统自带的加载器,因为它永远也不能被查杀。
病毒作者将木马主体写成一个符合微软开发文档规范的服务性质dll模块文件,然后通过一段安装程序,将木马dll放入系统目录,并在服务管理器(scm)里注册自身为通过svchost.exe加载的服务dll组件之一,为了提高隐蔽性,病毒作者甚至直接替换系统里某些不太重要而默认开启的服务加载代码,如“distributed link tracking client”,其默认的启动命令是“svchost -k netsvcs”,如果有个病毒替换了启动命令为自己建立的分组“netsvsc”,即“svchost -k netsvsc”,在这种旁门左道加社会工程学的攻势下,即使是具备一般查毒经验的用户也难以在第一时间内察觉到问题出自服务项,于是病毒得以成功逃离各种查杀。
目前被发现使用此方法的木马已经出现,其中一个进程名为“ad1.exe”的广告程序就是典型例子,它通过替换“distributed link tracking client”服务的svchost启动项来躲过一般的手工查杀,同时它自身还是个病毒下载器,一旦系统感染了这个恶意程序,各种木马都有可能光临你的机器。
要清理dll木马,用户需要借助于sysinternals出品的第三方进程管理工具“process expler”,利用它的“find handle  dll”功能,能迅速搜索到某个dll依附的进程信息并终结,让dll失去载体后就能成功删除,而dll木马的文件名为了避免和系统dll发生冲突,一般不会起得太专业,甚至有“safaf.dll”、“est.dll”这样的命名出现,或者在某些系统下根本不会出现的文件名,如“kernel.dll”、“rundll32.dll”等。除了使用“process expler”查找并终止进程以外,还可以用iceswd强行卸载某个进程里的dll模块来达到效果。
对于服务性质的dll,我们仍然使用“process expler”进行查杀,由于它的层次结构,用户可以很直观的看到进程的启动联系,如果一台机器感染了杀不掉的顽固木马,有经验的用户做的第一件事情就是禁止掉不相关或者不重要的程序和服务在开机时运行,然后使用“process expler”观察各个进程的情况,通过svchost.exe启动的dll木马虽然狡猾,但是它释放出exe文件运行时,一切都暴露了:一个svchost.exe服务进程执行了一个ad1.exe,还有比这更明显的吗?
svchost的分组信息位于注册表的“hkey_local_machine\software\microsoft\windows nt\currentversion\svchost”项目,这是svchost加载dll时的分组依据,如果用户发现了一个奇怪的分组信息,那就要提高警惕了。
隐藏技术发展的颠峰:Rootkit木马
随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——ring 0。位于ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的exe。后门作者把后门写成符合wdm规范(windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件exe的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口和流量也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,这种木马,就是让人问之色变的Rootkit。
要了解Rootkit木马的原理,就必须从系统原理说起,我们知道,操作系统是由内核(kernel)和外壳(shell)两部分组成的,内核负责一切实际的工作,包括cpu任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(ring),ring让程序指令能访问的计算机资源依次逐级递减,目的在于保护计算机遭受意外损害——内核运行于ring 0级别,拥有最完全最底层的管理功能,而到了外壳部分,它只能拥有ring 3级别,这个级别能操作的功能极少,几乎所有指令都需要传递给内核来决定能否执行,一旦发现有可能对系统造成破坏的指令传递(例如超越指定范围的内存读写),内核便返回一个“非法越权”标志,发送这个指令的程序就有可能被终止运行,这就是大部分常见的“非法操作”的由来,这样做的目的是为了保护计算机免遭破坏,如果外壳和内核的运行级别一样,用户一个不经意的点击都有可能破坏整个系统。
由于ring的存在,除了由系统内核加载的程序以外,由外壳调用执行的一般程序都只能运行在ring 3级别,也就是说,它们的操作指令全部依赖于内核授权的功能,一般的进程查看工具和杀毒软件也不例外,由于这层机制的存在,我们能看到的进程其实是内核“看到”并通过相关接口指令(还记得api吗?)反馈到应用程序的,这样就不可避免的存在一条数据通道,虽然在一般情况下它是难以被篡改的,但是不能避免意外的发生,Rootkit正是“制造”这种意外的程序。简单的说,Rootkit实质是一种“越权执行”的应用程序,它设法让自己达到和内核一样的运行级别,甚至进入内核空间,这样它就拥有了和内核一样的访问权限,因而可以对内核指令进行修改,最常见的是修改内核枚举进程的api,让它们返回的数据始终“遗漏”Rootkit自身进程的信息,一般的进程工具自然就“看”不到Rootkit了。更高级的Rootkit还篡改更多api,这样,用户就看不到进程(进程api被拦截),看不到文件(文件读写api被拦截),看不到被打开的端口(网络组件sock api被拦截),更拦截不到相关的网络数据包(网络组件ndis api被拦截)了,我们使用的系统是在内核功能支持下运作的,如果内核变得不可信任了,依赖它运行的程序还能信任吗?
但即使是Rootkit这一类恐怖的寄生虫,它们也并非所向无敌的,要知道,既然Rootkit是利用内核和ring 0配合的欺骗,那么我们同样也能使用可以“越权”的检查程序,绕过api提供的数据,直接从内核领域里读取进程列表,因为所有进程在这里都不可能把自己隐藏,除非它已经不想运行了。也就是说,内核始终拥有最真实的进程列表和主宰权,只要能读取这个原始的进程列表,再和进程api枚举的进程列表对比,便能发现Rootkit进程,由于这类工具也“越权”了,因而对Rootkit进行查杀也就不再是难事,而Rootkit进程一旦被清除,它隐藏自身的措施也就不复存在,内核就能把它“供”出来了,用户会突然发现那个一直“找不到”的Rootkit程序文件已经老实的呆在文件管理器的视图里了。这类工具现在已经很多,例如iceswd、patchfinder、gdb等。
道高一尺,魔高一丈,因为目前的主流Rootkit检测工具已经能检测出许多Rootkit木马的存在,因此一部分Rootkit作者转而研究Rootkit检测工具的运行检测算法机制,从而制作出新一代更难被检测到的木马——futo Rootkit。
国产优秀检测工具iceswd在futo面前败下阵来,因为futo编写者研究的检测工具原型就是一款与之类似的black & light,所以我们只能换用另一款Rootkit检测工具darkspy,并开启“强力模式”,方可正常查杀Rootkit。
但是由于检测机制的变化,darkspy要检测到futo的存在,就必须保证自己的驱动比futo提前加载运行,这就涉及到优先级的问题,也是让业界感觉不太满意的一种方式,因为这样做的后果会导致系统运行效率下降,不到紧急关头,都不要轻易采用这种方法,然而现在的瑞星卡卡助手所推广的“破甲”技术,实现原理是与之类似的,它也会对系统造成一定影响,因而,这个介于安全和效率之间的选择,唯有留给用户自己思考了。