您好,欢迎访问三七文档
近些年来,随着恶意软件数量的急剧增加,给信息的安全性带来了巨大的威胁。这其中有很大一部分原因是由于恶意软件的保护机制逐渐增强,加壳等混淆技术的使用使得传统的依靠特征码扫描方式的查毒机制逐渐失效,因此亟需寻找新的方法来对恶意软件进行识别。而其中对恶意软件加壳的自动化识别是一个必要步骤,因为对可执行文件进行加壳是目前恶意软件的作者最常用的用来防止杀毒软件检测的混淆技术。在已知壳种类的前提下,许多通用的脱壳工具都能够有效的从加壳的可执行文件中检测和提取被混淆的原始代码,然后就可以应用传统的基于特征码扫描的反病毒检测软件找出隐藏的病毒。然而,这些通用的脱壳工具通常都在存在一个共通的缺点:计算时间过长,在处理扫描大量的可执行文件的时候有时甚至需要花费数个小时甚至几天,这样在处理数量巨大的混杂恶意程序和正常程序的样本时就会耗费大量的不必要的时间,这就不符合恶意代码识别时效性的需求,因此亟需找到一种更加高效的方法来识别恶意代码是否加壳以及加壳的种类。视频中有关的两种加壳工具一、PE文件概述二、加壳技术分析三、加壳软件检测四、软件脱壳技术概述PE是portableexecutable的英文简称,可移植的可执行文件。PE格式是Windows平台下可执行程序的主要格式,常见的EXE,OCX,DRV,SYS等文件都是遵循PE格式的。在Windows平台下,所有的软件加壳技术与脱壳技术都是在PE格式上进行处理的,因此,研究PE格式对后续的加壳脱壳技术的研究是很有必要的。在PE文件中,保存着目标二进制可执行程序运行所需要的各种信息。目标程序运行所需要的指令流是放在PE文件的代码段中,指令流所要处理的数据可能存放的段比较多,主要是根据数据的属性进行存放,对于只读且已经初始化的数据,一般是放在rdata段中,而对于可读写且已初始化的数据,一般放在data段内,对于未初始化的数据,编译器一般将其放在bss段中。bss段在磁盘中的PE文件里是不占磁盘空间的,因为系统没有必要为随机值保留磁盘空间。1、当需要运行PE文件时,PE文件加载器会首先检查DOS头里的PE文件头的偏移量。如果可以找到,则忽视DOSstub中的信息而直接跳转到PE文件头。2、PE文件加载器会检查PE文件头的有效性。如果有效的话,则直接跳转至PE文件头的结束部分。3、PE文件加载器读取节表中的节信息,并采用内存映射的方法将这些节映射到内存当中,并且按照节表里节信息的设定来设置内存块的属性。4、最后,当PE文件被映射到内存后,PE文件加载器还将处理PE文件中类似输入表等逻辑部分。在一般情况下,软件的壳都在需要保护的软件运行之前运行,在拿到程序控制权之后,完成它们保护软件的使命。由于这种程序和自然界的壳在功能上有许多类似的地方,计算机中的病毒是比照生活中的病毒命名一样,基于命名的规则,大家就把这种通过压缩加密对程序进行保护的的程序称为“壳”。加壳作为软件混清技术的一种,在恶意软件反检测领域和软件保护领域被大量的应用。对于加壳后的程序,被压缩或是被保护的代码才是程序的原始代码,只有当程序加载到内存中时,解压缩或解密代码在堆栈中才会把保护代码还原,交还控制权给原始代码,原始代码才开始正常的运行。对于加壳本身,保护的是被保护软件的原始二进制代码,在逻辑上与被保护的软件相分离,因此具有适应面广、稳定性高的特点。恶意软件的衍生现象之所以比较严重,这其中很大一部分的原因是由于恶意软件作者对恶意软件的防护的手段也在逐渐的进步,由于目前的杀毒软件大多都是基于病毒的特征码的,而恶意软件通过不同加壳手段可以使这些特征码失效,从而加壳成为了一种被恶意软件作者利用的工具,恶意软件作者通过对恶意软件的代码进行加密或压缩,从而逃脱了杀毒软件的查杀以及逆向工具的分析。利用加壳之类的混淆技术可以对已有的病毒进行新的“包装”,从而变身成为“新”的病毒,而继续在网络上肆虐。由于恶意软件在加壳之后,加壳前恶意程序的原始二进制代码被隐藏和保护起来,因此想要提取原始程序的特征码变得十分困难。相同的病毒通过不同的加壳甚至会出现不同的特征码。由于传统的病毒查杀方法都是基于特征码扫描的。想要保护系统不受变种的加壳恶意软件侵害,亟需我们去寻找新的方法来对恶意软件的加壳进行检测和分类,这样才能够利用脱壳工具,从加壳的恶意软件中还原出原始的二进制代码,生成正确的恶意代码的特征。在这整个过程中,如何准确快速的识别出恶意软件是否加壳以及所加壳的种类变得非常重要。目前最著名的、使用最广泛的用于查看加壳的类型的工具就是PEiD。PEiD也是基于特征码的,能够检测出大多数PE文件常用的壳,可以检测出600多个不同的特征码。但是由于PEiD是基于静态壳的特征码的匹配,而且PEiD特征库中的特征码大多都是由人工添加获得的,从而在面对新种类的加壳,以及恶意软件加壳者针对特征字符串匹配所使用的特征库,通过些微改变加壳算法等混清手段时,PeiD检测工具很难起到作用。由于静态检测方式存在着上述的缺陷,一些基于动态检测壳种类的方法才被提出来,这些方法共通的原理主要都是基于对加壳软件的解壳过程进行监测,并且试图定位出解壳程序完成解壳过程的时间点,然后把内存中未受保护的代码通过dump等手段映射出来。虽然这些动态监测恶意软件加壳的设计目的都是希望可以部署在恶意软件实时检测系统上,但是由于它们在发现加壳的过程中都需要进行一定时间的计算和运行,这使得这些方法无法在实时系统的终端上运行。这种检测方法主要是以Bintropy方法为代表的。Bintropy是由Lyda和Hamrock提出来的一种对加壳文件进行壳检测的分析方法。其主要原理是根据可执行文件在加壳后的混乱度相对于未加壳的可执行文件有所增加,从而导致部分节的摘值变高,并且通过计算可执行文件各代码段的信息熵,然后依据计算出的熵值来判定恶意软件是否加壳。Bintropy的具体做法是:首先对PE样本文件进行分块;其次利用公式计算每个块的熵值,同时计算出该样本文件中所有块的熵的最大值和平均值;然后以给定的概率对熵的最大值和平均值求出置信区间;最后依照样本文件计算出来的熵值来判定其是否加壳或者是否加密。获取API地址:该过程主要是获得诸如GetProcAddress、GetModule以及LoadLibrary的API函数地址,其他的API函数的地址可以通过调用LoadLibraryA(W)或者LoadLibraryExA(W)来完成。解密区块:加壳一般都会对原文件的各个区块进行加密,为了保证能实现原程序应有的功能,需要对各个区块进行解密。IAT初始化:一般来说,IAT的填写应该由PE装载器实现,但是由于文件加壳,故IAT的填写只有由外壳程序来填写。重定位:重定位只针对加壳的DLL文件,加壳的EXE文件不需要重定位。对于EXE文件,系统会尽量满足要求,而对DLL文件,系统没有办法保证每一次DLL运行时提供相同的基址,因此,加壳的DLL文件需要重定位。HOOK-API:壳一般修改了原程序的输入表,根据自己的需要模仿WINDOWS系统填充输入表,在填充过程中,外壳就可填充HOOK-API的代码的地址,从而达到先于原程序获得控制权的目的。跳转到程序原来的入口点(OriginalEntryPoint,OEP)。此时壳就把控制权交给原程序了,原程序按照自己的目的执行。软件脱壳无论是在逆向分析还是在软件解密工作中都非常重要,这是因为软件在脱壳之后,逆向分析、解密的工作就会变得简单很多。脱壳的最终目的是将加在程序中的壳去掉,其成功的标志是程序无壳并且程序能够正常执行,即能实现自己原来的功能。脱壳一般分为三个步骤,分别是:获取OEP、dump以及重建输入表,其中获取OEP是脱壳中的基础与核心。1、获取OEP:由加壳程序运行的特征可知,加壳程序在执行过程中将解密或者解压缩出一些数据与代码,而在很多时候为了分析程序的行为,需要将加壳文件隐藏的数据(压缩与加密的数据)读取出来,也可以说,这些隐藏的数据在程序执行过程中在内存中“显现”出来,因此,我们可以通过监控存储器访问获得脱壳的数据与代码。2、DUMPDump即转存之意,在特定时刻按照一定的文件格式将内存的数据存储在文件中,对于加壳文件,dump的最佳时刻是执行到程序的原OEP处。如果壳没有对输入表进行加密操作,dump后的文件没有加壳的,是可以正常运行的,否则的话,dump后的文件在执行时会出现不可意料的错误。3、重建输入表重建输入表模块是在dump后的文件经PDWED检测发现并不包含壳,双击dump后的文件执行又会发生错误,则需要对输入表进行重建,该模块需要手动完成。首先用户向系统提交的是对于加壳情况未知的PE可执行文件。在运行时,如果系统判定用户上传的是PE可执行文件时,它将立刻执行对此PE文件的分析,同时提取出该PE文件中相应的代码段作为特征代码段。当这些代码段被转换成特定形式的字符串后,我们将获取的这些字符串形式的特征码发送到SVM分类器中进行进一步处理。在这种情况下,一方面,如果该可执行文件被分类为加壳的,那么它将被发送到通用解壳工具进行解壳,然后解壳后的隐藏的代码将被发送到反病毒扫描器。另一方面,如果可执行文件被分类为未加壳的,将直接被发送到反病毒扫描器进行扫描。在这里值得注意的是,PE文件分类器可能会将一个未加壳的可执行文件误认为一个加壳的。在这种情况下,通用解壳工具将无法从接收到的PE文件中解壳及提取任何隐藏的代码。在这种情况下,并没有对系统本身并没有损害,因为如果没有隐藏的代码被提取出来的话,反病毒扫描仪将直接扫描未加壳程序的原代码。在这种情况下,所付出的唯一成本就是通用解壳程序试图解开一个非加壳的可执行程序所用的时间成本。同样的,PE文件分类器在某些情况下也有可能把加壳的可执行文件作为非加壳的可执行文件执行。在这种情况下,加壳的可执行文件将被直接发送到反病毒扫描器,而反病毒扫描器可能无法检测到加壳的可执行文件中嵌入恶意代码的存在,从而造成了一个假阴性的实例的产生。总结:1、自定义加壳软件的利用率在上升2、恶意代码自身也在不断地更新自身的加壳算法,以防止被检测和脱壳。
本文标题:恶意软件加壳
链接地址:https://www.777doc.com/doc-5249231 .html