一. 谁是救世主
相信看过《黑客帝国》系列的朋友都不会对主人公尼奥感到陌生,这位闯入虚拟世界的程序员一次又一次演绎了“救世主”的角色,保护了城市居民,其形象早已深入人心。而离开电影后,我们广大的计算机用户要面对的又是另一种亦真亦假的数字虚拟世界——网络,这里同样潜伏着许多危险,同样存在“黑客帝国”,但这里却没有尼奥这个人的存在,我们能看到的,只有形形色色的安全厂商和他们所提供的安全工具,除此之外,似乎已经没有别的选择。
于是乎,许多用户把各种安全工具看成了这个世界中的“救世主”,我们看到许多关于安全工具的广告,我们购买市面上流行的防病毒软件,我们在听闻每周一次的“新病毒预警”时赶紧升级病毒特征库,我们每周都对电脑进行一次漫长的病毒扫描……许多人都这样做,许多人不得不这样做,因为我们把一切都交给杀毒工具了,我们什么都不需要做了,我们只管肆无忌弹的上网聊天看电影下软件,因为我们有杀毒工具,这些工具都具备一个“实时监测”的功能,它每时每刻都会检查我们刚下载的文件,我们感到自己很安全,我们以为这就是网络中的防御。
然而,事实真的如此美好吗?依稀记得有一句话好像是这么说的,“无论你做什么事情,你都不可避免要付出一定的代价”,在我们安然自得的享受由杀毒工具带来的安全防御的同时,我们也在付出相应的代价。为什么呢?因为杀毒工具是一套在系统启动的时候就开始运行直到关机或者用户退出它的时候才会停止运行的程序,它们的检测和防御机制的效率是不能和尼奥相比的。举个简单例子,学过编程的人大概都知道,象棋程序是最难写得完美的,因为象棋的走法从来都没有一个固定的模式,我们能创造出许多花样,但是程序不能,它只能按照有限的判断机制去决定每一步棋怎么走,这就是为什么如今的许多象棋程序看起来像个傻瓜的原因。有人也许会说,做一个强大的象棋程序把尽可能遇到的走法都写进去就可以了,这个象棋程序必然无敌。这样是可行的,但是由此带来的代价就是每个和它下棋的人可能都要花一辈子的时间了,因为程序在每走一步棋之前都要把所有尽可能遇到的情况都“思考”一遍,这样是要付出时间作为代价的,如果要缩短时间,就要让程序在同一时刻思考多种走法,但着时候,代价就变成庞大的系统资源消耗了——你能忍受么?
同样的缺陷正在杀毒软件身上发生,我们知道,大部分杀毒软件是采用“特征码”技术去搜索病毒的,就是说,杀毒软件引擎读取一个程序或文件内容,并与自身数据库里储存的已被确认为病毒程序体内某段特定代码进行匹配,一旦两者相同,杀毒软件就“确认”此文件为病毒。随着病毒家族的庞大,这个数据库体积的增长也到了不可忽视的地步,加载的速度也就慢了。而且数据库每增加一个病毒特征码,杀毒引擎的判断分支就要增多一条,相应的时间也会延长,为了避免出现扫描一个文件需要半小时的尴尬情况,杀毒软件会采用各种提高匹配速度的方案,但这些方案无一例外都要疯狂剥削用户的系统资源,如果一台电脑的配置并不是很高,那么在用户查毒的时候,他基本上已经不能正常做其他工作了,找个电视台慢慢看连续剧吧,这就是尼奥的代价。
那么,谁才是我们的救世主?答案就是——你自己。能信任的人永远只有自己,只要肯努力,每个人都可以做尼奥,不过这也是有代价的,因为它把系统资源的消耗转变为脑子的消耗,把判断分支和经验写入脑子里,在处理分支的效率上,人永远比程序要灵活,而且这样一来就不会出现依赖的恶性循环了,离开了杀毒软件,我们要学会靠自己来保护自己不被这个虚拟世界伤害到。现在,就让我们来做自己的救世主吧。
二. 做自己的救世主
小时候曾经看过一个故事《另一种侵略》,被人类打败的宇宙侵略者送给人类一种水晶,只要人类拿起它想一种物品,这个物品就会出现在自己面前,于是每个人都开始沉浸于无尽的享受中,再也没人去钻研科技国防了,几十年后,人类开始出现退化现象。这时候,宇宙侵略者又来访问地球了,这次它们只用了一条条鞭子就征服了地球,在最后一个人类被驱逐进囚笼之前,他回头含糊不清的说了句什么话——连他的舌头都退化得差不多了,也许他是说:“地球完了。”
以上的故事或许只是虚无的幻想,但类似的行为却正在当代发生,如果一个用户怀疑自己的电脑感染了后门,他的第一个反应大概会是打开杀毒工具。故事里的人类太依赖水晶的魔力,现实中的我们太依赖杀毒软件的方便快捷!也许有人会反对,既然能使用工具方便快捷的保护计算机安全,我又何必自寻烦恼学习安全防御?会这样想的用户没有想到网络的复杂,能闯进计算机的“客人”并非就是在各大安全工具厂商通缉名单上的成员,因为网络中还流传着一部分小规模使用而且没有被公开的“私人后门”(例如大部分DDoS后门工具其实都是自己写自己用的),有能力的人都可以自己写“私人后门”,然后通过多种途径放到别人的计算机上执行。这时候,“病毒库特征码”技术的局限性就开始显露了,被感染了“私人后门”的用户偶尔会察觉到计算机异常,然后他会开始查毒,结果因为渗透进系统的后门程序并没有在病毒特征库里“登记”过,杀毒软件就认不出它了,用户只能在浪费大量时间后看着杀毒软件报告的“没有发现病毒”消息继续“享受”被入侵的感觉。这个事实可笑吗?我们只能在自己信赖的尼奥面前被敌人杀死——甚至这个尼奥也不复存在了,如果后门能把它踢出内存并删除掉的话。
还是那句话,能信任的人只有自己,更何况这是网络。所以,我们不能再战战兢兢的躲在掩体里等待救世主消灭所有敌人了,我们要做自己的救世主!
三. 捕获不请自来的“客人”
“600型机器人包裹的是橡胶外皮,很容易被认出来,但现在的101型机器人是生化技术制造的,有真实皮肤,会呼吸、流血、甚至口臭,一切都和人类一样,直到它开始攻击,你才能知道它不是人类。”
“那你们怎么办?”
“我们用狗识别终结者。”
——《终结者》
在《终结者》里,狗是唯一可以区分敌我的工具,因为它判断对方的方式并不仅仅靠眼睛——眼睛是可以被欺骗的,但是气息不能,一个机器人无论伪装得再怎么逼真,都不能具备生命体的气息,但是它能欺骗人类的视觉和听觉,这就足够了。
后门技术从诞生到现在,已经发展了好几代,对自身的伪装技术也越来越成熟了,从最初的启动项结合隐藏进程方式,到最新的Ring0驱动方式,我们越来越难发现这些“客人”的痕迹,当它开始破坏的时候,已经来不及做补救措施了,所以,我们需要一种可以嗅出后门气息的“狗”。
1.准备工作
在进行一切工作之前,用户需要对系统有点了解,例如注册表、启动项、服务、常见的程序和进程名等,这是学习手工查毒最基本的要求,在初期可以多参考一些介绍系统概念的文章如到处都流传的“系统进程详解”、“WinXP系统服务简介及优化措施”等,并做一点笔记,力求日积月累尽快记住一些最常见的系统程序和相关工具的使用方法,如果过不了这个门槛,后面的工作也就无从谈起。
首先,我们必须了解Windows系统的三大知识点:注册表(Registry)、进程(Process)和权限(Privilege)。
“注册表”是出现在Windows 95及以后版本的一种数据库。在这之前,用户要对软硬件工作环境进行配置,就要修改一种被称为“配置设置”(INI)的文件来完成,但是由于每种设备或应用程序都得有自己的INI文件,无形中增加了管理难度,为了解决这个问题,微软开始统一标准并将各种信息资源集中起来存储,最终形成了将应用程序和计算机系统配置信息容纳在一起的“注册表”,用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等,注册表维持着整个系统的正常运作。
注册表采用一种类似文件目录的结构树来描述配置信息,最顶端的5个项目称为“根键”(ROOT_KEY),系统能识别的所有的数据都是从它们这里展开的,这5个根键分别是:
HKEY_CLASSES_ROOT(负责各种组件注册类别和文件并联信息)
HKEY_CURRENT_USER(当前登录用户的环境信息)
HKEY_LOCAL_MACHINE(整个系统的公共环境信息)
HKEY_USERS(所有用户的环境配置信息)
HKEY_CURRENT_CONFIG(当前的配置信息)
其中,我们主要关注的是前面三个根键里的数据,它们是后门最爱篡改的地方,分别是三个启动项目“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”和“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices”,一般的后门都要通过修改这里加入自己的配置信息以达到跟随系统启动的目的;除此之外就是文件并联信息“HKEY_CLASSES_ROOT”,并联型后门最爱更改这里的.exe、.bat、.scr、.com等可执行文件的注册信息,让自己抢先一步运行。更多涉及到的注册表内容以后会提到,现在让我们来看看进程是什么。
“进程”,是指一个可执行文件在运行期间请求系统在内存里开辟给它的数据信息块,系统通过控制这个数据块为运行中的程序提供数据交换和决定程序生存期限,任何程序都必须拥有至少一个进程,否则它不被系统承认。进程从某一方面而言就是可执行文件把自身从存储介质复制在内存中的映像,它通常和某个在磁盘上的文件保持着对应关系,一个完整的进程信息包括很多方面的数据,我们使用进程查看工具看到的“应用程序”选项卡包含的是进程的标题,而“进程”选项卡包含的是进程文件名、进程标识符、占用内存等,其中“进程文件名”和“进程标识符”是必须掌握的关键,“进程标识符”是系统分配给进程内存空间时指定的唯一数字,进程从载入内存到结束运行的期间里这个数字都是保持不变的,而“进程文件名”则是对应着的介质存储文件名称,根据“进程文件名”我们就可以找到最初的可执行文件位置。
最后是“权限”,这里涉及的权限是指80386模式的Ring权限。操作系统是由内核(Kernel)和外壳(Shell)两部分组成的,内核负责一切实际的工作,包括CPU任务调度、内存分配管理、设备管理、文件操作等,外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。由于内核和外壳负责的任务不同,它们的处理环境也不同,因此处理器提供了多个不同的处理环境,把它们称为运行级别(Ring),Ring让程序指令能访问的计算机资源依次逐级递减,目的在于保护计算机遭受意外损害——内核运行于Ring 0级别,拥有最完全最底层的管理功能,而到了外壳部分,它只能拥有Ring 3级别,这个级别能操作的功能极少,几乎所有指令都需要传递给内核来决定能否执行,一旦发现有可能对系统造成破坏的指令传递(例如超越指定范围的内存读写),内核便返回一个“非法越权”标志,发送这个指令的程序就有可能被终止运行,这就是大部分常见的“非法操作”的由来,这样做的目的是为了保护计算机免遭破坏,如果外壳和内核的运行级别一样,用户一个不经意的点击都有可能破坏整个系统。但是现在,Ring已经屡屡被后门木马利用成为一个令人头痛的凶器。
2.进程伪装型后门的歼灭
最初的后门靠注册“系统服务”的方法在Win9x系统里隐藏自己的运行信息,到了NT架构里,这个方法失效了——NT家族自带的任务管理器(Task Manager,TaskMgr.exe)把所有普通进程都一视同仁的显示出来,连初级用户都能轻易发现后门运行的痕迹,于是后门制造者开始攻克心理学和障眼法,让后门进程在任务管理器里把自己标榜为“系统关键进程”,达到欺骗用户的目的。