恶意软件加壳

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


视频中有关的两种加壳工具
一、PE文件概述 二、加壳技术分析 三、加壳软件检测 四、软件脱壳技术概述


PE是portable executable的英文简称,可移植的可执行文件。PE 格式是Windows平台下可执行程序的主要格式,常见的 EXE,OCX,DRV,SYS等文件都是遵循PE格式的。在Windows平台 下,所有的软件加壳技术与脱壳技术都是在PE格式上进行处理的, 因此,研究PE格式对后续的加壳脱壳技术的研究是很有必要的。 在PE文件中,保存着目标二进制可执行程序运行所需要的各种信 息。目标程序运行所需要的指令流是放在PE文件的代码段中, 指令流所要处理的数据可能存放的段比较多,主要是根据数据的 属性进行存放,对于只读且已经初始化的数据,一般是放在rdata 段中,而对于可读写且已初始化的数据,一般放在data段内,对于 未初始化的数据,编译器一般将其放在bss段中。bss段在磁盘中 的PE文件里是不占磁盘空间的,因为系统没有必要为随机值保留 磁盘空间。

近些年来,随着恶意软件数量的急剧增加,给信息的安全性带来了 巨大的威胁。这其中有很大一部分原因是由于恶意软件的保护 机制逐渐增强,加壳等混淆技术的使用使得传统的依靠特征码扫 描方式的查毒机制逐渐失效,因此亟需寻找新的方法来对恶意软 件进行识别。而其中对恶意软件加壳的自动化识别是一个必要 步骤,因为对可执行文件进行加壳是目前恶意软件的作者最常用 的用来防止杀毒软件检测的混淆技术。在已知壳种类的前提下, 许多通用的脱壳工具都能够有效的从加壳的可执行文件中检测 和提取被混淆的原始代码,然后就可以应用传统的基于特征码扫 描的反病毒检测软件找出隐藏的病毒。然而,这些通用的脱壳工 具通常都在存在一个共通的缺点:计算时间过长,在处理扫描大量 的可执行文件的时候有时甚至需要花费数个小时甚至几天,这样 在处理数量巨大的混杂恶意程序和正常程序的样本时就会耗费 大量的不必要的时间,这就不符合恶意代码识别时效性的需求,因 此亟需找到一种更加高效的方法来识别恶意代码是否加壳以及 加壳的种类。






4、最后,当PE文件被映射到内存后,PE文件加载器还将处理PE文件中类
似输入表等逻辑部分。


在一般情况下,软件的壳都在需要保护的软件运行之前运行,在拿到 程序控制权之后,完成它们保护软件的使命。由于这种程序和自然 界的壳在功能上有许多类似的地方,计算机中的病毒是比照生活中 的病毒命名一样,基于命名的规则,大家就把这种通过压缩加密对程 序进行保护的的程序称为“壳”。加壳作为软件混清技术的一种, 在恶意软件反检测领域和软件保护领域被大量的应用。 对于加壳后的程序,被压缩或是被保护的代码才是程序的原始代码, 只有当程序加载到内存中时,解压缩或解密代码在堆栈中才会把保 护代码还原,交还控制权给原始代码,原始代码才开始正常的运行。 对于加壳本身,保护的是被保护软件的原始二进制代码,在逻辑上与 被保护的软件相分离,因此具有适应面广、稳定性高的特点。

2、DUMP Dump即转存之意,在特定时刻按照一定的 文件格式将内存的数据存储在文件中,对 于加壳文件,dump 的最佳时刻是执行到程 序的原 OEP 处。如果壳没有对输入表进行 加密操作,dump 后的文件没有加壳的,是 可以正常运行的,否则的话,dump 后的文 件在执行时会出现不可意料的错误。

3、重建输入表 重建输入表模块是在 dump 后的文件经 PDWED检测发现并不包含壳,双击 dump 后的文件执行又会发生错误,则需要对输 入表进行重建,该模块需要手动完成。


首先用户向系统提交的是对于加壳情况未知的PE可执行文件。在运行时,如果系统 判定用户上传的是PE可执行文件时,它将立刻执行对此PE文件的分析,同时提取出 该PE文件中相应的代码段作为特征代码段。当这些代码段被转换成特定形式的字 符串后,我们将获取的这些字符串形式的特征码发送到SVM分类器中进行进一步处 理。 在这种情况下,一方面,如果该可执行文件被分类为加壳的,那么它将被发送到通用 解壳工具进行解壳,然后解壳后的隐藏的代码将被发送到反病毒扫描器。另一方面, 如果可执行文件被分类为未加壳的,将直接被发送到反病毒扫描器进行扫描。


由于静态检测方式存在着上述的缺陷,一些基于动 态检测壳种类的方法才被提出来,这些方法共通的 原理主要都是基于对加壳软件的解壳过程进行监 测,并且试图定位出解壳程序完成解壳过程的时间 点,然后把内存中未受保护的代码通过dump等手 段映射出来。 虽然这些动态监测恶意软件加壳的设计目的都是 希望可以部署在恶意软件实时检测系统上,但是由 于它们在发现加壳的过程中都需要进行一定时间 的计算和运行,这使得这些方法无法在实时系统的 终端上运行。

这种检测方法主要是以Bintropy方法为代表的。 Bintropy是由Lyda和Hamrock提出来的一种对加壳文 件进行壳检测的分析方法。其主要原理是根据可执行 文件在加壳后的混乱度相对于未加壳的可执行文件有 所增加,从而导致部分节的摘值变高,并且通过计算可 执行文件各代码段的信息熵,然后依据计算出的熵值来 判定恶意软件是否加壳。 Bintropy的具体做法是:首先对PE样本文件进行分块; 其次利用公式计算每个块的熵值,同时计算出该样本文 件中所有块的熵的最大值和平均值;然后以给定的概率 对熵的最大值和平均值求出臵信区间;最后依照样本文 件计算出来的熵值来判定其是否加壳或者是否加密。

