中国的网络从来都是与各种蠕虫、木马、漏洞扫描器一起运作的,而国民对计算机木马和病毒的敏感反应是很重的,但是防范意识却又是最低的,于是在这样的环境里
一. 招摇过市的流氓与木马
中国的网络从来都是与各种蠕虫、木马、漏洞扫描器一起运作的,而国民对计算机木马和病毒的敏感反应是很重的,但是防范意识却又是最低的,于是在这样的环境里,越来越多的人参与到了木马病毒的制造行业,稍有手段的则打着正义旗号推出各种“便民服务”的网络工具,并且为了将便民服务进行到底,大部分此类工具都是一旦装上,则无法卸载的爷们,使用这种铁腕手段强驻的工具则被称为“流氓软件”或者“恶意软件”,最终在各方流氓软件制作者和木马制造兜售者和努力下,中国一跃成为世界上最主要的恶意软件和垃圾邮件发源地。
提到木马或者病毒,大家都会是一脸憎恶且避而远之的态度,恨不得自己一辈子都不用跟这些东西打交道,但是现实却是残酷的,根据一份调查报告指出,在如今这个时代里,国内用于家庭和企业的平民电脑,平均每十台就有至少一台感染了后门,染毒途径除了移动媒介扩散以外,最常见的就是网络途径——被植入木马的网站、网络中爬行的蠕虫、即时聊天系统传输的文件、系统漏洞导致的入侵植马和带毒电子邮件等,可以说,各种途径都可能使你的计算机受到感染,即使你只是打开了几个网站页面看看当天的时事新闻。
然而木马和病毒并非我们所面对的唯一黑手,那份报告遗漏了一个同样重要的统计,那就是,在剩下的九台电脑里,至少有五台都“自愿”安装了“上网辅助软件”,在现行法律里,它们是合法的,因为目前还没有对应的立法,而且许多电脑用户也并没有什么不适感。这就是恶意软件的最初形式,棍棒加糖果主义。通常,它们都具备一些能够辅助用户的功能,从而形成了一定的用户群,而且这些用户到最后会因为无法卸载这些工具而感到困惑:是我潜意识里离不开它还是它不想离开我了?可是当初我只是糊里糊涂的点了一个“是”啊?
这种强行安装且无法卸载的软件就是所谓的“恶意软件”,与各种后门木马的意图不同,恶意软件的立场是自家公司的利益,它们一般不会携带破坏性质的代码(但不代表没有),通常还会拥有一些号称“服务大众”的功能,这些功能或许可以让它得到一些用户的拥戴,但是这种光环并不能掩盖其“服务大众”背后的暴利黑幕。首先,恶意软件可以轻易收集到用户信息,任何一台被安装了“X手X霸X猪X搜”的计算机都不再与“个人隐私”这个词语有缘。其次,恶意软件可以借用广大计算机作为它无偿弹出公司广告的殖民地,如果每条广告都能给该软件背后的公司带来一点利润,那么一年下来这个公司就已经从广大用户群的身上搜刮到一大笔可观的钱财了。天下并没有免费的午餐,在你使用这些软件提供的“快捷服务”时,你就已经付出了代价。
如果说最初的恶意软件都是偷偷耍手段诱惑用户安装的话,那么今天横行网络的恶意软件,就已经和木马没什么两样了,你不仅找不到它们给你带来的什么功能,而且它们也不提供哪怕只是做做样子的卸载程序了,即使你发怒直接删除了它们,重启后你会发现它们仍然安然无恙的在你系统里呆着,这样子的恶意软件,已经被划分为木马了。在这样的环境下,谁来还我们一个干净清洁的系统环境呢?答案,只能是我们自己。
二. 隐藏技术的演变
由于颇为强大的木马和最初的流氓软件均已不是最初那种简单的形态,所以最普通的EXE可运行文件和简单的隐藏技术并不是这些工具会采用的形态和手段,而是直接跳过了第一代木马形态,而采用DLL文件形态和线程注射技术,而一部分流氓软件还会携带着EXE,毕竟流氓软件不能算是纯粹的“木马”,它们还要以辅助工具的身份和用户发生交互的。
线程注射的全称是“远程线程注射”(RemoteThread Injection),通常情况下,各个进程的内存空间是不可以相互访问的,这也是为程序能够稳定运行打下基础,这个访问限制让所有进程之间互相独立,这样一来,任何一个非系统关键进程发生崩溃时都不会影响到其他内存空间里的进程执行,从而使NT架构的稳定性远远高于Win9x架构。但是在一些特定的场合里,必须让进程之间可以互相访问和管理,这就是“远程线程”技术的初衷,这个技术实现了进程之间的跨内存空间访问,其核心是产生一个特殊的线程,这个线程能够将一段执行代码连接到另一个进程所处的内存空间里,作为另一个进程的其中一个非核心线程来运行,从而达到交换数据的目的,这个连接的过程被称为“注射”(Injection)。远程线程技术好比一棵寄生在大树上的蔓藤,一旦目标进程被注射,这段新生的线程就成为目标进程的一部分代码了,只要目标进程不被终止,原进程无论是否还在运行都不会再影响到执行结果了。
曾经,线程注射技术成为摆在用户面前的一道难题,因为一旦它加载运行,一般的手段就无法对其造成伤害,但是随着时代变迁,它的“弊端”也开始暴露得越来越明显了,例如在安全模式下,由于载体EXE的启动项无法被调用运行,这些木马自然也就失去了作用。而一部分流氓软件是以浏览器BHO形式出现的,只要“Windows外壳”Explorer.exe程序被加载,它就随之启动了,虽然它使用这种方法实现了在一般的安全模式里也能保持运行,但是在更进一步的“命令提示符的安全模式”里,由于它的依赖载体Explorer.exe并不会被调用(该模式里使用CMD.EXE作为外壳),在有经验的用户面前,这种保护模式也就被破解了。
于是开发者必须寻求一种更高级更保险的手段来确保自己的作品不受破坏,最终他们把眼光投向了系统底层——Ring 0,这里运行着系统核心模块和各种驱动程序模块,而且也只能运行这些以驱动文件为形态的代码。为了达到目的,后门作者把作品写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件EXE的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在Ring 0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果,这种木马,就是让人闻之色变的Rootkit。
最初,这种技术仅仅为高级的木马所使用,然而到了后期,为了避免自身被用户和恶意软件清理工具卸载,越来越多的恶意软件纷纷加入了这个阵营,到了这个阶段,恶意软件已经彻底成为流氓了,有许多恶意软件甚至结合了多种途径蚕食用户的系统领域,包括驱动形态、线程注射的DLL形态和表面上的EXE——它们只比类似的木马多了一个EXE而已。在多种技术的结合下,这些惹人讨厌的东西越来越难以查杀,于是就出现了开头提到的现象——并非用户不想清理它们,而是因为太多的有心无力。
在这个疯狂的利益时代里,我们——普通用户该如何保全自己不再成为这种进驻到了驱动级别的木马和流氓软件的受害者和摇钱树呢?
三. 与驱动木马过招
与传统木马的发展过程一样,驱动木马也经历了一个进化的阶段,早期的驱动木马虽然采取了驱动形态达到隐藏自己避免查杀的目的,但是在安全模式里它仍然被发现了,这是为什么?因为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还会出现一些IMG或IME开头的启动项,这些都是无关紧要的。
有用户会提问,如果我一直没有养成记录系统启动项的习惯,也没有过检测木马的经验,我该如何去判断一个启动项是否木马呢?这个问题很难用固定的思维回答,但是用户可以采取一个笨而实用的方法来测试,虽然它很烦琐,但是却比较直观。
首先运行“系统配置实用工具”msconfig.exe,在它的“启动”选项卡里面把所有启动项取消,然后重启计算机,你会发现系统任务栏右边的托盘区少了许多东西,这时候,再次运行msconfig,边把当前的启动项名称记录在笔记上并勾上第一个启动项,然后确定重启,通过观察系统启动后托盘区里是否多出了图标就可以判断出这个启动项的大概作用了,如果托盘区出现了图标或者直接就出现了一些窗口界面如QQ的登录对话框,就可以确认这是个正常的启动项,在笔记上对应的启动项名称前打勾。然后再次运行msconfig,取消第一个启动项的勾,勾上第二个启动项,再次重启,直到所有启动项都分别独立开启了一次为止,最后看看你记录下来的笔记里有多少个项目是打了勾的,而剩下那些未被勾选的项目,有80%的几率就是一般的木马。