第27卷第9期 计算机应用与软件Vol 127No .92010年9月 Computer App licati ons and Soft w are Sep.2010PE 文件中脱壳技术的研究李 露 刘秋菊 徐汀荣(苏州大学计算机科学与技术学院 江苏苏州215006)收稿日期:2009-01-07。
李露,硕士生,主研领域:网络安全,信息技术。
摘 要 对PE (Portable Executable )文件进行加壳是保护软件的有效手段,但恶意程序也会通过加壳来保护自己。
作为一名病毒分析师或软件安全分析员,只有先将其脱壳,才能进行彻底的分析。
以W indows 记事本程序为实例,首先分析了PE 文件结构及其加壳原理,其次阐述了脱壳的一般步骤,然后从压缩壳和加密壳的角度,重点探讨了脱壳技术的原理和方法。
最后对伪装壳和多重壳及程序自校验进行了探讨和分析。
关键词 PE 加壳 脱壳 伪装壳 多重壳 自校验O N UNPACK I NG TECHNOLO GY FO R PE F I L ESL 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 2checking0 引 言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.0A s pack 2.124 脱壳原理脱壳就是将加壳后的程序解压或者解密,使程序从原始入口点开始运行。
脱壳分为硬脱壳和软脱壳。
硬脱壳也称为静态脱壳,是根据加壳程序的算法,写出逆向的算法,就像压缩与解压缩一样。
如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 phi5588EC 83C4F0B8A86F4B00P USH E BPMOV EBP,ESP ADD ESP,210MOV EAX,PE .004B6F A8VC ++558BEC 83EC 4456P USH E BP MOV EBP,ESP S UB ESP,44P USH ESI VBFF256C10400068147C4000J MP DWORD PTR P USH PE .00407C14CALL <J MP .&MS VBVM60.#100>第9期 李露等:PE文件中脱壳技术的研究281Builder C++EB1066J MP SHORT PE.DB66Das m 6A00E8C50A0000P USH0CALL<J MP.&KERNEL32.Get M odul HandA>4.3 du m p内存所谓du mp就是转存,将内存中的进程数据抓取出来转存为文件格式。