作者:朱金灿
来源:http://blog.csdn.net/clever101/
最近抽空对PE文件格式做了一些研究。众所周知,PE文件格式是Windows平台下可执行文件的格式。为什么要研究PE文件格式?可能有人认为,做这件事就是一件重复造轮子的事,因为之前已经有无数人做过这样的事。但是有些事不是简单地以是不是重复造轮子来衡量的。研究PE文件格式对加深程序本质的认识和理解程序的构成都有很大的好处。美籍匈牙利科学家冯•诺依曼最新提出程序存储的思想,具体到研究PE文件格式,或许可以是运行程序所需的指令和数据是以怎样的组织结构存贮在文件的,在运行时程序是怎样被加载的,数据是怎样初始化的。
一个完整的PE文件结构一般由五大部分组成。如下图:
最开头的是部分是DOS部首,DOS部首由两部分组成:DOS的MZ文件标志和DOS stub(DOS存根程序)。之所以设置DOS部首是微软为了兼容原有的DOS系统下的程序而设立的。
紧接着的是真正的PE文件头。值得注意的是PE文件头中的IMAGE_OPTIONAL_HEADER32是一个非常重要的结构,PE文件中的导入表、导出表、资源、重定位表等数据的位置和长度都保存在这个结构里。
PE文件结构中可研究的内容很多,暂时讲解这么多,有兴趣的朋友可以阅读《Windows图形编程》中的第一章和《程序员的自我修养》的5.6节。
研究PE文件格式,最好的方法我觉得还是自己动手写一个PE文件解释类。看了《Windows图形编程》中的第一章,加深自己对PE文件结构的理解,我决定在袁峰大侠(《Windows图形编程》一书作者)编写PE文件解释类KPEFile的基础上增加一些接口。KPEFile类的构造函数是通过提供模块句柄来获取PE文件信息的,我发现这对运行中的程序是有用的,但对解析一个静态的exe文件并不有效。
编程实现分析一个PE文件,网上一般有两种做法:一是打开exe文件,然后利用Dbghelp库的一个函数ImageRvaToVa来获取你要打开结构的指针;另一种做法也大同小异,也是打开exe文件,自己计算所有获取信息的结构的偏移地址。我采用的是第二种做法。
下面是重要部分代码:
值得注意的是PE文件内部字符使用的多字节字符集,而VS 2005默认建的工程是使用unicode字符集,因为这个在解释pe文件时遇到一些挫折。
这个KPEFile现已兼容多字节字符集和unicode字符集。为此我还写了一个获取所有导入表的例子,相关源码已经上传,源码下载链接:KPEFile源码下载
。
在编写获取PE文件中的所有导入表的时候,如果你观察一些运行结果再联系书本上的知识,你会加深对原有知识的认识。比如下面是一个运行结果:
你比较一下导入的两个DLL:kernel32.dll和msvcp80d.dll,你可以看到导入的kernel32.dll函数都是很正常的字符,但是你看到msvcp80d.dll导入的函数中夹杂了?和@字符,联系所学的C++的知识,你很快明白kernel32.dll是一个C库,编译器没有对其进行名称修饰,而msvcp80d.dll是一个C++库,由于命名空间和虚函数的影响,编译器对其进行了名称修饰。
参考文献:
1. 《Windows图形编程》,作者:feng yuan
2. 《程序员的自我修养--链接、装载与库》,俞甲子、石凡、潘爱民等
3. 读取PE文件的导入表
,作者:hoodlum1980 ( 發發 )
分享到:
相关推荐
PE文件格式图,研究PE文件的朋友看看了
windows PE文件格式研究及PEDUMP的实现.大学生毕业论文+源代码.zip
基于PE文件格式的信息隐藏技术研究,方旺盛,郑剑,根据PE文件结构的特点,介绍了利用PE文件结构中的冗余空间,冗余字段和利用PE文件中静态分配的字符串存储空间进行信息嵌入的几种方
Delphi PE文件格式研究及PEDUMP的实现,专业论文+源码。 Windows PE文件格式分析与PEDUMP的实现-Windows PE File Format Analysis and realization of PEDUMP
PE 的意思就是 Portable Executable (可移植的执行体)。它是 Win32 环境自身所带的执行体文件格式。它的一些特性继承自 Unix 的 Coff (common object ...因而研究 PE 文件格式给了我们洞悉 Windows 结构 的良机
为什么要研究PE文件格式?可能有人认为,做这件事就是一件重复造轮子的事,因为之前已经有无数人做过这样的事。但是有些事不是简单地以是不是重复造轮子来衡量的。研究PE文件格式对加深程序本质的认识和理解程序的...
Win32平台下的PE文件病毒的研究及实现.pdf
WindowsPE文件结构及其加密的研究
文中在分析了信息隐藏技术的特点和原理的基础上,提出基于PE文件的信息隐藏模型。即将隐藏信息先通过Rijidael加密与置乱,再通过PE文件的段内冗余空间进行隐藏,提出了一种基于PE文件的信息隐藏方案,并对此方案的安全...
对PE(Portable Executable)文件进行加壳是保护软件的有效手段,但恶意程序也会通过加壳来保护自己。作为一名病毒分析师或软件安全分析员,只有先将其脱壳,才能进行彻底的分析。以Windows记事本程序为实例.
基于32位 Windows系统下PE文件格式漏洞研究的目的,通过从整体简析PE文件(Portable Executable File)框架结构,结合PE文件自身的结构特点的方法,阐述了PE文件的修改思想,探讨了在Win32 PE文件病毒应用领域的关键...
PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)...因而研究PE文件格式给了我们洞悉Windows结构的良机。
本文首先对PE文件格式进行了全面细致的研究,PE文件的头部结构对可执行文件进行了整体描述,是加壳脱壳工作的重要信息来源。接下来本文还分析了外壳的加载流程以及UPX的加壳流程,外壳的加载流程具有普遍规律,掌握...
pe文件结构(研究病毒传染机制),本文详细的介绍了EXE文件的内部逻辑结构,知道一看
内含多种工具,可对win32平台下的PE文件进行调试和分析,有利于进行PE文件的学习与深入研究
Win32平台下的PE文件病毒的研究及实现
PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)...因而研究PE文件格式给了我们洞悉Windows结构的良机。
关于WIndows下PE格式的加密研究 由本程序加密生成的可执行文件可以防止非法使用者对原程序的非法执行、修改、静态分析和拷贝。