杀毒软件是如何工作的?在面对病毒程序的活动进行一个判定的时候,杀毒软件需要检测当前活动的程序行为是否合法,做了什么,或者想做什么,对计算机出现的状况进行一个预估,以确定该病毒的存在,想知道更多,可以阅读下文中的深度解析。
杀毒软件是如何工作的?
一、杀毒软件引擎与病毒库的关系
首先必须指出杀毒软件的引擎与其病毒库并没有什么直接的关系。杀毒引擎的任务和功能非常简单,就是对于给定的文件或者程序进程判断其是否是合法程序(对应于杀毒软件厂商自己定义的正常和非异常程序规范而言。正常的程序规范是指在程序所在系统平台上操所系统本身洗净有定义的或者业界已经公认的程序行为过程,比如操作系统正常运行就必须要求应用程序与系统核心进行进程响应并与交换相关数据。非异常程序活动是指可能存在非法程序操作结果但能够以较高的置信度确定其非非法程序活动规范的。一般情况下,相关文件的复制,移动,删除等都奔包括在该界定范围内)。
我们知道病毒的最终目的有些是与合法活动很类似的,在这种情况下,要求软件厂商必须自己有一个行为规范界定规则,在一个给定的范围和置信度下,判断相关操作是否为合法。在这方面,各个厂商的界定是有区别的,一般而言非美国厂商界定是非常严格的,只有有很高的置信水平的程序行为,他们才判别为非病毒操作。记得前一阵论坛上有人给了四段简单的代码,很多杀毒软件将其判为病毒或有病毒性质的文件行为,实际上看那几段代码可以知道,其结果并不足以视之为病毒。美国厂商一般判断比较复杂,这主要由于美国市场上的杀毒软件引擎来源比较复杂,比如Norton,有足够的技术资料确信它的杀毒软件引擎是自成体系的,而Mcafee则存在一定的外界技术引进(收购所罗门)。
用简单的话说,杀毒引擎就是一套判断特定程序行为是否为病毒程序(包括可疑的)的技术机制。一个完整的技术引擎应遵守如下的行为过程:
⑴、非自身程序行为的程序行为捕获。包括来自于内存的程序运行,来自于给定文件的行为虚拟判断,来自于网络的动态的信息等等。一般情况下,我们称之为引擎前端。捕捉的方法非常多,除Norton以外的杀毒软件采用的都是行为规范代码化的方法。Norton由于与微软有远远高于其它厂商合作关系,其实现过程比较独特,另有叙述。
⑵、基于引擎机制的规则判断。这个环节代表了杀毒引擎的质量水平,一个好的杀毒引擎应该能在这个环节发现很多或者称之为相当规模的病毒行为,存而避免进入下一个判断环节。传统的反病毒软件引擎使用的是基于特征码的静态扫描技术,即在文件中寻找特定的十六进制字符串,如果找到,就可判定文件感染了某种病毒。但这种方法在当今病毒技术迅猛发展的形势下已经起不到很好的作用了。为了更好的发现病毒,相继开发了所谓的虚拟机,实时监控等相关技术。这个环节被叫做杀毒软件引擎工作的核心层。
⑶、引擎与病毒库的交互作用。这个过程往往被认为是收尾阶段,相对于前两个环节,这个阶段速度是非常慢的,杀毒引擎与要将非自身程序行为过程转化为杀毒软件自身可识别的行为标识符(包括静态代码等),然后与病毒库中所存贮的行为信息进行对应,并作出相应处理。当然必须承认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒软件引擎的不足之处。但是必须意识到,如果在核心层阶段就可以结束并清除病毒程序,那么杀毒软件的工作速度将会大幅提升。“很可惜的是,当前我们没有足够聪明的杀毒引擎来完成这个过程”,这就是为什么有病毒库的原因。
Norton是微软最高级的安全方面核心合作厂商,因此它的杀毒软件在某些方面工作比较特殊。比如在杀毒软件的安装,使用和功能实现方面,大部分厂商采用的是中间件技术,在系统底层与非自身应用程序之间作为中间件存在并实现其功能;另有一些厂商使用的是应用程序或者嵌入技术,相对而言这种方法安全性较低;Norton和Mcafee实现方式比较相似,Norton采用了基于系统最底层的系统核心驱动,这种实现方式是最安全的或者说最高级的实现方式,当然这需要微软的系统源代码级的支持(要花许多money),业界公认,这是最稳定的实现方法,但从目前而言,只Norton一家。Mcafee实现方式与Norton很接近,一般称之为软件驱动。相当于在系统中存在一个虚拟“硬件”,来实现杀毒软件功能。这些实现方式关系着杀毒引擎对程序行为进行捕捉的方式。
我们使用的Intel系列处理器有两个 Ring层,对应两个层,微软的操作系统将系统中的所有行为分为如下几个层:
⑴、最底层:系统核心层,这个层的所有行为都由操作系统已经内置的指令来实现,所有外界因素(即使你是系统管理员)均不能影响该层的行为。Norton的核心层既工作在这个层上。
⑵、硬件虚拟层(HAL)。为了实现硬件无关性,微软设计了该层。所有的外部工作硬件(相对于系统核心而言)都进入HAL,并被HAL处理为核心层可以相应的指令。我们所使用的硬件的驱动程序既工作在该层上。当外界硬件存在指令请求时,驱动程序作出相关处理后传给核心层。如果无与之对应的驱动相应,那么将按照默认硬件进行处理。好像安全模式下硬件的工作就被置于默认硬件模式。Mcafee的杀毒软件,就被认为工作在HAL层上。
⑶、用户层。我们所知的大部分杀毒软件既工作与该层上。一个完整的程序行为请求是如下流程:位于3户层上的应用程序产生指令行为请求,被传递至2HAL进行处理,最后进入1最底层后进入CPU的指令处理循环,然后反向将软件可识别的处理结果经1-2-3再响应给应用程序。对于Norton而言,其整个工作过程如下:3-2-1,完成;Mcafee:3-2-1-1-2,完成:其余:3-2-1-1-2-3,完成;这个环节代表了杀毒软件引擎的前端行为规范的获得。只从这个过程而言,Norton和Mcafee是比较先进的。具体到系统与CPU的Ring()的对应,Win NT时代,微软的NT系统被设计成与四个Ring()层相对应,RISC系列的处理器有四个Ring。因此现在的大部分杀毒软件是不能工作在NT上的。具体来说,CISC有四个Ring(),RISC有两个Ring()。
尽管比较先进的工作方式给Norton和Mcafee带来了较高的系统稳定性(HAL层很少出现问题,最底层出问题的几率接近于零),较快的响应速度(减少了环节),但同时也带来了一些问题:1.资源占用比较厉害。在Mcafee上体现的不是很明显,在Norton上表现非常明显。因为对于越底层的行为,硬件资源分配越多。最好资源的是什么?当然是操作系统。应为它最最底层。2.卸载问题。卸载底层的组件出问题的概率是相对比较高的,因此Norton的卸载比较慢,偶尔还容易出问题。
因此,有人质疑微软Windows操作系统的不稳定性,是否会拖累Norton?实际上,Windows的内核层设计是非常优秀的,很多时候,操作系统的不稳定性来源于以下几个方面:
⑴、应用程序设计不合理,许多程序设计者根本就未读过微软的32位程序设计指南,所设计的程序并不严格符合微软规范。我们看到,大量多年前设计的软件还能运行于最新的Win XP平台,原因很简单:这个软件在设计时完全遵循了微软的程序设计规范。
⑵、驱动程序的编写有问题,与HAL层有冲突。
因此,片面地认为微软的操作系统将会影响Norton的稳定性是不合理的。
业界有人认为,先进杀毒软件的引擎设计已经日趋复杂,类如Norton这一类的厂商其产品的引擎应该已经覆盖了操作系统的各个层级,以提高防护能力。在一篇文档中有程序员提出有足够的信息认为Norton,Mcafee,趋势的产品自己修改了标准的系统相关协议,比如TCP/IP等,以达到所谓的完整防护的目的。NOD32的一篇官方文档,就指出,反病毒厂商有必要全面更新系统的诸多协议,以达到最快的速度和杀毒效果。
二、病毒技术浅析
要讨论怎样反病毒,就必须从病毒技术本身的讨论开始。正是所谓“知己知彼,百战不殆”。很难想象一个毫无病毒写作经验的人会成为杀毒高手。目前国内一些著名反病毒软件公司的研发队伍中不乏病毒写作高手。只不过他们将同样的技术用到了正道上,以毒攻毒。当今的病毒与DOS和Win 3.x时代下的从技术角度上看有很多不同。最大的转变是:引导区病毒减少了,而脚本型病毒开始泛滥。原因是在当今的操作系统下直接改写磁盘的引导区会有一定的难度(DOS则没有保护,允许调用INT13直接写盘),而且引导区的改动很容易被发现,并且微软在设计操作系统时加强了对引导区的程序行为管理,写一个完美的引导区病毒难度很大,所以很少有人再写了;而脚本病毒以其传播效率高且容易编写而深得病毒作者的青睐。但是最最落后的杀毒引擎也就是只基于静态代码的杀毒引擎都能干掉该种病毒(病毒库搞好就行)。
要讨论的技术主要来自于二进制外壳型病毒(感染文件的病毒),并且这些技术大都和操作系统底层机制或386以上CPU的保护模式相关,值得研究。DOS下的外壳型病毒主要感染 16位的COM或EXE文件,由于DOS没有(文件和引导区)保护,它们能够轻松地进行驻留,减少可用内存(通过修改MCB链),修改系统代码,拦截系统服务或中断。而到了WIN9X和WINNT/2000时代,搞个运行其上的32位Windows病毒变得难了点。由于存在页面保护,你不可能修改系统的代码页(如果你强到连操作系统代码都能改,偶无话可说)。由于I/O许可位图中的规定,你也不能进行直接端口访问。在Windows中,你不可能像在 DOS里那样通过截获INT21H来拦截所有文件操作。总之,当你以一个用户态权限运行,你的行为就会受到操作系统严格的控制(在Win XP中,这种权限管理极为严格,分成了好几个等级)。Windows下采用的可执行文件格式和DOS下的EXE文件截然不同(普通程序采用PE,驱动程序采用LE格式),所以病毒的感染文件的难度增大了(PE和LE比较复杂,中间分了若干个节,如果感染错了,将导致文件不能继续执行)。当今病毒的新技术太多,随便介绍几个。
1、系统核心病毒
386及以上的X86 CPU实现了4个特权级模式(Windows只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码,不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多限制,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,像在DOS这种实模式操作系统里,则没有这些概念,其中的所有代码都可被看作运行在核心态。既然运行在核心态有如此之多的优势,那么病毒当然没有理由不想得到Ring0。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。现代操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令完成模式切换。在X86处理器上,这条指令是INT;在Win 9X下是INT30(保护模式回调);在Linux下则是INT80;在Win NT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求,并将结果传给用户程序。
在最新发布的Win XP SP2中,采用了“数据执行保护”(DEP)技术。这是一种基于处理器支持的内存页面保护技术,它将更为严格地控制用户访问的权限,它禁止在标记为数据存储的内存区域中执行代码。当某些程序或病毒尝试运行标记的数据页中的代码时,就会立即发生异常并禁止执行代码。这可以防止攻击者使用代码致使数据缓冲区溢出,然后执行该代码。
2、驻留病毒
驻留病毒是指那些在内存中寻找合适的页面并将病毒自身拷贝到其中且在系统运行期间能够始终保持病毒代码的存在。驻留病毒比那些直接感染(Direct-Action)型病毒更具隐蔽性,它通常要截获某些系统操作来达到感染传播的目的。进入核心态的病毒,可以利用系统服务来达到此目的。如CIH病毒,就通过调用一个由VMM导出的服务VMMCALL _PageAllocate在大于0XC0000000的地址上分配一块页面空间。而处于用户态的程序要想在程序退出后仍驻留代码的部分于内存中似乎是不可能的,因为无论用户程序分配何种内存都将作为进程占用资源的一部分,一旦进程结束,所占资源将立即被释放。所以我们要做的是分配一块进程退出后仍可保持的内存。
另外,还可以通过修改系统动态连接模块(DLL)来进行驻留。Win 9X下系统DLL(如Kernel32.dll 映射至BFF70000)处于系统共享区域(2G-3G),如果在其代码段空隙中写入一小段病毒代码则可以影响其它所有进程。但Kernel32.dll 的代码段在用户态是只读的。所以,必须通过特殊手段修改其页保护属性。在Win NT/2000/XP系统里,DLL所在的页面被映射到进程的私有空间(如Kernel32.dll映射至77ED0000)中时,具有写时拷贝属性,即没有进程试图写入该页面时,所有进程将共享这个页面;而当一个进程试图写入该页面时,系统的页面错误处理代码将检查到该异常进程,并给它分配一个新页面,并拷贝原页面内容于其上,且更新进程的页表以指向新分配的页。这种共享内存的优化给病毒的写作带来了一定的麻烦,病毒不能象在Win 9X下那样仅仅修改Kernel32.dll一处代码便一劳永逸。它需要利用WriteProcessMemory,向每个进程映射Kernel32.dll的地址写入病毒代码,这样每个进程都会得到病毒体的一个副本,这被称为多进程驻留或每进程驻留(Muti-Process Residence or Per-Process Residence)。
在如今的病毒设计中,那些传统的挂钩――捆绑方法并不很受欢迎,原因在于新的操作系统里,许多函数规则是不可预知的。所谓的”黑箱“设计,使得设计人员更偏爱系统级别的线程捆绑,或更直接的接管权限控制的方法。采用最复杂的线程捆绑技术,甚至可以使杀毒软件和防火墙得不到足够的信息来区分一个程序是否合法。更高级别的抢夺权方法,甚至可以结束所有杀毒软件的进程,包括卡巴斯基所采用的受保护的内存线程技术。
普通病毒是通过将自身附加到宿主尾部(如此一来,宿主的大小就会增加),并修改程序入口点来使病毒得到击活。但现在不少病毒通过使用特殊的感染技巧,能够使宿主大小及宿主文件头上的入口点保持不变。附加了病毒代码,却使被感染文件大小不变听起来让人不可思议。其实,它利用了PE文件格式的特点:PE文件的每个节之间留有按簇大小对齐后的空洞,病毒体如果足够小,则可以将自身分成几份并分别插入到每个节最后的空隙中,这样就不必额外增加一个节,因而文件大小可以保持不变。著名的CIH病毒,正是运用这一技术的典型范例(它的大小只有1K左右)。
病毒在不修改文件头入口点的前提下,要想获得控制权并非易事:入口点不变,意味着程序是从原程序的入口代码处开始执行的,病毒必须要将原程序代码中的一处修改为导向病毒入口的跳转指令。一些查毒工具通过扫描可执行文件头部的入口点域,如果发现它指向的地方不正常,即不在代码节而在资源节或重定位节中,则有怀疑文件感染了某种病毒。而病毒界中的EPO(入口点模糊)技术,则可以很好的对付这样的扫描,同时它还是反虚拟执行的重要手段。
另外,值得一提的是现在不少病毒已经支持对压缩文件的感染。如Win32.crypto病毒就可以感染ZIP,ARJ,RAR,ACE,CAB等类型的压缩文件。这些病毒的代码中,含有对特定压缩文件类型解压并压缩的代码段,可以先把压缩文件中的内容解压出来,然后对合适的文件进行感染,最后再将感染后文件压缩回去并同时修改压缩文件头部的校验和。目前不少反病毒软件都支持扫描多种格式的压缩文件,但是对有些染毒的压缩文件无法杀除。
目前,杀毒软件在对待加壳病毒的时候,表现比较差的是瑞星。可能是瑞星的杀毒引擎对加壳的程序不灵敏,瑞星自己甚至加壳了很多病毒放到病毒库里。
三、杀毒引擎的实现
杀毒引擎目前主流有以下一些实现方式:虚拟机技术,实时监控技术,智能码标识技术,行为拦截技术。其中,后面两个为近年来出现的技术。采用智能码标识技术的目的是提高杀毒速度并且预防未知病毒,但就现实而言,除了东方卫士不成功的试验外,其余厂商并未开发完全基于该技术的引擎,Norton的开发人员认为:“没有足够的技术手段来实现这种杀毒理念。而行为拦截技术(或者别的什么智能杀毒技术)也是一种预防未知病毒的方法,与虚拟机技术相似,通过对程序行为的分析来判断其是否为病毒。
对于未知病毒的判断,实际上代表着杀毒软件厂商在引擎研究方面的最高能力。业界公认,防止未知病毒是“代表研究水平的”。业界上,对于杀毒软件防止未知病毒能力是按照如下方法衡量的:以评测当日的杀毒软件最新版本为该厂商的供测试版本,未知病毒通常由以下途径得来:
⑴、病毒作者提供。有些病毒作者在将自己的病毒发布前,也许为了炫耀技术,总爱送给一些业界的安全杂志供其评测(最佩服这种人)。
⑵、专业研究实验室。大部分业界安全杂志都有自己的研究实验室,他们的研究人员会根据最新的趋势和技术手段及工具,编写一些病毒。一般情况下,这些病毒不会泄漏到网上。
⑶、假病毒。一些类似于病毒行为的文件,程序等。测试的时候病毒库被置空(就是杀毒软件试图调用病毒库时采用程序方法向其返回一个空结果),在这种情况下进行测试。如果有人有兴趣,可以到病毒论坛上搞点新手写的小病毒(一般也就100-200行),弄上几十个拿自己的杀毒软件试一试,就会发现在平均状态下,从Norton病毒库被置空时起,对未知病毒判断能力还是挺强的。对于其他许多杀毒软件,就没有那么好远了,尤其在对付比较复杂的蠕虫病毒时,某些厂商的产品近乎全军覆没。
杀毒引擎最主要的两种技术――虚拟机和实时监控进行介绍
1、虚拟机
虚拟机,在反病毒界也被称为通用解密器,已经成为反病毒软件中最重要的组成部分之一。杀毒引擎中的虚拟机,和那些诸如VMWare的“虚拟机”是有区别的。
其实,对于虚拟机,其设计思想是有渊源可寻的。VMWare作为原操作系统下的一个应用程序,可以为运行于其上的目标操作系统创建出一部虚拟的机器,目标操作系统就象运行在单独一台真正机器上,丝毫察觉不到自己处于VMWare的控制之下。当在VMWare中按下电源键(Power On)时,窗口里出现了机器自检画面,接着是操作系统的载入,一切都和一台真正的计算机一样。至于Win XP,则是采用区域内存访问,来实现对16位程序的支持。 VM是一个完全由软件虚构出来的东西,以和真实电脑完全相同的方式来对应用程序所提出的需求进行响应。从某种角度来看,你可以将一部标准的PC的结构视为一套 API。这套API的元素包括硬件I/O系统,和以中断为基础的BIOS和MS-DOS。Win 9X常常以它自己的软件,来代理这些传统的API元素,以便能够对珍贵的硬件多重发讯。在VM上运行的应用程序认为自己独占整个机器,它们相信自己是从真正的键盘和鼠标获得输入,并从真正的屏幕上输出。稍被加一点限制,它们甚至可以认为自己完全拥有CPU和全部内存。
查毒引擎中的虚拟机,并不是像VMWare的工作原理那样,为待查的可执行程序创建一个虚拟的执行环境,提供它可能用到的一切元素,包括硬盘,端口等,让它在其上自由发挥,最后根据其行为来判定是否为病毒。(当然这是个不错的构想,但考虑到其设计难度过大,需模拟元素过多且行为分析要借助人工智能理论,因而只能作为以后发展的方向。)就目前而言,卡巴斯基在这方面做得还可以。而Mcafee的新产品中,则加入了一种缓冲区溢出保护技术,本质上其实也是一种虚拟技术。查毒引擎的虚拟机是一个软件模拟的CPU,它可以象真正CPU一样取值,译码,执行,可以模拟一段代码在真正CPU上运行得到的结果。给定一组机器码序列,虚拟机就会自动从中取出第一条指令操作码部分,判断操作码类型和寻址方式以确定该指令长度,然后在相应的函数中执行该指令,并根据执行后的结果确定下条指令的位置,如此循环反复直到某个特定情况发生以结束工作,这就是虚拟机的基本工作原理和简单流程。
设计虚拟机查毒的目的,就是为了对付加密变形病毒,虚拟机首先从文件中确定并读取病毒入口处代码,然后以上述工作步骤解释执行病毒头部的解密段(Decryptor),最后在执行完的结果(解密后的病毒体明文)中查找病毒的特征码。这里所谓的“虚拟”,并非是指创建了什么虚拟环境,而是指染毒文件并没有实际执行,只不过是虚拟机模拟了其真实执行时的效果。这就是虚拟机查毒基本原理。
早期病毒没有使用任何复杂的反检测技术,如果拿反汇编工具打开病毒体代码,看到的将是真正的机器码。因而可以由病毒体内某处一段机器代码和此处距离病毒入口(注意不是文件头)偏移值,来唯一确定一种病毒。查毒时,只需简单的确定病毒入口并在指定偏移处扫描特定代码串。这种静态扫描技术对付普通病毒是万无一失的。
随着病毒技术的发展,出现了一类加密病毒。这类病毒的特点是:其入口处具有解密子(Decryptor),而病毒主体代码被加了密。运行时首先得到控制权的解密代码将对病毒主体进行循环解密,完成后将控制交给病毒主体运行,病毒主体感染文件时会将解密子,用随机密钥加密过的病毒主体,和保存在病毒体内或嵌入解密子中的密钥一同写入被感染文件。由于同一种病毒的不同传染实例的病毒主体是用不同的密钥进行加密,因而不可能在其中找到唯一的一段代码串和偏移来代表此病毒的特征,似乎静态扫描技术对此即将失效。但是,因为不同传染实例的解密子仍保持不变机器码明文,所以如果应用特征码查毒技术,虽然有一定的误报风险(解密子中代码缺少病毒特性,同样的特征码也会出现在正常程序中),但仍不失为一种有效的方法。
由于加密病毒还没有能够完全逃脱静态特征码扫描,所以病毒写作者在加密病毒的基础之上进行改进,使解密子的代码对不同传染实例呈现出多样性,这就出现了加密变形病毒。它和加密病毒非常类似,唯一的改进在于病毒主体在感染不同文件会构造出一个功能相同但代码不同的解密子,也就是不同传染实例的解密子具有相同的解密功能但代码却截然不同。比如,原本一条指令完全可以拆成几条来完成,中间可能会被插入无用的LJ代码。这样,由于无法找到不变的特征码,静态扫描技术就彻底失效了。在这种情况下,虚拟机技术将会派上用场。
2、实时监控
实时监控,其实并非什么新技术,早在DOS时代就出现了。在Windows下要实现实时监控决非易事,因为普通用户态程序是不可能监控系统的活动的,这也是出于系统安全的考虑。病毒实时监控普遍使用了驱动编程技术,让工作于系统核心态的驱动程序去拦截所有的文件访问。当然由于工作系统的不同,驱动程序无论从结构还是工作原理都不尽相同的,当然程序写法和编译环境更是千差万别了。上面提到的病毒实时监控,实质就是对文件的监控。除了文件监控外,还有各种各样的实时监控工具,都具有各自不同的特点和功用。现在流行的网络监控,邮件监控基本上是对文件监控的改进,革命性的改动没有。
病毒实时监控,其实就是一个文件监视器。它会在文件打开,关闭,清除,写入等操作时检查文件是否是病毒携带者,如果是则根据用户的决定选择不同的处理方案,如清除病毒,禁止访问该文件,删除该文件或简单地忽略。这样就可以有效地避免病毒在本地机器上的感染传播,因为可执行文件装入器在装入一个文件执行时首先会要求打开该文件,而这个请求又一定会被实时监控在第一时间截获到,它确保了每次执行的都是干净的不带毒的文件从而不给病毒以任何执行和发作的机会。以上仅仅是病毒实时监控的主要工作过程,设计上还存在以下几个难点:
驱动程序的编写不同于普通用户态程序的写作,难度很大。编写用户态程序时,你需要的仅仅就是调用一些熟知的API函数来完成特定目的,比如打开文件你只需调用CreateFile就可以了;但在驱动程序中,你将无法使用熟悉的CreateFile。在Win NT/2000下,你可以使用ZwCreateFile 或NtCreateFile(Native API),但这些函数通常会要求运行在某个IRQL(中断请求级)上,如果你对中断请求级或延迟/异步过程调用中非分页/分页内存的概念不清楚,那么你的驱动将很容易导致蓝屏死机。Ring0下的异常,将往往导致系统崩溃,因为它对于系统总是被信任的,所以没有相应处理代码去捕获这个异常。在Win NT下对KeBugCheckEx的调用将导致蓝屏的出现,接着系统将进行转储并随后重启。另外驱动程序的调试不如用户态程序那样方便,用象VC ++那样的调试器是不行的,你必须使用系统级调试器,如SoftIce,KD,TRW等。
现今国内主要杀毒技术:
特征码技术:运用程序中某一段或几段64字节以下的代码作为判别程序病毒的主要依据,几乎所有国内杀毒软件都在用。
复合特征码技术:下面给图, 因为本人艺术细胞原因 所以点到为止,abcd 所有都在的情况下, 木马可以被杀到,不管有几个a 或者几个b。
虚拟机技术:卡巴运用的技术,它表现在穿壳能力的强大
行为查杀技术:根据某些病毒会在计算机里面的行为作为依据(如在注册表内增加什么键值),满足三个以上就视为木马或病毒。
启发式杀毒技术:运用病毒特有的结构,来检测病毒(如nod32)。
国内外部分杀毒软件的特点:
金山:超级垃圾的杀毒软件,花哨东西多得要死,实际杀毒功能却属于世界数一数二地弱,如果不想中木马,你最好别装。它甚至连木马也杀不清。
江民或KV:跟金山差不多,稍微比它好点,但是也比较垃圾,它的技术都是买来经过二次改造,没什么特色。
瑞星:个人认为是国内是国内出的最强地杀毒,经过分析,它有三套毒库。
瑞星的内存杀毒我们也搞不清楚内核机制,所以分析的只是现象:
1、普通的木马病毒(不常见的),瑞星不进行内存特征码定义,文件免杀了内存就免杀了
2、瑞星的右键快捷查杀和运行主程序查杀,效果不一样,右键不杀不代表运行主程序不杀,有些内存杀的木马病毒,修改了运行主程序查杀的特征码,内存就免杀了。网络泛滥的木马病毒(如鸽子,密码神通,广外幽灵等),瑞星进行内存特征码定义,通常是多区段特征码定义,其中有些用免杀壳加密加花后,OD载入不杀,但运行后被杀。这样看来感觉瑞星象是3套特征码定义,1是右键查杀,2是主程序运行查杀,3是内存查杀,我是这样分类的
针对上述现象,瑞星内存免杀我们通常这样做,OD分段定位,先NOP入口点区段,仍被杀则NOP其他区段,直到不杀,找出内存特征码进行修改。(A B C代表的是病毒特征码,括号()表示可能不存在。)
关于OD加载入内存不杀,运行后被内存查杀的问题:
OD加载的和真正的运行有区别,一些加壳的东西加了木马OD载入不杀内存,真正运行了就被杀,说明真正运行了内存中会还原某些代码,所以遇到加壳OD不杀,运行被杀的情况,平时我们遇到的木马,未加密加壳前在OD中是可以被杀和定位内存特征码的至于一种情况,如果木马未做任何处理的时候,就是一个原始木马,拿来OD载入不杀内存,运行了就杀,这种情况我没遇到过,如果你遇到了无壳的出现这种情况,基本上就是被一个内存免杀技术不过关的人修改过的,碰巧被你用了
如果你在免杀过程中遇到了OD载入不杀,运行内存被杀的情况,请尝试修改特征码,而不是给它加花或加密,正确修改了内存特征码是可以完全内存免杀的,瑞星不是用来实时监控,是用来手动查杀内存用的。
诺顿:它查杀的是PE文件头,就是那一串代码,有一个加壳程序可以把它打乱,高技术的甚至可以把它整个移走以免杀。
卡巴斯基:国内外数一数二的杀毒软件,曾获世界第一的称号。它的优点就是穿壳能力墙(虚拟机技术),弱点是一见花指令就怕。免杀它一般是加花指令。
NOD32:启发式杀毒技术,不再是单纯的特征码技术,就是运用一些木马程序特有的结构来判别是否木马,但是缺点是解密能力差,免杀它通常加一个壳再加一个花。
Ewido:一款非常不错的杀木马软件,它的内存查杀和瑞星一样变态,而且穿花能力强,比起国内木马克星来说它不知道好多少倍。而且他加入了注册表查杀,免杀它要先过内存再加强壳
运用软件进行端口及进程防御
冰刃:用于查看隐藏端口,进程,服务等,是一个非常好的安全工具。
端口关联查看器:看端口工具。
木马辅助查找器:灰鸽子工作室出品,用于监视文件。
Regmon注册表监视器:用来监视注册表。
Filemon文件监视器:用来查看文件调用的所有DLL。
其实杀毒软件是如何工作的并不重要,重要的是我们需要TA的存在,无规则不成方圆,但又规则并不一定就是好的,至少对于操作系统来说,杀毒软件就是最大的病毒程序,但这只是相对而言。
{else}杀毒软件是如何工作的?在面对病毒程序的活动进行一个判定的时候,杀毒软件需要检测当前活动的程序行为是否合法,做了什么,或者想做什么,对计算机出现的状况进行一个预估,以确定该病毒的存在,想知道更多,可以阅读下文中的深度解析。
杀毒软件是如何工作的?
一、杀毒软件引擎与病毒库的关系
首先必须指出杀毒软件的引擎与其病毒库并没有什么直接的关系。杀毒引擎的任务和功能非常简单,就是对于给定的文件或者程序进程判断其是否是合法程序(对应于杀毒软件厂商自己定义的正常和非异常程序规范而言。正常的程序规范是指在程序所在系统平台上操所系统本身洗净有定义的或者业界已经公认的程序行为过程,比如操作系统正常运行就必须要求应用程序与系统核心进行进程响应并与交换相关数据。非异常程序活动是指可能存在非法程序操作结果但能够以较高的置信度确定其非非法程序活动规范的。一般情况下,相关文件的复制,移动,删除等都奔包括在该界定范围内)。
我们知道病毒的最终目的有些是与合法活动很类似的,在这种情况下,要求软件厂商必须自己有一个行为规范界定规则,在一个给定的范围和置信度下,判断相关操作是否为合法。在这方面,各个厂商的界定是有区别的,一般而言非美国厂商界定是非常严格的,只有有很高的置信水平的程序行为,他们才判别为非病毒操作。记得前一阵论坛上有人给了四段简单的代码,很多杀毒软件将其判为病毒或有病毒性质的文件行为,实际上看那几段代码可以知道,其结果并不足以视之为病毒。美国厂商一般判断比较复杂,这主要由于美国市场上的杀毒软件引擎来源比较复杂,比如Norton,有足够的技术资料确信它的杀毒软件引擎是自成体系的,而Mcafee则存在一定的外界技术引进(收购所罗门)。
用简单的话说,杀毒引擎就是一套判断特定程序行为是否为病毒程序(包括可疑的)的技术机制。一个完整的技术引擎应遵守如下的行为过程:
⑴、非自身程序行为的程序行为捕获。包括来自于内存的程序运行,来自于给定文件的行为虚拟判断,来自于网络的动态的信息等等。一般情况下,我们称之为引擎前端。捕捉的方法非常多,除Norton以外的杀毒软件采用的都是行为规范代码化的方法。Norton由于与微软有远远高于其它厂商合作关系,其实现过程比较独特,另有叙述。
⑵、基于引擎机制的规则判断。这个环节代表了杀毒引擎的质量水平,一个好的杀毒引擎应该能在这个环节发现很多或者称之为相当规模的病毒行为,存而避免进入下一个判断环节。传统的反病毒软件引擎使用的是基于特征码的静态扫描技术,即在文件中寻找特定的十六进制字符串,如果找到,就可判定文件感染了某种病毒。但这种方法在当今病毒技术迅猛发展的形势下已经起不到很好的作用了。为了更好的发现病毒,相继开发了所谓的虚拟机,实时监控等相关技术。这个环节被叫做杀毒软件引擎工作的核心层。
⑶、引擎与病毒库的交互作用。这个过程往往被认为是收尾阶段,相对于前两个环节,这个阶段速度是非常慢的,杀毒引擎与要将非自身程序行为过程转化为杀毒软件自身可识别的行为标识符(包括静态代码等),然后与病毒库中所存贮的行为信息进行对应,并作出相应处理。当然必须承认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒软件引擎的不足之处。但是必须意识到,如果在核心层阶段就可以结束并清除病毒程序,那么杀毒软件的工作速度将会大幅提升。“很可惜的是,当前我们没有足够聪明的杀毒引擎来完成这个过程”,这就是为什么有病毒库的原因。
Norton是微软最高级的安全方面核心合作厂商,因此它的杀毒软件在某些方面工作比较特殊。比如在杀毒软件的安装,使用和功能实现方面,大部分厂商采用的是中间件技术,在系统底层与非自身应用程序之间作为中间件存在并实现其功能;另有一些厂商使用的是应用程序或者嵌入技术,相对而言这种方法安全性较低;Norton和Mcafee实现方式比较相似,Norton采用了基于系统最底层的系统核心驱动,这种实现方式是最安全的或者说最高级的实现方式,当然这需要微软的系统源代码级的支持(要花许多money),业界公认,这是最稳定的实现方法,但从目前而言,只Norton一家。Mcafee实现方式与Norton很接近,一般称之为软件驱动。相当于在系统中存在一个虚拟“硬件”,来实现杀毒软件功能。这些实现方式关系着杀毒引擎对程序行为进行捕捉的方式。
我们使用的Intel系列处理器有两个 Ring层,对应两个层,微软的操作系统将系统中的所有行为分为如下几个层:
⑴、最底层:系统核心层,这个层的所有行为都由操作系统已经内置的指令来实现,所有外界因素(即使你是系统管理员)均不能影响该层的行为。Norton的核心层既工作在这个层上。
⑵、硬件虚拟层(HAL)。为了实现硬件无关性,微软设计了该层。所有的外部工作硬件(相对于系统核心而言)都进入HAL,并被HAL处理为核心层可以相应的指令。我们所使用的硬件的驱动程序既工作在该层上。当外界硬件存在指令请求时,驱动程序作出相关处理后传给核心层。如果无与之对应的驱动相应,那么将按照默认硬件进行处理。好像安全模式下硬件的工作就被置于默认硬件模式。Mcafee的杀毒软件,就被认为工作在HAL层上。
⑶、用户层。我们所知的大部分杀毒软件既工作与该层上。一个完整的程序行为请求是如下流程:位于3户层上的应用程序产生指令行为请求,被传递至2HAL进行处理,最后进入1最底层后进入CPU的指令处理循环,然后反向将软件可识别的处理结果经1-2-3再响应给应用程序。对于Norton而言,其整个工作过程如下:3-2-1,完成;Mcafee:3-2-1-1-2,完成:其余:3-2-1-1-2-3,完成;这个环节代表了杀毒软件引擎的前端行为规范的获得。只从这个过程而言,Norton和Mcafee是比较先进的。具体到系统与CPU的Ring()的对应,Win NT时代,微软的NT系统被设计成与四个Ring()层相对应,RISC系列的处理器有四个Ring。因此现在的大部分杀毒软件是不能工作在NT上的。具体来说,CISC有四个Ring(),RISC有两个Ring()。
尽管比较先进的工作方式给Norton和Mcafee带来了较高的系统稳定性(HAL层很少出现问题,最底层出问题的几率接近于零),较快的响应速度(减少了环节),但同时也带来了一些问题:1.资源占用比较厉害。在Mcafee上体现的不是很明显,在Norton上表现非常明显。因为对于越底层的行为,硬件资源分配越多。最好资源的是什么?当然是操作系统。应为它最最底层。2.卸载问题。卸载底层的组件出问题的概率是相对比较高的,因此Norton的卸载比较慢,偶尔还容易出问题。
因此,有人质疑微软Windows操作系统的不稳定性,是否会拖累Norton?实际上,Windows的内核层设计是非常优秀的,很多时候,操作系统的不稳定性来源于以下几个方面:
⑴、应用程序设计不合理,许多程序设计者根本就未读过微软的32位程序设计指南,所设计的程序并不严格符合微软规范。我们看到,大量多年前设计的软件还能运行于最新的Win XP平台,原因很简单:这个软件在设计时完全遵循了微软的程序设计规范。
⑵、驱动程序的编写有问题,与HAL层有冲突。
因此,片面地认为微软的操作系统将会影响Norton的稳定性是不合理的。
业界有人认为,先进杀毒软件的引擎设计已经日趋复杂,类如Norton这一类的厂商其产品的引擎应该已经覆盖了操作系统的各个层级,以提高防护能力。在一篇文档中有程序员提出有足够的信息认为Norton,Mcafee,趋势的产品自己修改了标准的系统相关协议,比如TCP/IP等,以达到所谓的完整防护的目的。NOD32的一篇官方文档,就指出,反病毒厂商有必要全面更新系统的诸多协议,以达到最快的速度和杀毒效果。
二、病毒技术浅析
要讨论怎样反病毒,就必须从病毒技术本身的讨论开始。正是所谓“知己知彼,百战不殆”。很难想象一个毫无病毒写作经验的人会成为杀毒高手。目前国内一些著名反病毒软件公司的研发队伍中不乏病毒写作高手。只不过他们将同样的技术用到了正道上,以毒攻毒。当今的病毒与DOS和Win 3.x时代下的从技术角度上看有很多不同。最大的转变是:引导区病毒减少了,而脚本型病毒开始泛滥。原因是在当今的操作系统下直接改写磁盘的引导区会有一定的难度(DOS则没有保护,允许调用INT13直接写盘),而且引导区的改动很容易被发现,并且微软在设计操作系统时加强了对引导区的程序行为管理,写一个完美的引导区病毒难度很大,所以很少有人再写了;而脚本病毒以其传播效率高且容易编写而深得病毒作者的青睐。但是最最落后的杀毒引擎也就是只基于静态代码的杀毒引擎都能干掉该种病毒(病毒库搞好就行)。
要讨论的技术主要来自于二进制外壳型病毒(感染文件的病毒),并且这些技术大都和操作系统底层机制或386以上CPU的保护模式相关,值得研究。DOS下的外壳型病毒主要感染 16位的COM或EXE文件,由于DOS没有(文件和引导区)保护,它们能够轻松地进行驻留,减少可用内存(通过修改MCB链),修改系统代码,拦截系统服务或中断。而到了WIN9X和WINNT/2000时代,搞个运行其上的32位Windows病毒变得难了点。由于存在页面保护,你不可能修改系统的代码页(如果你强到连操作系统代码都能改,偶无话可说)。由于I/O许可位图中的规定,你也不能进行直接端口访问。在Windows中,你不可能像在 DOS里那样通过截获INT21H来拦截所有文件操作。总之,当你以一个用户态权限运行,你的行为就会受到操作系统严格的控制(在Win XP中,这种权限管理极为严格,分成了好几个等级)。Windows下采用的可执行文件格式和DOS下的EXE文件截然不同(普通程序采用PE,驱动程序采用LE格式),所以病毒的感染文件的难度增大了(PE和LE比较复杂,中间分了若干个节,如果感染错了,将导致文件不能继续执行)。当今病毒的新技术太多,随便介绍几个。
1、系统核心病毒
386及以上的X86 CPU实现了4个特权级模式(Windows只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码,不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多限制,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,像在DOS这种实模式操作系统里,则没有这些概念,其中的所有代码都可被看作运行在核心态。既然运行在核心态有如此之多的优势,那么病毒当然没有理由不想得到Ring0。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。现代操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令完成模式切换。在X86处理器上,这条指令是INT;在Win 9X下是INT30(保护模式回调);在Linux下则是INT80;在Win NT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求,并将结果传给用户程序。
在最新发布的Win XP SP2中,采用了“数据执行保护”(DEP)技术。这是一种基于处理器支持的内存页面保护技术,它将更为严格地控制用户访问的权限,它禁止在标记为数据存储的内存区域中执行代码。当某些程序或病毒尝试运行标记的数据页中的代码时,就会立即发生异常并禁止执行代码。这可以防止攻击者使用代码致使数据缓冲区溢出,然后执行该代码。
2、驻留病毒
驻留病毒是指那些在内存中寻找合适的页面并将病毒自身拷贝到其中且在系统运行期间能够始终保持病毒代码的存在。驻留病毒比那些直接感染(Direct-Action)型病毒更具隐蔽性,它通常要截获某些系统操作来达到感染传播的目的。进入核心态的病毒,可以利用系统服务来达到此目的。如CIH病毒,就通过调用一个由VMM导出的服务VMMCALL _PageAllocate在大于0XC0000000的地址上分配一块页面空间。而处于用户态的程序要想在程序退出后仍驻留代码的部分于内存中似乎是不可能的,因为无论用户程序分配何种内存都将作为进程占用资源的一部分,一旦进程结束,所占资源将立即被释放。所以我们要做的是分配一块进程退出后仍可保持的内存。
另外,还可以通过修改系统动态连接模块(DLL)来进行驻留。Win 9X下系统DLL(如Kernel32.dll 映射至BFF70000)处于系统共享区域(2G-3G),如果在其代码段空隙中写入一小段病毒代码则可以影响其它所有进程。但Kernel32.dll 的代码段在用户态是只读的。所以,必须通过特殊手段修改其页保护属性。在Win NT/2000/XP系统里,DLL所在的页面被映射到进程的私有空间(如Kernel32.dll映射至77ED0000)中时,具有写时拷贝属性,即没有进程试图写入该页面时,所有进程将共享这个页面;而当一个进程试图写入该页面时,系统的页面错误处理代码将检查到该异常进程,并给它分配一个新页面,并拷贝原页面内容于其上,且更新进程的页表以指向新分配的页。这种共享内存的优化给病毒的写作带来了一定的麻烦,病毒不能象在Win 9X下那样仅仅修改Kernel32.dll一处代码便一劳永逸。它需要利用WriteProcessMemory,向每个进程映射Kernel32.dll的地址写入病毒代码,这样每个进程都会得到病毒体的一个副本,这被称为多进程驻留或每进程驻留(Muti-Process Residence or Per-Process Residence)。
在如今的病毒设计中,那些传统的挂钩――捆绑方法并不很受欢迎,原因在于新的操作系统里,许多函数规则是不可预知的。所谓的”黑箱“设计,使得设计人员更偏爱系统级别的线程捆绑,或更直接的接管权限控制的方法。采用最复杂的线程捆绑技术,甚至可以使杀毒软件和防火墙得不到足够的信息来区分一个程序是否合法。更高级别的抢夺权方法,甚至可以结束所有杀毒软件的进程,包括卡巴斯基所采用的受保护的内存线程技术。
普通病毒是通过将自身附加到宿主尾部(如此一来,宿主的大小就会增加),并修改程序入口点来使病毒得到击活。但现在不少病毒通过使用特殊的感染技巧,能够使宿主大小及宿主文件头上的入口点保持不变。附加了病毒代码,却使被感染文件大小不变听起来让人不可思议。其实,它利用了PE文件格式的特点:PE文件的每个节之间留有按簇大小对齐后的空洞,病毒体如果足够小,则可以将自身分成几份并分别插入到每个节最后的空隙中,这样就不必额外增加一个节,因而文件大小可以保持不变。著名的CIH病毒,正是运用这一技术的典型范例(它的大小只有1K左右)。
病毒在不修改文件头入口点的前提下,要想获得控制权并非易事:入口点不变,意味着程序是从原程序的入口代码处开始执行的,病毒必须要将原程序代码中的一处修改为导向病毒入口的跳转指令。一些查毒工具通过扫描可执行文件头部的入口点域,如果发现它指向的地方不正常,即不在代码节而在资源节或重定位节中,则有怀疑文件感染了某种病毒。而病毒界中的EPO(入口点模糊)技术,则可以很好的对付这样的扫描,同时它还是反虚拟执行的重要手段。
另外,值得一提的是现在不少病毒已经支持对压缩文件的感染。如Win32.crypto病毒就可以感染ZIP,ARJ,RAR,ACE,CAB等类型的压缩文件。这些病毒的代码中,含有对特定压缩文件类型解压并压缩的代码段,可以先把压缩文件中的内容解压出来,然后对合适的文件进行感染,最后再将感染后文件压缩回去并同时修改压缩文件头部的校验和。目前不少反病毒软件都支持扫描多种格式的压缩文件,但是对有些染毒的压缩文件无法杀除。
目前,杀毒软件在对待加壳病毒的时候,表现比较差的是瑞星。可能是瑞星的杀毒引擎对加壳的程序不灵敏,瑞星自己甚至加壳了很多病毒放到病毒库里。
三、杀毒引擎的实现
杀毒引擎目前主流有以下一些实现方式:虚拟机技术,实时监控技术,智能码标识技术,行为拦截技术。其中,后面两个为近年来出现的技术。采用智能码标识技术的目的是提高杀毒速度并且预防未知病毒,但就现实而言,除了东方卫士不成功的试验外,其余厂商并未开发完全基于该技术的引擎,Norton的开发人员认为:“没有足够的技术手段来实现这种杀毒理念。而行为拦截技术(或者别的什么智能杀毒技术)也是一种预防未知病毒的方法,与虚拟机技术相似,通过对程序行为的分析来判断其是否为病毒。
对于未知病毒的判断,实际上代表着杀毒软件厂商在引擎研究方面的最高能力。业界公认,防止未知病毒是“代表研究水平的”。业界上,对于杀毒软件防止未知病毒能力是按照如下方法衡量的:以评测当日的杀毒软件最新版本为该厂商的供测试版本,未知病毒通常由以下途径得来:
⑴、病毒作者提供。有些病毒作者在将自己的病毒发布前,也许为了炫耀技术,总爱送给一些业界的安全杂志供其评测(最佩服这种人)。
⑵、专业研究实验室。大部分业界安全杂志都有自己的研究实验室,他们的研究人员会根据最新的趋势和技术手段及工具,编写一些病毒。一般情况下,这些病毒不会泄漏到网上。
⑶、假病毒。一些类似于病毒行为的文件,程序等。测试的时候病毒库被置空(就是杀毒软件试图调用病毒库时采用程序方法向其返回一个空结果),在这种情况下进行测试。如果有人有兴趣,可以到病毒论坛上搞点新手写的小病毒(一般也就100-200行),弄上几十个拿自己的杀毒软件试一试,就会发现在平均状态下,从Norton病毒库被置空时起,对未知病毒判断能力还是挺强的。对于其他许多杀毒软件,就没有那么好远了,尤其在对付比较复杂的蠕虫病毒时,某些厂商的产品近乎全军覆没。
杀毒引擎最主要的两种技术――虚拟机和实时监控进行介绍
1、虚拟机
虚拟机,在反病毒界也被称为通用解密器,已经成为反病毒软件中最重要的组成部分之一。杀毒引擎中的虚拟机,和那些诸如VMWare的“虚拟机”是有区别的。
其实,对于虚拟机,其设计思想是有渊源可寻的。VMWare作为原操作系统下的一个应用程序,可以为运行于其上的目标操作系统创建出一部虚拟的机器,目标操作系统就象运行在单独一台真正机器上,丝毫察觉不到自己处于VMWare的控制之下。当在VMWare中按下电源键(Power On)时,窗口里出现了机器自检画面,接着是操作系统的载入,一切都和一台真正的计算机一样。至于Win XP,则是采用区域内存访问,来实现对16位程序的支持。 VM是一个完全由软件虚构出来的东西,以和真实电脑完全相同的方式来对应用程序所提出的需求进行响应。从某种角度来看,你可以将一部标准的PC的结构视为一套 API。这套API的元素包括硬件I/O系统,和以中断为基础的BIOS和MS-DOS。Win 9X常常以它自己的软件,来代理这些传统的API元素,以便能够对珍贵的硬件多重发讯。在VM上运行的应用程序认为自己独占整个机器,它们相信自己是从真正的键盘和鼠标获得输入,并从真正的屏幕上输出。稍被加一点限制,它们甚至可以认为自己完全拥有CPU和全部内存。
查毒引擎中的虚拟机,并不是像VMWare的工作原理那样,为待查的可执行程序创建一个虚拟的执行环境,提供它可能用到的一切元素,包括硬盘,端口等,让它在其上自由发挥,最后根据其行为来判定是否为病毒。(当然这是个不错的构想,但考虑到其设计难度过大,需模拟元素过多且行为分析要借助人工智能理论,因而只能作为以后发展的方向。)就目前而言,卡巴斯基在这方面做得还可以。而Mcafee的新产品中,则加入了一种缓冲区溢出保护技术,本质上其实也是一种虚拟技术。查毒引擎的虚拟机是一个软件模拟的CPU,它可以象真正CPU一样取值,译码,执行,可以模拟一段代码在真正CPU上运行得到的结果。给定一组机器码序列,虚拟机就会自动从中取出第一条指令操作码部分,判断操作码类型和寻址方式以确定该指令长度,然后在相应的函数中执行该指令,并根据执行后的结果确定下条指令的位置,如此循环反复直到某个特定情况发生以结束工作,这就是虚拟机的基本工作原理和简单流程。
设计虚拟机查毒的目的,就是为了对付加密变形病毒,虚拟机首先从文件中确定并读取病毒入口处代码,然后以上述工作步骤解释执行病毒头部的解密段(Decryptor),最后在执行完的结果(解密后的病毒体明文)中查找病毒的特征码。这里所谓的“虚拟”,并非是指创建了什么虚拟环境,而是指染毒文件并没有实际执行,只不过是虚拟机模拟了其真实执行时的效果。这就是虚拟机查毒基本原理。
早期病毒没有使用任何复杂的反检测技术,如果拿反汇编工具打开病毒体代码,看到的将是真正的机器码。因而可以由病毒体内某处一段机器代码和此处距离病毒入口(注意不是文件头)偏移值,来唯一确定一种病毒。查毒时,只需简单的确定病毒入口并在指定偏移处扫描特定代码串。这种静态扫描技术对付普通病毒是万无一失的。
随着病毒技术的发展,出现了一类加密病毒。这类病毒的特点是:其入口处具有解密子(Decryptor),而病毒主体代码被加了密。运行时首先得到控制权的解密代码将对病毒主体进行循环解密,完成后将控制交给病毒主体运行,病毒主体感染文件时会将解密子,用随机密钥加密过的病毒主体,和保存在病毒体内或嵌入解密子中的密钥一同写入被感染文件。由于同一种病毒的不同传染实例的病毒主体是用不同的密钥进行加密,因而不可能在其中找到唯一的一段代码串和偏移来代表此病毒的特征,似乎静态扫描技术对此即将失效。但是,因为不同传染实例的解密子仍保持不变机器码明文,所以如果应用特征码查毒技术,虽然有一定的误报风险(解密子中代码缺少病毒特性,同样的特征码也会出现在正常程序中),但仍不失为一种有效的方法。
由于加密病毒还没有能够完全逃脱静态特征码扫描,所以病毒写作者在加密病毒的基础之上进行改进,使解密子的代码对不同传染实例呈现出多样性,这就出现了加密变形病毒。它和加密病毒非常类似,唯一的改进在于病毒主体在感染不同文件会构造出一个功能相同但代码不同的解密子,也就是不同传染实例的解密子具有相同的解密功能但代码却截然不同。比如,原本一条指令完全可以拆成几条来完成,中间可能会被插入无用的LJ代码。这样,由于无法找到不变的特征码,静态扫描技术就彻底失效了。在这种情况下,虚拟机技术将会派上用场。
2、实时监控
实时监控,其实并非什么新技术,早在DOS时代就出现了。在Windows下要实现实时监控决非易事,因为普通用户态程序是不可能监控系统的活动的,这也是出于系统安全的考虑。病毒实时监控普遍使用了驱动编程技术,让工作于系统核心态的驱动程序去拦截所有的文件访问。当然由于工作系统的不同,驱动程序无论从结构还是工作原理都不尽相同的,当然程序写法和编译环境更是千差万别了。上面提到的病毒实时监控,实质就是对文件的监控。除了文件监控外,还有各种各样的实时监控工具,都具有各自不同的特点和功用。现在流行的网络监控,邮件监控基本上是对文件监控的改进,革命性的改动没有。
病毒实时监控,其实就是一个文件监视器。它会在文件打开,关闭,清除,写入等操作时检查文件是否是病毒携带者,如果是则根据用户的决定选择不同的处理方案,如清除病毒,禁止访问该文件,删除该文件或简单地忽略。这样就可以有效地避免病毒在本地机器上的感染传播,因为可执行文件装入器在装入一个文件执行时首先会要求打开该文件,而这个请求又一定会被实时监控在第一时间截获到,它确保了每次执行的都是干净的不带毒的文件从而不给病毒以任何执行和发作的机会。以上仅仅是病毒实时监控的主要工作过程,设计上还存在以下几个难点:
驱动程序的编写不同于普通用户态程序的写作,难度很大。编写用户态程序时,你需要的仅仅就是调用一些熟知的API函数来完成特定目的,比如打开文件你只需调用CreateFile就可以了;但在驱动程序中,你将无法使用熟悉的CreateFile。在Win NT/2000下,你可以使用ZwCreateFile 或NtCreateFile(Native API),但这些函数通常会要求运行在某个IRQL(中断请求级)上,如果你对中断请求级或延迟/异步过程调用中非分页/分页内存的概念不清楚,那么你的驱动将很容易导致蓝屏死机。Ring0下的异常,将往往导致系统崩溃,因为它对于系统总是被信任的,所以没有相应处理代码去捕获这个异常。在Win NT下对KeBugCheckEx的调用将导致蓝屏的出现,接着系统将进行转储并随后重启。另外驱动程序的调试不如用户态程序那样方便,用象VC ++那样的调试器是不行的,你必须使用系统级调试器,如SoftIce,KD,TRW等。
现今国内主要杀毒技术:
特征码技术:运用程序中某一段或几段64字节以下的代码作为判别程序病毒的主要依据,几乎所有国内杀毒软件都在用。
复合特征码技术:下面给图, 因为本人艺术细胞原因 所以点到为止,abcd 所有都在的情况下, 木马可以被杀到,不管有几个a 或者几个b。
虚拟机技术:卡巴运用的技术,它表现在穿壳能力的强大
行为查杀技术:根据某些病毒会在计算机里面的行为作为依据(如在注册表内增加什么键值),满足三个以上就视为木马或病毒。
启发式杀毒技术:运用病毒特有的结构,来检测病毒(如nod32)。
国内外部分杀毒软件的特点:
金山:超级垃圾的杀毒软件,花哨东西多得要死,实际杀毒功能却属于世界数一数二地弱,如果不想中木马,你最好别装。它甚至连木马也杀不清。
江民或KV:跟金山差不多,稍微比它好点,但是也比较垃圾,它的技术都是买来经过二次改造,没什么特色。
瑞星:个人认为是国内是国内出的最强地杀毒,经过分析,它有三套毒库。
瑞星的内存杀毒我们也搞不清楚内核机制,所以分析的只是现象:
1、普通的木马病毒(不常见的),瑞星不进行内存特征码定义,文件免杀了内存就免杀了
2、瑞星的右键快捷查杀和运行主程序查杀,效果不一样,右键不杀不代表运行主程序不杀,有些内存杀的木马病毒,修改了运行主程序查杀的特征码,内存就免杀了。网络泛滥的木马病毒(如鸽子,密码神通,广外幽灵等),瑞星进行内存特征码定义,通常是多区段特征码定义,其中有些用免杀壳加密加花后,OD载入不杀,但运行后被杀。这样看来感觉瑞星象是3套特征码定义,1是右键查杀,2是主程序运行查杀,3是内存查杀,我是这样分类的
针对上述现象,瑞星内存免杀我们通常这样做,OD分段定位,先NOP入口点区段,仍被杀则NOP其他区段,直到不杀,找出内存特征码进行修改。(A B C代表的是病毒特征码,括号()表示可能不存在。)
关于OD加载入内存不杀,运行后被内存查杀的问题:
OD加载的和真正的运行有区别,一些加壳的东西加了木马OD载入不杀内存,真正运行了就被杀,说明真正运行了内存中会还原某些代码,所以遇到加壳OD不杀,运行被杀的情况,平时我们遇到的木马,未加密加壳前在OD中是可以被杀和定位内存特征码的至于一种情况,如果木马未做任何处理的时候,就是一个原始木马,拿来OD载入不杀内存,运行了就杀,这种情况我没遇到过,如果你遇到了无壳的出现这种情况,基本上就是被一个内存免杀技术不过关的人修改过的,碰巧被你用了
如果你在免杀过程中遇到了OD载入不杀,运行内存被杀的情况,请尝试修改特征码,而不是给它加花或加密,正确修改了内存特征码是可以完全内存免杀的,瑞星不是用来实时监控,是用来手动查杀内存用的。
诺顿:它查杀的是PE文件头,就是那一串代码,有一个加壳程序可以把它打乱,高技术的甚至可以把它整个移走以免杀。
卡巴斯基:国内外数一数二的杀毒软件,曾获世界第一的称号。它的优点就是穿壳能力墙(虚拟机技术),弱点是一见花指令就怕。免杀它一般是加花指令。
NOD32:启发式杀毒技术,不再是单纯的特征码技术,就是运用一些木马程序特有的结构来判别是否木马,但是缺点是解密能力差,免杀它通常加一个壳再加一个花。
Ewido:一款非常不错的杀木马软件,它的内存查杀和瑞星一样变态,而且穿花能力强,比起国内木马克星来说它不知道好多少倍。而且他加入了注册表查杀,免杀它要先过内存再加强壳
运用软件进行端口及进程防御
冰刃:用于查看隐藏端口,进程,服务等,是一个非常好的安全工具。
端口关联查看器:看端口工具。
木马辅助查找器:灰鸽子工作室出品,用于监视文件。
Regmon注册表监视器:用来监视注册表。
Filemon文件监视器:用来查看文件调用的所有DLL。
其实杀毒软件是如何工作的并不重要,重要的是我们需要TA的存在,无规则不成方圆,但又规则并不一定就是好的,至少对于操作系统来说,杀毒软件就是最大的病毒程序,但这只是相对而言。
显示全部