您的当前位置:首页正文

WindowsPE文件结构及其加密的研究

2022-03-20 来源:步旅网
第19卷第2期Vol.19No.2湖 北 工 学 院 学 报 JournalofHubeiPolytechnicUniversity2004年4月

Apr.2004

[文章编号]1003-4684(2004)0420024203

WindowsPE文件结构及其加密的研究

肖俊武,杨海峰

(湖北工学院信息工程学院,湖北武汉430068)

[摘 要]介绍了PE文件的基本结构,以及对PE文件的.text和.data块的DES加密过程.为了防止加密过

的文件在执行时被动态调试软件如TRW2000、SOFTICE等跟踪,提出了“代码动态修正\"思想,即对解密模块的部分关键代码在执行时予以修正,从而达到保护软件的目的.

[关键词]PE文件;DES加密;反跟踪;代码动态修正[中图分类号]TP331

[文献标识码]:A

  自计算机出现之日起,其软、硬件发展日新月异,各种新思路层出不穷.CPU从最初的16位In2tel8086发展到了32位的PentiumIV,64位的CPU的可执行文件格式几乎全部是PE格式[2].PE文件

的框架结构如图1所示.

也即将上市;操作系统由最初字符界面的DOS发展到了图形界面的WindowsXP;应用软件规模也由最初的几十K发展到现在的几兆,几十兆字节.一款优秀的软件,其技术秘密往往是他人窃取的重点.因此,为了保护自己的软件成果,软件开发人员有必要对软件的加密及解密技术进行研究[1].

笔者在Windows2000+SP3平台上用VC++6.0和MASM32V8开发出一款PE文件的加密程

序,该程序可对Win32可执行文件进行加密,并有一定的反动态跟踪功能.

1 PE文件格式

众所周知,Microsoft的第一个32位操作系统WindowsNT有着VAXVMS和UNIX的血统.NT

1.1 DOS首部

PE文件最前的数百个字节是所谓的DOSStub:一个极小的DOS程序,用来输出“ThisPro2gramcannotberuninDOSmode\"之类的信息[3].在

开发小组中的许多关键人物在进入微软之前就是在那些平台上设计并编程.当他们开始设计NT时,很自然地他们会想到使用过去写过并测试过的工具.那些工具所产生的可执行文件及其目标文件的格式

称为COFF(CommonObjectFileFormat).COFF格式本身已有良好的基础,但还需要扩充以满足现代操作系统如WindowsNT的需要.更新的结果就PE(PortableExecutable)格式.现在,在Windows98、WindowsMe、Windows2000及WindowsXP上运行

早期Windows还不十分普及的情况下,如果在纯

DOS下运行PE文件,就会显示这样的信息.Mi2crosoft在WINNT.H为DOSStub定义了一个结

构:

IMAGE-DOS-HEADERSTRUCT{

 WORDe-magic; ∗∗ WORDe-ip;

[收稿日期]2003-09-26

[作者简介]肖俊武(1946-),男,湖北武汉人,湖北工学院教授,研究方向:电子信息技术.

 第19卷第2期           肖俊武等 WindowsPE文件结构及其加密的研究

 WORDe-cs; ∗∗

 LONGe-lfanew;}

25

其中,位于3CH处的e-lfanew指向真正的PE头.1.2 PE文件头

紧跟着DOSStub的是PE文件头,它由三部分组成,其定义如下:

IMAGE-NT-HEADERSSTRUCT

的话,就必需把某些地址调整为正确的值.

其他的块还包括.drective,.crt,.debug$t等.1.5 调试信息

这部分信息是供调试程序用的,在用VC++自带的调试器,SoftIce,Trw2000等调试程序时,如果程序提供调试信息,则可以进行符号级调试.

 SignatureDWORD?

 FileHeadderIMAGE-FILE-HEADER<>

 OptionalHeaderIMAGE-OPTIONAL-HEADER32<>

IMAGE-NT-HEADERSENDS

2 PE文件的加密

PE文件的加密不同于一般的数据加密,加密后

第一部分为Signature.对于PE文件,其内容为“PE00\",如果将它改为其它字串,PE载入器会不认识它而拒绝载入该文件.

第二部分为映像文件头.此结构包含一些最基本的文件信息,如可以执行该文件的CPU类型、块的数目、可选首部长度等.

第三部分为可选映像头.对PE文件而言,这一部分其实并不是可有可无.要知道,COFF格式允许不同的开发者在标准的IMAGE-FILE-HEADER之后再定义一个结构.IMAGE-OPTIONAL-HEADER正是PE设计者认为在基本的信息之外还需要的一些重要信息.在可选映像头中,最重要的是Image2Base、Subsystem和DataDirectory.1.3 块表(SectionTable)

的PE文件仍是可执行文件,它可以同正常的EXE

文件一样执行.用户最开始执行的实际是一段解密程序,它负责把用户原来的程序在内存中解密,然后把控制权交给解密后的程序,整个过程对用户来说是透明的.

常用的加密软件可分为两类:一类以压缩为目的,如ASPack,UPX和PECompact等;另一类以加密为目的,如ASProtect,tElock等.这些软件功能都很强大也十分流行,但同时也存在许多针对它们的破解软件.所以,作为软件开发者,应该对软件的加密有一定的了解.