软件脱壳无论是在逆向分析还是在软件解密工 作中都非常重要,这是因为软件在脱壳之后, 逆向分析、解密的工作就会变得简单很多。脱 壳的最终目的是将加在程序中的壳去掉,其成 功的标志是程序无壳并且程序能够正常执行, 即能实现自己原来的功能。脱壳一般分为三个 步骤,分别是:获取 OEP、dump 以及重建输 入表,其中获取 OEP 是脱壳中的基础与核心。
在这里值得注意的是,PE文件分类器可能会将一个未加壳的可执行文件误认为一个 加壳的。在这种情况下,通用解壳工具将无法从接收到的PE文件中解壳及提取任何 隐藏的代码。在这种情况下,并没有对系统本身并没有损害,因为如果没有隐藏的代 码被提取出来的话,反病毒扫描仪将直接扫描未加壳程序的原代码。在这种情况下, 所付出的唯一成本就是通用解壳程序试图解开一个非加壳的可执行程序所用的时 间成本。同样的,PE文件分类器在某些情况下也有可能把加壳的可执行文件作为非 加壳的可执行文件执行。在这种情况下,加壳的可执行文件将被直接发送到反病毒 扫描器,而反病毒扫描器可能无法检测到加壳的可执行文件中嵌入恶意代码的存在, 从而造成了一个所以比较严重,这其中很大 一部分的原因是由于恶意软件作者对恶意软件的 防护的手段也在逐渐的进步,由于目前的杀毒软件 大多都是基于病毒的特征码的,而恶意软件通过不 同加壳手段可以使这些特征码失效,从而加壳成为 了一种被恶意软件作者利用的工具,恶意软件作者 通过对恶意软件的代码进行加密或压缩,从而逃脱 了杀毒软件的查杀以及逆向工具的分析。利用加 壳之类的混淆技术可以对已有的病毒进行新的 “包装”,从而变身成为“新”的病毒,而继续在网 络上肆虐。


1、当需要运行PE文件时,PE文件加载器会首先检查DOS头里的PE文件头 的偏移量。如果可以找到,则忽视DOS stub中的信息而直接跳转到PE文件头。 2、PE文件加载器会检查PE文件头的有效性。如果有效的话,则直接跳转至 PE文件头的结束部分。 3、PE文件加载器读取节表中的节信息,并采用内存映射的方法将这些节映射 到内存当中,并且按照节表里节信息的设定来设臵内存块的属性。


总结: 1、自定义加壳软件的利用率在上升 2、恶意代码自身也在不断地更新自身的加 壳算法,以防止被检测和脱壳。


由于恶意软件在加壳之后,加壳前恶意程序的原始 二进制代码被隐藏和保护起来,因此想要提取原始 程序的特征码变得十分困难。相同的病毒通过不 同的加壳甚至会出现不同的特征码。由于传统的 病毒查杀方法都是基于特征码扫描的。想要保护 系统不受变种的加壳恶意软件侵害,亟需我们去寻 找新的方法来对恶意软件的加壳进行检测和分类, 这样才能够利用脱壳工具,从加壳的恶意软件中还 原出原始的二进制代码,生成正确的恶意代码的特 征。在这整个过程中,如何准确快速的识别出恶意 软件是否加壳以及所加壳的种类变得非常重要。
1、获取OEP: 由加壳程序运行的特征可知,加壳程序在 执行过程中将解密或者解压缩出一些数据 与代码,而在很多时候为了分析程序的行 为,需要将加壳文件隐藏的数据(压缩与 加密的数据)读取出来,也可以说,这些 隐藏的数据在程序执行过程中在内存中 “显现”出来,因此,我们可以通过监控 存储器访问获得脱壳的数据与代码。

目前最著名的、使用最广泛的用于查看加壳的 类型的工具就是PEiD。PEiD也是基于特征码的, 能够检测出大多数PE文件常用的壳,可以检测 出600多个不同的特征码。但是由于PEiD是基 于静态壳的特征码的匹配,而且PEiD特征库中 的特征码大多都是由人工添加获得的,从而在 面对新种类的加壳,以及恶意软件加壳者针对 特征字符串匹配所使用的特征库,通过些微改 变加壳算法等混清手段时,PeiD检测工具很难 起到作用。







获取 API 地址:该过程主要是获得诸如 GetProcAddress、GetModule 以及 LoadLibrary 的API 函数地址,其他的 API 函数的地址可以通过 调用 LoadLibraryA(W)或者 LoadLibraryExA(W)来完成。 解密区块:加壳一般都会对原文件的各个区块进行加密,为了保证能 实现原程序应有的功能,需要对各个区块进行解密。 IAT 初始化:一般来说,IAT 的填写应该由 PE 装载器实现,但是由于 文件加壳,故 IAT的填写只有由外壳程序来填写。 重定位:重定位只针对加壳的 DLL 文件,加壳的 EXE 文件不需要重定 位。对于 EXE 文件,系统会尽量满足要求,而对 DLL 文件,系统没有 办法保证每一次 DLL 运行时提供相同的基址,因此,加壳的 DLL 文件 需要重定位。 HOOK-API:壳一般修改了原程序的输入表,根据自己的需要模仿 WINDOWS 系统填充输入表,在填充过程中,外壳就可填充 HOOKAPI 的代码的地址,从而达到先于原程序获得控制权的目的。 跳转到程序原来的入口点(Original Entry Point,OEP)。此时壳就把控 制权交给原程序了,原程序按照自己的目的执行。
相关文档
最新文档