PE文件中脱壳技术的研究

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

第27卷第9期 计算机应用与软件

Vol 127No .92010年9月 Computer App licati ons and Soft w are Sep.2010

PE 文件中脱壳技术的研究

李 露 刘秋菊 徐汀荣

(苏州大学计算机科学与技术学院 江苏苏州215006)

收稿日期:2009-01-07。李露,硕士生,主研领域:网络安全,信息技术。

摘 要 对PE (Portable Executable )文件进行加壳是保护软件的有效手段,但恶意程序也会通过加壳来保护自己。作为一名病毒

分析师或软件安全分析员,只有先将其脱壳,才能进行彻底的分析。以W indows 记事本程序为实例,首先分析了PE 文件结构及其加壳原理,其次阐述了脱壳的一般步骤,然后从压缩壳和加密壳的角度,重点探讨了脱壳技术的原理和方法。最后对伪装壳和多重壳及程序自校验进行了探讨和分析。

关键词 PE 加壳 脱壳 伪装壳 多重壳 自校验

O N UNPACK I NG TECHNOLO GY FO R PE F I L ES

L i Lu L iu Q iuju Xu Tingr ong

(School of Co m puter Science and Technology,Soocho w U niversity,Suzhou 215006,J iangsu,China )

Abstract Packing Portable Executable (PE )files is an effective mean t o p r otect s oft w are,but mal w are can als o use packing t o p r otect the m selves .A s a virus analyst or a s oft w are security researcher,you must unpack the mal w are first,then can you analysis the m in detail .Taking the notepad p r ogra m in M icr os oftW indows as an in this paper we first analyzed the PE file structure and the p rinci p le of packing,and then expounded the general step s of unpacking .After that,in ter m s of the comp ressi on shell and encryp ti on shell,we f ocused on the p rinci p les and methods of unpacking technol ogy .Finally,we discussed and analyzed the ca mouflage shell,multi 2shell and self 2chec 2king .

Keywords PE Packing Unpacking Ca mouflage shell Multi 2shell Self 2checking

0 引 言

PE 文件格式是W I N 32环境自带的跨平台可执行文件格

式,常见的EXE 、DLL 、OCX 、SYS 、COM 等文件均是PE 格式。使用该格式,在非I ntel 芯片的CP U 上,W indows 一样能识别和使用。

对PE 文件加壳,能较好地保护原程序。但病毒和木马也会利用加壳技术来保护自己,因为加壳后程序执行结果不变,但代码发生了变化,从而使杀毒软件无法查杀。作为一名病毒分析师或者软件安全研究员,如果不懂得脱壳技术,将很难对这些恶意程序进行分析。据瑞星公司截获的病毒样本统计,90%以上的病毒文件都经过加壳处理,可见掌握脱壳技术十分重要。现有文章大都进行加壳技术的探讨[1-3],本文则着重研究脱壳技术。

1 壳的介绍

壳是一段附加在原程序上的代码,它先于真正的程序运行并拿到控制权,在完成程序保护任务后(检测程序是否被修改,是否被跟踪等),再将控制权转交给真正的程序,其运行过程与病毒有些相似。在形式上又与W I N RAR 类的压缩软件类似,运行前都需要将原程序解压。但壳对程序的解压是在内存中进行,对用户来说完全透明,用户感觉不到壳的存在。

壳分为压缩壳和加密壳。压缩壳只是为了减少程序体积而

对资源进行压缩,便于传输,具有一定的保护作用。常见的压缩壳有UPX 、ASPCAK 、TE LOCK 、PE L I TE 、NSP ACK 等。加密壳是使用各种手段对程序资源进行保护,防止其被反汇编或跟踪,文件加壳后是否变小不是其主要目标。常见的加密壳有AR MA 2D I L LO 、ASPROTECT 、ACPROTECT 、EPE 、S VKP 等。目前一些壳已兼具有两种功能,即能压缩资源,又能加密资源。

2 PE 结构框架

PE 文件使用一个平面地址空间,所有代码和数据都被合并

成一个很大的结构。文件内容由属性相同的区块组成,各区块按页边界对齐,大小没有限制。每个区块都有不同的名字,用来表示区块的功能。图1是W indows98下记事本Notepad .exe 程序的PE 结构图。从图中可以看出PE 文件由几个连续的区块组成。先后由DOS 头部、PE 头部、区段表以及各个区段组成。其中.text 是代码段,.data 是已初始化的数据段,.idata 是输入表段,.rsrc 是资源段,.rel oc 是基址重定位表段

图1 W indows98记事本PE 结构图

280

计算机应用与软件2010年

虚拟偏移也称相对虚拟地址,是PE 程序载入到内存后在386保护模式下相对于基地址的偏移量。物理偏移也称文件偏移,是PE 文件存储在磁盘上相对于文件头的偏移量。原始大小是文件在磁盘上的结构大小。从图1中可以清晰地看到DOS 头、PE 头、区段表和各个区段的排列顺序与大小。使用W inhex 打开未加壳记事本程序,其DOS 头部和PE 头部的十六进制代码如图2所示

