恶意代码加壳分析与检测

更新时间:2024-03-18 06:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

恶意代码加壳脱壳技术

张士豪

(中国人民公安大学 研究生部 北京 100038)

摘要:介绍了加壳脱壳技术的对象:PE可执行文件的结构以及各部分的功能,进而通过对恶意代码加壳、脱壳以及相关的壳技术包括壳分类、壳检测技术等的概述,揭示了加壳的恶意代码的工作原理,同时提出了对应的防护方法。着重提出了两种比较新的技术:分别是基于带权欧氏距离的脱壳过程以及基于SVM的实时加壳分类技术。 关键词:PE可执行文件;加壳;脱壳;恶意代码; 1. 引言

近些年来,随着恶意软件数量的急剧增加,给信息的安全性带来了巨大的威胁。这其中有很大一部分原因是由于恶意软件的保护机制逐渐增强,加壳等混淆技术的使用使得传统的依靠特征码扫描方式的查毒机制逐渐失效,因此亟需寻找新的方法来对恶意软件进行识别。而其中对恶意软件加壳的自动化识别是一个必要步骤,因为对可执行文件进行加壳是目前恶意软件的作者最常用的用来防止杀毒软件检测的混淆技术。在已知壳种类的前提下,许多通用的脱壳工具都能够有效的从加壳的可执行文件中检测和提取被混淆的原始代码,然后就可以应用传统的基于特征码扫描的反病毒检测软件找出隐藏的病毒。

2. PE文件概述

PE是portable executable的英文简称,可移植的可执行文件。PE格式是Windows平台下可执行程序的主要格式,常见的EXE,OCX,DLL,SYS等文件都是遵循PE格式的。在Windows平台下,所有的软件加壳技术与脱壳技术都是在PE格式上进行处理的,因此,研究PE格式对后续的加壳脱壳技术的研究是很有必要的。PE文件的格式如图1所示:

图 1 PE文件格式

下面对PE结构中的一些重要的部分重点介绍:

DOS header 和 DOS Stub: 所有的 PE 文件(或32位的DLLS)都必须以一个简单的

DOS MZ header为起始(IMAGE_DOS_HEADER结构体)。在实际中,除了e_lfanew(PE header 的文件偏移量)我们可以不必太关心其余成员数据。DOS Stub只是提供了PE文件在DOS下执行时,DOS会把它当作有效的执行文件而顺利执行。程序员也可以改变DOS Stub,根据自己的意图实现完整的 DOS代码。

PE Header:PE表头内含程序代码和各种资料的大小位置、适用的操作系统、堆栈

