pe 加载过程详解

转载自 cvvd
最终编辑 cvvd

PE文件格式作为Windows框架下的一种最为通用的可移植文件格式,被广泛使用的同时,也被广大Cracker研究。我写本系列文章的目的也主要立意于作为一名程序员或信息安全人员应该如何理解PE文件,这有助于我们对Windows旗下的win32子系统程序的理解和运用。闲话不多说。现在我们就将作为一个PELoader来学习一下PE文件是怎样运行起来的,它究竟何其他的文件有什么区别。

1.PE文件头,作为dos下程序的拓展,PE文件头部也包含了DOS可执行头部(IMAGE_DOS_HEADER 其大小为40H),我们可以在DOS头部的e_lfanew字段得到PE文件头相对于FILE_BEGIN的偏移,之后的结构就是IMAGE_NT_HEADERS

其中包含了4个字节PE文件标志(PE/0/0)、IMAGE_FILE_HEADER(大小为14H)及IMAGE_OPTION_HEADER(大小一般为E0H)

这个名为IMAGE_NT_HEADERS的结构对于一个PE文件是如此的重要,以至于它任何的一处错误都有可能让PE加载器弹出一个如下的错误:

图1

如你所想PE加载器会首先读取IMAGE_NT_HEADER结构并校检PE/0/0标志,之后PE加载器会预留被IMAGE_OPTION_HEADER中SizeofImage字段描述大小的内存空间,然后从IMAGE_FILE_HEADER的NumberOfSections中读取节头部的数量,并准备按照各IMAGE_SECTION_HEADER(节头部,它就接在IMAGE_NT_HEADERS之后)描述的信息将文件中各节的实体数据映射到内存之中。

2.关于文件头部大小,我们可以通过前面的知识计算出来分别是40h+DOS可执行残体大小+IMAGE_NT_HEADER大小+节头部总大小(IMAGE_SECTION_HEADER)(一个PE文件可能有很多节,节的数量由IMAGE_FILE_HEADER结构中的NumberOfSections字段决定)在测试文件中得出的大小是260H如图2。

图2

但我们在PE工具中得到的文件头部大小却是400H如图3。

图3

细心的你,一定会在WinHex找到答案,即从260H开始到400H的数据全为零。并且程序的第一节也是从400H偏移开始的如图4。

这样就是一个完整头部和实体的连接,那那400-260=140h的空间又用来干什么呢?这里就又涉及到一个知识,那就是PE文件的每个一块构件都必须是文件对齐颗粒的整数倍,本次测试的文件的文件对齐颗粒如图3是200h,而260比200多,使用要添零补齐也就是400h,这样做的好处也有很多,比如它可以更好的将数据映射如内存而不产生不对齐的问题,从而使代码的阅读产生障碍。其遗留下来的140h空间也可以作为新节头部的存储空间,为我们为程序添加一个新节提供了方便。今天就先将这么多,文章是断断续续发上来的,给朋友们的阅读带来了不便请见谅,谢谢~

posted @ 2012-07-08 10:51  麦小扣_刘  阅读(2319)  评论(0编辑  收藏  举报