笔者开发的PE文件加密软件分为两个模块:加密装配模块和解密模块.2.1 加密装配模块

本软件的加密模块采用DES加密算法(图2).

在PE文件头和真正的Section数据之间存在着一个块表.该表记录了PE文件中的每一个块的详细资料,如名称,大小,装入属性等.1.4 块(Section)

块是PE文件中用来存代码和数据的地方.如代码通常放在.text块中,数据放在.data块中.块类似32位的段,但事实上它们不是一个个的段(Seg2ments),而是进程虚拟地址空间中的一块内存区.常见的块如下:

.text:该块包含可执行代码.连接器通常把来

本软件只对PE文件的.text和.data块进行加密,用系统时间作为密钥,其加密过程见图3.

自.OBJ文件的.text集合到一个大的.text块中.

.data:用来存放已初始化的全局变量和静态变

量的地方.局部变量放在堆栈中.

.bss:用来存放未初始化的全局变量和静态变

量的地方.

.idata:该块是PE文件的输入表,包含该PE需

引入的DLL及函数信息.

.edata:PE文件的输出表.EXE文件一般不需要输出函数,通常只在DLL中才有该块.

.reloc:该块包含PE文件的重定位表.如果载

分别对.text和.data加密,加密后的数据写回原PE文件,这样,该PE文件的代码和数据都经过加密了.

显然这样的PE文件是不能执行的.还需要把解密模块的代码追加到PE文件的后面,并作相应

入器没办法把EXE或DLL文件载入到预设的地址

26

湖 北 工 学 院 学 报2004年第2期 

的调整,让解密模块最先得到控制权,这只要把PE

头中入口点改为解密模块的入口地址就可以做到.2.2 解密模块

该模块的主要任务是防止程序被动态跟踪、解密代码和数据、进行动态连接.反动态跟踪:目前比较有名的动态调试软件主要有SoftIce和TRW2000.判断程序是否被跟踪,主要原理是检查内存中是否存在SoftIce或TRW2000相关模块,如果存在的话,就退出执行.检测的方法很多,如用CreateFileA()打开它们的驱动程序,如能成功,说明它们已驻留内存;还有用专门的后门指令检测SoftIce等.本程序只是用CreateFileA()来检测.

本软件采用“代码动态修正\"技术来防止动态跟踪.一般软件在发现被动态跟踪之后,要么弹出警告对话框,然后退出;要么进入死循环,让解密者无法判断程序流程,从而达到反跟踪的目的.这种方法有一个弱点:就是在弹出对话框前或者进入死循环前有一条判断跳转指令,对于解密者来说,只要把这条指令的相应字节替换成NOP,一般都可以解决问题.“代码动态修正\"的基本思想是:把程序本该执行的某条指令,如CALLXXXXXXXX,这里的XXXXXXXX是某个函数的地址,替换成无关代码,如NOP,JMPYYYYYYYY等指令,这样,在进行代码修正前,地址为XXXXXXXX的函数就不会执行,程序也就不会按预定的流程执行下去,从而达到了保护软件的目的.具体实现过程为,首先判断系统中有没有动态调试软件,如果有,则不进行代码修正;如果没有,就修正相应代码.代码在修正以前,静态反汇编的结果只会是一团糟,根本看不出程序的真正意图,在一定程度上也降低了软件被成功静态反汇编的可能性.

解密代码和数据:其过程同加密类似,把代码和数据分别解密,得到原始代码和数据.

动态连接:得到原始代码和数据后,原程序还不能执行,因为还有一些外部函数调用没有解决.这只需要用LoadLibrary()把相应的DLL装入,再用GetProcAddress()得到相应函数的地址,填入到FirstThrunk所指向的数组就行了.

经过动态连接后,把控制权交给原程序,原程序就真正执行起来了.

3 结束语

软件保护的方法有很多,如商业软件常用软件狗或下载证书的方法来保护自己.然而,在Internet已经十分普及的今天,很多软件以共享方式发行,软件狗和证书的软件保护方式不大适合此类软件.因此,目前共享软件以“序列号+时间限制+KeyFile\"的方法来保护自己.这种方法有一个弱点,就是软件在静态反汇编或动态跟踪时,开发者的意图会直接暴露在解密者的面前.将“代码动态修正\"技术和以上保护方式相结合后,产生的代码在被修正前,反汇编的结果不可读,从而提高了软件的保护强度.

[ 参 考 文 献 ]

[1] 段 钢.加密与解密(第二版)[M].北京:电子工业出

版社,2003.

[2] MattPietrek.Windows95系统程式设计大奥秘[M].候

俊杰译.旗标出版有限公司,1995.

[3] 罗云彬.Windows环境下32位汇编语言程序设计

[M].北京:电子工业出版社,2002.

DiscussiononStructureofWindowsPEFileandItsEncryption

XIAOJun2wu,YANGHai2feng

(SchoolofInformationEngin.,HubeiPolytechnicUniv.,Wuhan430068,China)

Abstract:ThisarticleintroducesthebasicstructureofWindowsPEfileandtheencryptionofthe.textand.da2tasections.ItalsopresentsamethodofAnti2Debugwhichiscalled“CodeDynamicFixing\".Keywords:PEfile;DESencryption;anti2debug;codedynamicfixing

[责任编辑:张培炼]

因篇幅问题不能全部显示,请点此查看更多更全内容