图2 W inhex 打开Notepad .exe 的DOS 头和PE 头

由图2可以看出DOS 头以“M Z ”

(0x4D5A )标志开始,在偏移0x14和0x16处指明DOS 代码的入口I P 和CS,在偏移0x3C

处指明PE 头的起始位置(0x00000080)。紧接着是PE 头(在

0x80处),它由“PE \0\0”

(0x50450000)标识开始,其后是20个字节的文件头和224个字节的可选头,整个PE 头有248个字

节。在偏移0x86处指明区段个数0x0005,如图1所示正好5个区段。在偏移0x A8处指明OEP (O riginal Entry Point 原始入口点,程序执行的第一条指令位置)地址为0x000010CC,在0x AC 处指明代码段基址(.text 段)为0x00001000,在0x B4处指明程序装载基址0x00400000。另外PE 头还包含文件对齐大小、内存对齐大小等等其他信息。其后是节表(secti on table ),它是一个结构型数组,其成员数表示该PE 文件的节数,每个成员中包含对应节的属性。每个节成员有40个字节,该记事本有5个成员,共200个字节(十六进制为C8)。最后就是各个区段结构,区段的大小没有限制。

3 加壳原理

加壳是应用某种算法对原程序进行压缩(压缩壳)或加密

(加密壳),并使程序运行时先运行对应的解压或解密代码。加壳过程一般为,首先在原程序中新建一个区段用来存放加密加压和解密解压代码,其次将原程序数据压缩或加密,最后将程序的入口点修改为壳代码入口。程序的入口点即程序开始执行的第一条指令的地址。如图3是Notepad .exe 加A s pack 2.12壳后的PE 结构图。从图中可以看出加壳后,程序会多.as pack 和.adata 两个区段,区段表的大小也增加到280个字节(十六进制:118)。其中.as pack 是A s pack 2.12壳代码区段,.adata 是附加数据区段。A s pack 属于压缩壳,通过对比发现,壳对原程序中的数据做了压缩处理,加壳后的区段原始大小均比未加壳时小

图3 记事本使用A s pack 2.12加壳后的PE 结构图

加壳会修改原程序的执行参数,如表1所示,是加壳前后Notepad .exe 的执行参数对比表。从表中可以看出加壳后其入口点被修改成壳代码的区段,其首字节和EP 区段均发生了变化。

表1 notepad .exe 加壳前后参数对比表

W indows 记事本

未加壳

加A s pack 壳后

入口点(OEP )000010CC 0000D001文件偏移量

000010CC 00004201EP 区段

.text .as pack 首字节55,8B ,EC,8360,E8,03,00壳信息

VC ++ 6.0

A s pack 2.12

4 脱壳原理

脱壳就是将加壳后的程序解压或者解密,使程序从原始入口点开始运行。脱壳分为硬脱壳和软脱壳。硬脱壳也称为静态脱壳,是根据加壳程序的算法,写出逆向的算法,就像压缩与解压缩一样。如UPX 的壳就有相应的脱壳程序。软脱壳也叫动态脱壳,该方法将程序加载到内存运行,使其自行脱壳后,抓取内存镜像,再重新构造标准的执行文件。该方法能较好对付加密壳和变形壳。脱壳一般会按查壳、寻找OEP 、du mp 程序、修复的顺序进行。

4.1 查 壳

现有工具如PE I D 、F I 、PE 2SCAN 等都能较好查出壳的类型。查壳的原理是将程序OEP 附近的代码和各种壳代码进行比较,从而判断程序是否加壳以及加哪种壳。类似于杀毒软件查杀病毒,都是通过特征码进行扫描对比。只是查壳的特征码对比一般都是在程序OEP 附近,而病毒的特征码则可以定位在程序的任何部分。

4.2 寻找O EP

壳在完成自己的任务后,会将控制权转交给真正的程序。由于壳代码和原始代码在不同的区段,两者之间距离较远,那么由壳代码区段运行到原始代码区段必定会存在一个大的跳转,因此可以根据大跳转来确定OEP 。另外,每种语言编写的程序其OEP 处的代码都有自己的特征,类似查壳的原理,就可以根据代码特征来判定OEP 。如表2所示,是不同的语言编写的程序在OEP 处的反汇编代码。

表2 使用不同语言编写的程序其O EP 处的反汇编代码表编程语言

机器码

汇编代码

Del phi

55

88EC 83C4F0B8A86F4B00P USH E BP

MOV EBP,ESP ADD ESP,210

MOV EAX,PE .004B6F A8VC ++

55

8BEC 83EC 4456

P USH E BP MOV EBP,ESP S UB ESP,44P USH ESI VB

FF256C10400068147C4000

J MP DWORD PTR P USH PE .00407C14CALL

&MS VBVM60.

#

100>

相关文档
最新文档