一提起木马或者病毒,大家都会是一脸憎恶且避而远之的态度。但是现实却是残酷的,在当今这个时代,国内用于家庭和企业的电脑,平均每十台就有至少一台感染过后门,染毒途径除了移动媒介扩散以外,最常见的就是网络途径,如那些被植入木马的网站、网络中爬行的蠕虫、即时聊天系统传输的文件、系统漏洞导致的入侵植马和带毒的电子邮件等。可以说,各种途径都可能使你的计算机受到感染,即使你只是打开了几个网站页面看看当天的时事新闻。
正所谓知己知彼、百战不殆,要想远离木马或病毒的骚扰,当然需要我们对它们有详细的了解,才能让我们战胜这些木马、病毒以及那些恶意的入侵!下面我们就为大家介绍一种历史悠久的木马――驱动木马。
一、 隐藏技术的演变:
要谈驱动木马的识别,就不能不介绍木马、病毒的隐藏技术的演变过程。最初的木马,如同恶意软件或流氓软件那样,使用普通的EXE可运行文件和简单的隐藏技术。较为强大的木马,是直接跳过了第一代木马形态,而采用DLL文件形态和线程注射技术。
线程注射的全称是“远程线程注射”(RemoteThread Injection),通常情况下,各个进程的内存空间是不可以相互访问的,这也是为程序能够稳定运行打下基础,这个访问限制让所有进程之间互相独立,这样一来,任何一个非系统关键进程发生崩溃时都不会影响到其他内存空间里的进程执行,从而使NT架构的稳定性远远高于Win9x架构。但是在一些特定的场合里,必须让进程之间可以互相访问和管理,这就是“远程线程”技术的初衷,这个技术实现了进程之间的跨内存空间访问,其核心是产生一个特殊的线程,这个线程能够将一段执行代码连接到另一个进程所处的内存空间里,作为另一个进程的其中一个非核心线程来运行,从而达到交换数据的目的,这个连接的过程被称为“注射”(Injection)。远程线程技术好比一棵寄生在大树上的蔓藤,一旦目标进程被注射,这段新生的线程就成为目标进程的一部分代码了,只要目标进程不被终止,原进程无论是否还在运行都不会再影响到执行结果了。
曾经,线程注射技术成为摆在用户面前的一道难题,因为一旦它加载运行,一般的手段就无法对其造成伤害,但是随着时代变迁,它的“弊端”也开始暴露得越来越明显了,例如在安全模式下,由于载体EXE的启动项无法被调用运行,这些木马自然也就失去了作用。而一部分木马则利用开始浏览器,只要“Windows外壳”Explorer.exe程序被加载,它就随之启动了,虽然它使用这种方法实现了在一般的安全模式里也能保持运行,但是在更进一步的“命令提示符的安全模式”里,由于它的依赖载体Explorer.exe并不会被调用(该模式里使用CMD.EXE作为外壳),在有经验的用户面前,这种保护模式也就被破解了。
二、驱动木马的诞生:
于是木马开发者开始寻求一种更高级更保险的手段来确保自己的“作品”不受破坏,最终他们把眼光投向了系统底层——Ring 0,这里运行着系统核心模块和各种驱动程序模块,而且也只能运行这些以驱动文件为形态的代码。为了达到目的,后门作者们把“作品”编写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件EXE的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在Ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,这种木马,就是让人闻之色变的Rootkit。
起初,这种技术仅仅为高级的木马所使用,然而到了后期,为了避免自身被用户和恶意软件清理工具卸载,越来越多的恶意软件纷纷加入了这个阵营,到了这个阶段,恶意软件已经彻底成为流氓了,有许多恶意软件甚至结合了多种途径蚕食用户的系统领域,包括驱动形态、线程注射的DLL形态和表面上的EXE——它们只比类似的木马多了一个EXE而已。在多种技术的结合下,这些惹人讨厌的东西越来越难以查杀。
【责编:Chuan】
三、驱动木马的发展:
早期的驱动木马虽然采取了驱动形态达到隐藏自己避免查杀的目的,但是在安全模式里它仍然被发现了。因为Windows的“安全模式”不仅仅限于加载用户界面和启动项这些区别,它还包括各种驱动的“安全模式”,在安全模式里,为了确保Windows不会由于某个驱动文件的缺陷而崩溃——毕竟一部分人被迫进入安全模式就是因为遇到了某些设备驱动不兼容或存在问题而导致系统不能正常运行,大部分被标记为“不必要”的驱动在“硬件抽象层(HAL)”的干涉下,是不会被加载的,甚至显卡驱动也不能例外。所以此时Windows是相对安全的基于“默认硬件”运行的界面简陋的系统。操作系统厂商此举其实很好理解,想象一下如果你因为安装了某个设备的驱动程序而导致系统蓝屏,然后你来到安全模式里想要修复它,却不幸的发现安全模式也出现了蓝屏——因为这个驱动被系统加载了,如果这样,安全模式还有什么意义。于是,在这样的设计思想下,早期的驱动木马到了安全模式,还是很好清理的,因为那个时候,大部分开发者还处于开发Rootkit的试探阶段,谁也不敢贸然绕过这种安全体系。
硬件抽象层(Hardware Abstraction Layer,HAL)是微软公司为了便于操作系统在不同硬件结构上进行移植而提出的将系统底层与硬件相关的部分独立运作的思想,HAL为系统实现了“硬件无关性”,即在不同的硬件平台上,硬件与操作系统的交互也不会有所差异,这样一来,硬件厂商开发驱动的难度便能大大降低,HAL将硬件的接口细节隐藏起来,并为操作系统提供一个标准硬件交互接口,目前所有的硬件驱动都工作在这个层面上,当外界硬件存在指令请求时,驱动程序响应请求并将指令通过HAL转换为系统核心层能理解的指令交给内核执行,如果未找到相应的驱动程序类型,则将其视为“默认硬件”(Default Hardware)处理,什么叫“默认硬件”呢?最简单的例子就是进入安全模式,这时候大部分驱动程序不会被加载,此时的系统便是工作于“默认硬件”上。
然而在经历了一段时间的试炼以后,开发者的技术熟练了,胆子也大了,他们开始修改驱动模块的运行级别——系统的“默认硬件”是根据驱动模块加载入口声明的启动优先级判断的,对于绝对安全的驱动程序,它的优先级被提高了,于是系统无论在什么模式下都会加载它,例如键盘驱动、鼠标驱动、各种基础的系统设备驱动等,如果某个驱动文件的优先级被人为提高,系统就会将其视为必备驱动加载,而这个优先级的提高方法非常简单,只需要改动注册表的驱动模块分支里的一个数据而已。至此,即使在加载模块最少的“基于命令提示符的安全模式”下,这样驱动木马就可以不受阻碍的横行霸道了,即使是专业的计算机用户查杀也很困难了,更别说那么“菜鸟”们了。
四、识别驱动木马:
大部分驱动木马的驱动模块并不是用来实现入侵行为或者进行浏览器劫持的,而是为真正负责这部分操作的位于用户层的可执行程序本体提供保护功能,因此驱动木马的大部分工作就是拦截相关的系统API调用工作,使得用户无法直接查找到真正的文件本体,或者对它们屡杀不禁,甚至连相关的注册表项目都无法删除,这就是因为它们直接从驱动层拦截了实现这些功能的API。
虽然驱动木马使用的种种手段使得自己可以保全于普通的系统安全检测工具下,但是在基于驱动层的安全检测工具出现后,这个一方独霸的局面被打破了,通过使用国产的几个优秀工具如IceSword和安全巡警专业版(AST Pro),普通用户也能具备发现驱动木马的能力。那么,如何判断系统是否中了木马,以及是中了驱动木马呢?首先用户要具备基础的系统启动项知识,虽然启动项里的东西会随着用户安装的一些软件而增加,但是实际上系统可以只存在最少的两个甚至一个启动项:用于同步的mobsync、输入法指示器internat(Windows 2000)或高级文字服务ctfmon(Windows XP),默认情况下Windows XP还会出现一些MG或IME开头的启动项,这些都是无关紧要的。
也许您会问,如果我一直没有养成记录系统启动项的习惯,也没有过检测木马的经验,我该如何去判断一个启动项是否木马呢?这个问题很难用固定的思维回答,但是用户可以采取一个笨而实用的方法来测试,虽然它很烦琐,但是却比较直观。
首先运行“系统配置实用工具”msconfig.exe,在它的“启动”选项卡里面把所有启动项取消,然后重启计算机,你会发现系统任务栏右边的托盘区少了许多东西,这时候,再次运行msconfig,边把当前的启动项名称记录在笔记上并勾上第一个启动项,然后确定重启,通过观察系统启动后托盘区里是否多出了图标就可以判断出这个启动项的大概作用了,如果托盘区出现了图标或者直接就出现了一些窗口界面如QQ的登录对话框,就可以确认这是个正常的启动项,在笔记上对应的启动项名称前打勾。然后再次运行msconfig,取消第一个启动项的勾,勾上第二个启动项,再次重启,直到所有启动项都分别独立开启了一次为止,最后看看你记录下来的笔记里有多少个项目是打了勾的,而剩下那些未被勾选的项目,有80%的几率就是一般的木马。
这个方法最保险,也最烦琐,所以用户需要记住一条规律,如今有许多木马的文件名和启动项名称都是很混乱或者很“系统”的,如看到“48ED0A5E”、“svchost”、“svohost”、“services”、“ssdt”、“ssodl”这样的启动项,那就不必怀疑了,它绝对是木马。
用户的疑问又来了,这方法的结尾说,这只是测试“一般的木马”而已,那我该如何判断系统是否感染了“驱动木马”呢?其实,如果用户的机器已经感染了驱动木马,那么在刚才的测试里它就已经暴露了,细心的用户应该不难发现,他们的机器里有一个甚至多个启动项,即使刚才在msconfig里已经取消,重启后却发现它仍然是选中的状态,如果用户是使用具备实时刷新功能的第三方工具管理启动项,甚至会发现自己刚取消了这个启动项就马上被自动恢复了,而这些始终不肯放弃自启动权利的项目,就是我们要找的驱动木马的用户层本体——不要高兴,它并不是驱动木马的真正危害部分,这个只是驱动木马千方百计要保护的对象而已。这个方法正是利用驱动木马的保护特性,让它自我暴露。
结束语:以上从木马的隐藏技术一直到驱动木马的识别,进行了详尽的叙述,而光发现和识别驱动木马是不够了,如何绞杀这些讨厌的家伙呢,请大家关注我们后续的文章!