多态,混淆和加密
凡是带有攻击意图而编写,可能对用户电脑造成危害的程序,我们将之统称为恶意程序,而这其中我们常见的就是病毒、蠕虫、木马,或者其他间谍软件之类。不管这些恶意程序的编制者们是出于牟利或者进行破坏的目的,恶意程序要想发挥作用首先必须保证自己的存在,而恶意程序往往会采取种种方式来达到这一目的,这些方式也就是恶意程序的自我保护技术。
最好的方式首先自然是能够避免被发现,恶意程序掩藏自己的行踪,尽量避免对用户造成影响而使之查觉不到;它还得通过种种手段避开反病毒软件的检测,比如病毒作者总是力图去寻找并利用一个新的漏洞,这些都是比较隐蔽的自我保护方式;如果被反病毒软件检测到,那它也会力图使自己不那么容易被清除掉,如今的病毒总是越来越顽固;而近来一些如以如AV终结者为代表的病毒,则更激进一些,首先就直接攻击反病毒软件而使之失去防护功效。
大体来说,恶意程序的自保护机制要实现的是以下一种或多种功能,包括:
1.干扰基于病毒库检测手段对病毒的检测
2.干扰病毒分析员对代码的分析
3.干扰对系统中恶意程序的检测
4.干扰安全软件如反病毒程序和防火墙的功能
为了达到以上自我保护的功能,恶意程序采取了种种不同的技术,比如如今正流行的就是加壳、Rootkit等,以下我们就对恶意软件的自我保护技术的发展来进行一个简单的阐述。
源起:多态(polymorphism),混淆(obfuscation)和加密(encryption)
早期的反病毒软件技术基本上是基于特征码检测的,要避开反病毒软件的检测只需使得恶意程序的特征码更难被提取即可,因而这时的恶意程序编制者们采用多态(polymorphism),混淆(obfuscation)或加密(encryption)这几种技术来避免被反病毒软件检测到,并且也使病毒分析员在分析病毒代码时更有难度。
恶意程序的历史起源于1970年代,但是恶意程序的自保护的历史直到1980年代晚期才开始。第一个存在的自我保护的病毒是DOS病毒Cascade(Virus.DOS.Cascade),它通过加密其部分代码试图防止自己被反病毒程序检测。然而这并不是很成功,因为虽然其病毒的每个新拷贝都互不相同,但仍然包含不变的小段代码,这暴露了它的行踪,结果使得反病毒程序仍然能够检测到它。虽然如此,病毒作者改变了方向,两年内出现了第一个多态病毒:Chameleon(Virus.DOS.Chameleon)。Chameleon,和1260以及其同时代的Whale一样有名,使用了复杂的加密和混淆方式来保护其代码。两年后,我们见证了所谓的多态生成器的出现,它可以被恶意程序利用——以游离于安全措施的控制之外。
为什么修改代码可以被用作干扰文件检测,文件检测是如何工作的,在这里需要对它们做出解释。
直到最近,反病毒程序才通过分析文件代码进行独占性的工作。早期的基于病毒库的检测手段专注于寻找精确的比特序列,通常是恶意程序二进制文件头文件固定的偏移量。后来的启发式检测手段也使用文件代码,只是更为灵活,基本上就是搜寻通用的恶意代码序列。显然,如果恶意程序每个拷贝包含新的代码序列,那么对它们来说对付这些检测并不难。
这种工作通过程序的多态和变形技术来实现,抛开其技术细节,其本质就是恶意程序在复制其拷贝时,通过使其自身在比特级别变化来实现,同时,程序的功能仍然保持不变。加密和混淆是用来干扰代码分析员的最初手段,但是当它们以某种方式实现时,其结果可能是多态的变型——这有个例子就是Cascade,其每个拷贝都用唯一的密钥加密。混淆可以干扰分析员,但是当其以不同方式用于恶意程序的每个拷贝时,它能干扰基于病毒库的检测手段。然而,不能说上述任何一个手段比其他一个自保护手段更有效。更正确的说法是,这些手段的效率取决于特定的环境和这些技术如何被使用。
相对而言,多态的使用仅仅在DOS文件病毒中广泛流行。这是有原因的,因为写多态代码是非常费时间的工作,仅仅适用于恶意程序自我复制的情况:每个新拷贝包括多少有些不同的序列。同时代主流的木马并没有自我复制的能力,因此它们与多态不相干。这就是为什么自从DOS时代病毒终止后,多态出现得更少的原因,病毒作者也不写特别实用的恶意功能,顶多只是用多态来炫耀其技术的高超。
与之形成对照的是,混淆至今仍继续被使用,当其他修改代码的方法被病毒用以逃避检测时,它在很大程度上使病毒更难被分析。
不过自从行为检测手段出现并取代基于病毒库的检测后,修改代码技术在干扰检测方面的有效性降低了。这是为什么多态和相关的技术如今不再那么常用的原因,它仅仅作为干扰分析员对恶意代码进行分析的一种手段。
加壳和Rootkits
隐形病毒(Stealthviruses)
把恶意程序隐匿在系统中程序成为自保护的第二种手段,这种对付检测的手段为DOS时代的病毒作者所精通。这种技术首先用于1990年,如今变得更罕见,它属于我们提到的病毒——Whale的兵器库中的一员。本质上,隐匿的病毒以某种方法中断DOS系统服务并传递假的数据给用户或者反病毒程序——比如,传递“干净的”启动扇区内容,而不是被病毒感染后的真实的内容。
尽管不久后针对DOS操系统的这种隐形技术随着DOS时代的终结而消声匿迹,但在10年后,与这一技术类似的一种技术再度兴起,这就是针对Windows操作系统的Rootkit技术,只不过,它变得更加复杂,也更为隐秘。
壳(Packers)
渐渐的,病毒——这种只有在受害者体内才能发挥作用,而不能独立作为文件存在的恶意程序——被本身完全独立的木马程序取代。这个过程始于Internet比如今速度还很慢规模还很小的时候,那时硬盘和软件都很小,这意味着程序的大小很重要。为了减小木马的体积,病毒作者开始使用所谓的“壳”——而这还要追溯到DOS时代,那时壳被用来压缩程序和文件。
从恶意程序的角度来看,使用壳的一个副作用是,加壳的恶意程序更难被文件检测方式查到,这对它们来说非常有用。
当对已有的恶意程序做一个新的修改时,病毒作者往往要修改多行代码,仅仅不改动程序的核心代码。在编译后的文件中,特定序列的代码同样要修改,如果病毒库包含的并不是这个被修改的特定的序列,那么恶意程序仍会像从前那样被检测到。用壳来压缩程序解决了这个问题,因为原程序一个比特的改动可使得加壳后的文件的一整段发生变化。
加壳技术在如今仍在广泛使用。加壳程序的类型数量和复杂度仍在增长。许多现代的壳不仅压缩源文件,而且附加了一些附加自保护功能,比如干扰用调试器脱壳和分析。
Rootkits
在新千年的前几年,Windows下的恶意程序开始使用隐匿技术来隐藏它们在系统中的行踪。如前面所述,大约在隐匿程序作为概念出现并用于DOS的10年后,在2004年初,卡巴斯基实验室发现了一个惊人的程序——它的无法在进程和文件列表中看到。对许多反病毒专家来说,这是一个新的起点——理解Windows下恶意程序的隐匿技术,这是病毒产业的一个主要方向的预兆。
Rootkit的名称源于Unix,rootkit是Unix下提供给用户未经认可的root访问权限而不被系统管理员发现的工具。如今,rootkit已经是欺骗系统的专用工具的统称了,而且具有此功能的恶意程序可以隐匿它们自己的行踪。这些可以被第三方注册程序显示:进程列表中的名称,磁盘上的文件,注册表项甚至网络活动。
使用rootkit技术来隐匿于系统中的恶意程序,是什么使得反病毒程序或其他安全软件如此难以检测到它?非常简单:反病毒程序仅仅是一个外部人员——和用户一样。通常,如果用户看不到某样东西,那么反病毒程序也是看不到的。然而,有些反病毒软件使用了某些技术增强了其视野,使得它们能检测到用户看不到的rootkit。
Rootkit和DOS下的隐匿病毒的原理是相同的。许多rootkit都有修改系统调用链(修改程序执行路径)的机制。这种rootkit可以看作是一个钩子,存在于命令或信息交换路径上的一点。它会修改这些命令或者信息或者在接受者不知情的情况下控制接收终端的结果。理论上说,钩子可以存在的点的数量是无限的,实际上,通常有很多不同的方法来钩住API和系统核心函数。这些rootkit包括广为人知的Vanquish和HackDefender,以及恶意程序如Backdoor.Win32.Haxdoor,EmailWorm.Win32.Mailbot和某些版本的Email-Worm.Win32.Bagle等。
另一种通常类型的rootkit技术就是直接修改系统内核对象(DirectKernelObjectModification,DKOM),它可以被看作是直接修改源信息和命令的内部人员。这种rootkit会改变系统数据。典型的例子是FU,还有具有同样功能的Gromozon(Trojan.Win32.Gromp)。
更新的属于rootkit分类的技术是在NTFS文件系统交换数据流(ADS)中隐藏文件。这种技术首先在2000年在恶意程序Stream(Virus.Win32.Stream)中出现,第二次爆发则是在2006年的Mailbot和Gromozon中。严格来说,利用ADS并不是一种对系统的欺骗,而仅仅是利用了一个鲜为人知的函数,这也是这种技术不太可能非常流行的原因。
还有一种罕见的技术,它仅仅部分地可以视为属于rootkit(但是它更不大可能归类为其他类的恶意程序自保护技术)。这种技术使用无形的文件——这意味着恶意程序不在磁盘保留任何本体。目前仅知道两个这种子群的代表:Codered,就是2001年出现的NetWorm.Win32.CodeRed,它仅以MS IIS的内容中的形式出现,还有个是近期的一种新概念的木马——它把本体放在注册表中。
现代rootkit的趋势是虚拟化和系统函数的使用——换句话说,会更加深入到系统之中。
未来趋势
对付反病毒软件
而如今恶意程序正以更积极主动的态势保护自己,其自保护机制包括:
● 在系统中有目的的搜寻反病毒程序,防火墙或其他安全软件,然后干扰这些安全软件运行。举个例子,有恶意程序会寻找某个特定的反病毒软件的进程,并试图影响反病毒程序的功能。
● 阻断文件并且以独占方式打开文件来对付反病毒程序对文件的扫描。
● 修改主机hosts文件来阻止反病毒程序升级。
● 检测安全软件弹出的询问消息(比如,防火墙弹出窗口询问“是否允许这个连接?”),并模拟鼠标点击“允许”按钮。
实际上,有目的的攻击安全软件更像是某人顶住一堵墙,而不是主动攻击。现如今, 反病毒厂商不仅分析恶意代码的内容,而且分析它们的行为 ——恶意程序多少显得无力。无论是多态,加壳,甚至是隐匿技术都无法给恶意程序提供全面的保护,这就是为什么恶意程序要盯着所谓的敌人的特定功能或技术。当然,有时自保护机制是仅有的措施;否则它们不可能如此常见。同时从最大化、全方位保护的观点来看,这也的确引起了很大的麻烦。
未来将是怎样的?
反病毒保护技术仍在不断发展,从文件分析到程序行为分析。和文件分析相比,行为分析的根本并不是基于处理文件,而是基于处理系统级的事件,比如 “列出所有活动的系统进程”,“在一个文件夹中创建某个名字的文件”和“打开某个端口来接收数据”。通过分析这些事件链,反病毒程序可以衡量出这一组事件在多大程度上是具有潜在威胁的,并且在必要时提出警告。
然而,当行为分析术语化时可能令人困惑,而且不是那么容易弄懂。比如,一个行为分析机可能有不同的名字:主机入侵防护系统(HIPS),前摄防护(proactive protection),启 发式(heuristic),或者沙箱(Sandbox)……然而,不管用什么名称,有一件事情是清楚的:恶意程序在行为分析面前终究是无力的。而这一点很可能影响到将来恶意程序的演变。
换句话说,病毒作者面对的问题是——需要以某种方法搞定行为分析。我们无从知道他们将如何着手应付这个障碍。但是我们知道,在行为级别上使用混淆技术基本上无效。不过,另一件有意思事情的是,这可能导致病毒“自我意识”能力的增加,它们必须具有对环境作出诊断的能力,也就是说,它们要判断它们在哪:在“真实世界”(用户的工作环境中)中还是在“矩阵”(在反病毒程序的控制下)里。
诊断技术也有先例:有些恶意程序,如果他们在虚拟环境中运行(比如VMWare或 VirtualPC),它们会立刻自我销毁。通过在恶意程序内构建自销毁机制,它可以防止自己被分析,因为这种分析往往在虚拟环境中进行。
趋势和预测
根据前面的介绍,通过分析当今恶意程序自保护技术的趋势和当前能达到的有效程度,我们可以预期到以下几点:
1.Rootkit正在往利用设备函数和虚拟化的方向发展。然而,这种方法还没有达到其顶点,而且在未来几年内很可能不会成为主要的威胁,也不会被广泛使用。
2. 阻断磁盘文件的技术:已知有两个的概念性的程序实现了这种技术,我们预期这一领域在不远的将来会有发展。
3. 混淆技术的使用已经没有意义,不过它们现在仍然存在。
4. 检测安全软件并干扰其功能的技术已经非常普遍,并被广泛使用。
5. 加壳工具的使用非常广泛,仍在稳步增长。
6. 为了抵御反病毒程序向行为分析的大量转变,探测调试器、模拟器和虚拟机的技术以及其他环境诊断技术可能会发展起来。
不难发现,恶意程序自保护技术的进化趋势随着恶意程序本身和抵御恶意软件技术的发展变化而变化。当大多数恶意程序感染文件并且反病毒程序使用基于病毒库的检测时,多数恶意程序自保护的措施就是多态和代码保护。而如今,恶意程序多数是独立的,反病毒程序也逐渐的主动化。基于这些因素,我们可以预测以下这些恶意程序自保护机制会比其他机制大幅增长。
1.Rootkit。它们在系统中的不可见性给了它们一个明显的优势——即使它们不阻止被检测。我们预测很可能出现无体的恶意程序新机制,之后一段时间,虚拟化技术会完成。
2. 混淆和加密。这些方法仍将被广泛使用,用以干扰代码分析。
3. 用于对付基于行为分析的安全软件的技术。我们预期会出现一些新的技术,因为现有的一些(有目标的攻击反病毒程序)并不怎么有效。我们很可能会看到检测虚拟环境或者某种行为加密类的技术。
结论
恶意程序自我保护技术将随着反病毒技术的发展而不停发展下去,恶意软件和安全软件之间的斗争永远不会停止。
恶意程序总是不断发展新的技术,而反病毒程序也随之再提供相应补救措施,用户的系统始终处于这样一个邪恶循环中。而每次新的轮回又将产生更加复杂的恶意程序和更加重量的安全防护措施。
这一冲突耗费许多资源,毫无意义的也没有尽头,而作为夹杂在这二者之间的用户来说,我们要意识到,没有任何一种防护可以提供100%的安全,保护自己远离威胁的最好的方式就是阻止它们。
————————————————————————————————————
注解:
*多态:可以让自我复制的程序在复制自身时,完全的或部分的修改外在的外表和/或者代码结构的 一种技术。
*混淆:用多种手段相结合来使程序的源代码变得混淆。这使得代码尽可能难以读懂和分析,而同时保留其完整的功能。混淆技术可以用于编程语言的级别(包括高级,脚本和汇编语言)。最简单的混淆的 例子就是向代码中加入中性的说明(不会改变程序功能),或者使用极大数量的无条件的跳转(或把无条件 的转换伪装成条件跳转)使代码难以阅读。
原文参考:http://www.viruslist.com/en/analysis?pubid=204791949
网友评论