(stack)最初大小等等重要信息。犹如执行文件的纲目。整个PE Header 是一个IMAGE_NT_HEADERS结构体,在Win32 SDK中定义如下: typedef struct _IMAGE_NT_HEADERS {

DWORD Signature; \\\\PE标记,值为50h, 45h, 00h, 00h(ASCII:”PE\\0\\0”) IMAGE_FILE_HEADER FileHeader;

IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

PE Signature 为校验标记,由连接器产生。通常装载器通过指向此位的指针e_lfanew(DOS header中,表示相对偏移量)来检验此文件是否为PE格式。FileHeader域包含了关于PE文件物理分布的一般信息, opionalHeader域包含了关于PE文件逻辑分布的信息。可以通过NTHeader = dosHeader + dosHeader——>e_lfanew获得pe头的地址。

Section Header:紧接在PE header 的是section table(IMAGE_SECTION_HEADER) 。

每个表项包含有该节的属性、偏移量等。如果PE文件里有3节,那么此数据结构就有3个元素。为了更好的理解PE header 和Section header 在PE文件中的组织关系,我们可以把PE文件看作一逻辑磁盘,PE header是boot扇区而sections是各种文件,节表视为逻辑磁盘中的根目录。

1、text section

此节一般包含有连接器连接的所有obj目标文件的执行代码。这个执行代码块是一个大的.text。不同于在DOS下面的执行文件可以分成几部分。

2、data section

.data是初始化的数据块。这些数据块包括编译时被初始化的字符串常量、全局(globle)和静态(static)变量。

3、edata section

与.idata对应,.edata是该PE文件输出函数和数据的列表,以供其他模块引用。有的PE文件没有引出函数或数据,也就没有该节。

PE文件的加载过程描述如下:

1、当需要运行PE文件时,PE文件加载器会首先检查DOS头里的PE文件头 的偏移量。如果可以找到,则忽视DOS stub中的信息而直接跳转到PE文件头。

2、PE文件加载器会检查PE文件头的有效性。如果有效的话,则直接跳转至 PE文件头的结束部分。

3、PE文件加载器读取节表中的节信息,并采用内存映射的方法将这些节映射 到内存当中,并且按照节表里节信息的设定来设置内存块的属性。

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

在一般情况下,软件的壳都在需要保护的软件运行之前运行,在拿到程序控制权之后,完成它们保护软件的使命。由于这种程序和自然界的壳在功能上有许多类似的地方,计算机中的病毒是比照生活中的病毒命名一样,基于命名的规则,大家就把这种通过压缩加密对程序进行保护的的程序称为“壳”。加壳作为软件混清技术的一种,在恶意软件反检测领域和软件保护领域被大量的应用。

对于加壳后的程序,被压缩或是被保护的代码才是程序的原始代码,只有当程序加载到内存中时,解压缩或解密代码在堆栈中才会把保护代码还原,交还控制权给原始代码,原始代码才开始正常的运行。对于加壳本身,保护的是被保护软件的原始二进制代码,在逻辑上与被保护的软件相分离,因此具有适应面广、稳定性高的特点。

恶意软件的衍生现象之所以比较严重,这其中很大一部分的原因是由于恶意软件作者对恶意软件的防护的手段也在逐渐的进步,由于目前的杀毒软件大多都是基于病毒的特征码的,而恶意软件通过不同加壳手段可以使这些特征码失效,从而加壳成为了一种被恶意软件作者利用的工具,恶意软件作者通过对恶意软件的代码进行加密或压缩,从而逃脱了杀毒软件的查杀以及逆向工具的分析。利用加壳之类的混淆技术可以对已有的病毒进行新的“包装”,从而变身成为“新”的病毒,而继续在网络上肆虐。

由于恶意软件在加壳之后,加壳前恶意程序的原始二进制代码被隐藏和保护起来,因此想要提取原始程序的特征码变得十分困难。相同的病毒通过不同的加壳甚至会出现不同的特征码。由于传统的病毒查杀方法都是基于特征码扫描的。想要保护系统不受变种的加壳恶意软件侵害,亟需我们去寻找新的方法来对恶意软件的加壳进行检测和分类,这样才能够利用脱壳工具,从加壳的恶意软件中还原出原始的二进制代码,生成正确的恶意代码的特征。在这整个过程中,如何准确快速的识别出恶意软件是否加壳以及所加壳的种类变得非常重要。

当一个程序加壳之后,加载该程序的步骤如下:

获取 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 的代码的地址,从而达到先于原程序获得控制权的目的。

跳转到程序原来的入口点(Original Entry Point,OEP)。此时壳就把控制权交给原程序了,原程序按照自己的目的执行。 加壳后的程序加载过程如图2所示:

图 2 加壳程序加载过程

4. PE文件壳种类检测

在对加壳的程序进行处理时,首先要对壳的种类进行检测,现阶段比较成熟的有三种壳检测技术:

1、PE壳种类的静态检测

目前最著名的、使用最广泛的用于查看加壳的类型的工具就是PEiD。PEiD也是基于特征码的,能够检测出大多数PE文件常用的壳,可以检测出600多个不同的特征码。但是由于PEiD是基于静态壳的特征码的匹配,而且PEiD特征库中的特征码

大多都是由人工添加获得的,从而在面对新种类的加壳,以及恶意软件加壳者针对特征字符串匹配所使用的特征库,通过些微改变加壳算法等混清手段时,PeiD检测工具很难起到作用。 2、PE壳种类的动态检测

由于静态检测方式存在着上述的缺陷,一些基于动态检测壳种类的方法才被提出来,这些方法共通的原理主要都是基于对加壳软件的解壳过程进行监测,并且试图定位出解壳程序完成解壳过程的时间点,然后把内存中未受保护的代码通过dump等手段映射出来。

虽然这些动态监测恶意软件加壳的设计目的都是希望可以部署在恶意软件实时检测系统上,但是由于它们在发现加壳的过程中都需要进行一定时间的计算和运行,这使得这些方法无法在实时系统的终端上运行。 3、基于PE文件信息熵的加壳检测

这种检测方法主要是以Bintropy方法为代表的。Bintropy是由Lyda和Hamrock提出来的一种对加壳文件进行壳检测的分析方法。其主要原理是根据可执行文件在加壳后的混乱度相对于未加壳的可执行文件有所增加,从而导致部分节的熵值变高,并且通过计算可执行文件各代码段的信息熵,然后依据计算出的熵值来判定恶意软件是否加壳。

Bintropy的具体做法是:首先对PE样本文件进行分块;其次利用公式计算每个块的熵值,同时计算出该样本文件中所有块的熵的最大值和平均值;然后以给定的概率对熵的最大值和平均值求出置信区间;最后依照样本文件计算出来的熵值来判定其是否加壳或者是否加密。

除了上述方法之外,本文还将介绍一种基于SVM的实时加壳分类技术,这种技术可以说比较好的规避了上述的三种方法的种种不足,是一种比较有效的壳检测分类技术,具体步骤如下:

首先用户向系统提交的是对于加壳情况未知的PE可执行文件。在运行时,如果系统判定用户上传的是PE可执行文件时,它将立刻执行对此PE文件的分析,同时提取出该PE文件中相应的代码段作为特征代码段。当这些代码段被转换成特定形式的字符串后,我们将获取的这些字符串形式的特征码发送到SVM(支持向量机)分类器中进行进一步处理。

在这种情况下,一方面,如果该可执行文件被分类为加壳的,那么它将被发送到通用解壳工具进行解壳,然后解壳后的隐藏的代码将被发送到反病毒扫描器。另一方面,如果可执行文件被分类为未加壳的,将直接被发送到反病毒扫描器进行扫描。

在这里值得注意的是,PE文件分类器可能会将一个未加壳的可执行文件误认为一个加壳的。在这种情况下,通用解壳工具将无法从接收到的PE文件中解壳及提取任何隐藏的代码。在这种情况下,并没有对系统本身并没有损害,因为如果没有隐藏的代码被提取出来的话,反病毒扫描仪将直接扫描未加壳程序的原代码。在这种情况下,所付出的唯一成本就是通用解壳程序试图解开一个非加壳的可执行程序所用的时间成本。同样的,PE文件分类器在某些情况下也有可能把加壳的可执行文件作为非加壳的可执行文件执行。在这种情况下,加壳的可执行文件将被直接发送到反病毒扫描器,而反病毒扫描器可能无法检测到加壳的可执行文件中嵌入恶意代码的存在,从而造成了一个假阴性的实例的产生。

该方法的壳分类过程如图3所示:

图 3 实时加壳分类技术

5. 脱壳技术概述

软件脱壳无论是在逆向分析还是在软件解密工作中都非常重要,这是因为软件在脱壳之后,逆向分析、解密的工作就会变得简单很多。脱壳的最终目的是将加在程序中的壳去掉,其成功的标志是程序无壳并且程序能够正常执行,即能实现自己原来的功能。脱壳一般分为三个步骤,分别是:获取 OEP、dump 以及重建输入表,其中获取 OEP 是脱壳中的基础与核心。 加壳程序的脱壳过程如下: 1、获取OEP:

由加壳程序运行的特征可知,加壳程序在执行过程中将解密或者解压缩出一些数据与代码,而在很多时候为了分析程序的行为,需要将加壳文件隐藏的数据(压缩与加密

的数据)读取出来,也可以说,这些隐藏的数据在程序执行过程中在内存中“显现”出来,因此,我们可以通过监控存储器访问获得脱壳的数据与代码。 2、DUMP

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

重建输入表模块是在 dump 后的文件经PDWED检测发现并不包含壳,双击 dump 后的文件执行又会发生错误,则需要对输入表进行重建,该模块需要手动完成。 基于上述的三个脱壳步骤,基于带权欧式距离的脱壳方法共分为 5 个模块,分别是修改后的内存监测数据采集模块、dump 模块、PDWED 模块、原 OEP 确定模块以及重建输入表模块。在这 5个模块中,只有最后一个重建输入表模块需要手动完成外,其他的模块均可通过程序自动完成。 其中,内存监测数据采集模块不仅采集了加壳程序隐藏的信息,也为确定原 OEP 提供了需要判断的地址空间。 Dump 模块是从满足堆栈平衡原理的指令处抓取内存映像,并保存到文件中。

PDWED 模块主要是检测从满足堆栈平衡原理的指令开始 dump 的文件是否还包含壳,如果不包含壳,则说明已经找到程序的原 OEP 了。 原 OEP 确定模块主要是为了获取程序的原 OEP。 基于带权欧式距离的脱壳技术如图4所示:

图 4 脱壳框架图

结论

以上对于加壳、脱壳技术以及壳分类和检测技术的概述旨在通过分析现阶段比较流行一些加壳软件的加壳过程,从而对目前在恶意代码防护中需要着重注意的自定义壳的检测脱壳方面进行更加深入的研究,恶意代码的入侵和反入侵、查杀与免杀是一场旷日持久的战役,只有把这些自定义的加壳技术的共同的原理搞清楚,就能够更加有效的防止加壳恶意代码对信息安全造成严重的破坏,能够更加高效地保障计算机系统安全。 参考文献:

[1] 赵跃华, 张翼, and 言洪萍. \基于数据挖掘技术的加壳 PE 程序识别方法.\计算机应用 31.7 (2011): 1901-1903.

[2] 赵中树. 基于 Windows 平台的脱壳技术研究与实现. MS thesis. 电子科技大学, 2012. [3] 黄剑军. 基于带权欧氏距离的壳检测与脱壳技术的研究. MS thesis. 杭州电子科技大学, 2009.

[4] 王志, 贾春福, 鲁凯, 基于环境敏感分析的恶意代码脱壳方法 - 《计算机学报》 2012年4期

本文来源:https://www.bwwdw.com/article/8bf8.html

Top