论坛风格切换切换到宽版
  • 12546阅读
  • 11回复

深入剖析 Win32 可移植可执行文件格式(二) [复制链接]

上一主题 下一主题
离线大牛
 

发帖
3299
金钱
1760
威望
176
只看楼主 倒序阅读 0 发表于: 2010-08-15
— 本帖被 大牛 执行置顶操作(2010-08-15) —
                深入剖析 Win32 可移植可执行文件格式  
                                  第二部分  

                               作者:Matt Pietrek  

                                        

    上个月在本文的第一部分中,我首先对可移植可执行文件进行了全面的介绍。我讲了 PE文

件的历史和组成 PE文件头的数据结构,还讲了节表。PE 文件头和节表告诉你在可执行文件中都

包含什么类型的代码和数据,以及在哪里能找到它们。  

      

    本月我要讲一下常见的节。最后讲一下我的最新的经过彻底改进的PEDUMP程序,它可以在

2002年2 月的专栏中下载。如果你不熟悉PE文件的基本概念,应该首先读一下本文的第一部分。  

      

    上个月我讲了节是怎样的一个逻辑上属于一起的代码或数据块。例如可执行文件的所有导入

信息都在一个节中。现在让我们来看一下在可执行文件和 OBJ 文件中经常遇到的一些节。除非特

别说明,否则下表中的节名都来自Microsoft 的工具。  

名称         描述

.text      默认的代码节。

.data      默认的可读/可写数据节。全局变量通常在这个节中。

.rdata     默认的只读数据节。字符串常量和C++/COM虚表就放在这个节中。

.idata     导入表。实际上,链接器经常把.idata 节合并到其它节中(或者是明确指定的,或者是通

           过链接器的默认行为)。默认情况下,链接器仅在创建发行版的程序时才把.idata 节合并

           到其它节中。

.edata     导出表。当创建要导出函数或数据的可执行文件时,链接器会创建一个.EXP文件。这个.EXP

           文件包含一个.edata 节,这个节被添加到最后的可执行文件中。与.idata 节一样,.edata

           节也经常被合并到.text节或.rdata节中。

.rsrc      资源节。这个节是只读的。它不应该被命名为其它名称,也不应该被合并到其它节中。

.bss       未初始化的数据节。在最新的链接器创建的可执行文件中很少见到。链接器扩展可执行文件

           的.data节的VirtualSize域以便容纳未初始化的数据。

.crt       添加到可执行文件中的数据,用来支持C++运行时库(CRT)。一个比较好的例子就是用于调

           用静态C++对象的构造函数和析构函数的指针。要获取更详细的信息,可以参考2001年1 月

           的Under The Hood专栏。

.tls       这个节中的数据用来支持使用__declspec(thread)语法创建的线程局部存储变量。它包括数

           据的初始值,以及运行时需要的附加变量。

.reloc     可执行文件中的基址重定位节。通常DLL需要基址重定位信息而EXE并不需要。在创建发行

           版的程序时,链接器并不为 EXE 文件生成基址重定位信息。可以使用/FIXED 链接器选项移

           除基址重定位信息。

.sdata     通过全局指针(Global Pointer)相对寻址的“短(Short)”可读/可写数据。用于IA-64

           和其它使用全局指针寄存器的平台上。IA-64平台上正常大小的全局变量在这个节中。  

.srdata    通过全局指针相对寻址的“短(Short)”只读数据。用于 IA-64 和其它使用全局指针寄存

           器的平台上。  

.pdata     异常表。它包含一个 IMAGE_RUNTIME_FUNCTION_ENTRY 结构数组,这个结构与平台体系结构

           相关。数据目录中索引为IMAGE_DIRECTORY_ENTRY_EXCEPTION的项指向它。用于使用基于表

           的异常处理的平台,例如 IA-64。惟一不使用基于表的异常处理的平台是 x86(它使用的是
名称         描述

           基于堆栈的异常处理)。  

.debug$S   OBJ文件中的Codeview格式的调试符号(Symbol)信息。这是一列可变长度的CodeView 格

           式的调试符号记录。  

.debug$T   OBJ文件中的Codeview格式的调试类型(Type)记录。这是一列可变长度的CodeView格式

           的调试类型记录。  

.debug$P   可以在使用预编译头(Precompiled Headers)生成的OBJ 文件中找到这个节。  

.drectve   这个节包含链接器指令,并且只存在于OBJ文件中。这些指令是传递到链接器命令行的ASCII

           码字符串,例如:-defaultlib:LIBC。指令之间用空格分开。  

.didat     延迟加载导入数据。可以在非发行版本的可执行文件中找到。在发行版本中,延迟加载数据

           被合并到其它节中。  

导出表  

    当一个EXE或 DLL 导出函数或变量时,其它EXE或DLL 就可以使用这些导出的函数或变量。

为了简单起见,我把导出的函数和导出的变量统称为“符号”。当导出一些符号时,最起码导出

符号的地址需要能够以一种已定义好的方式被获取。每个导出的符号都有一个与之关联的序数,

它可以用来查找这个符号。同时,几乎总有一个ASCII码格式的字符串名称与这个导出的符号关

联。一般来说,导出的符号名与源文件中的符号名是一样的,尽管它们可以被修改的不一样。  

    通常,当可执行文件导入符号时,它使用的是符号的名称而不是它的序号。但是当通过名

称导入时,系统仅使用这个名称去查找所需符号对应的导出序数,然后根据这个序数值去获取相

应的地址。如果先使用的是序数值的话查找过程会快一点。通过名称导出和导入只是为了让程序

员使用方便罢了。  

    在.DEF文件中的Exports节中使用 ORDINAL 关键字可以告诉链接器创建一个导入库,这个

导入库强制函数只能通过序数导入而不能通过名称导入。  

我首先介绍IMAGE_EXPORT_DIRECTORY结构,如下表所示:  

大小     域                  描述

DWORD   Characteristics   导出标志。当前未定义任何值。  

DWORD   TimeDateStamp     导出数据的创建时间。这个域的定义与

                          IMAGE_NT_HEADERS.FileHeader.TimeDateStamp相同(从GMT时间1970

                          年1月 1日00:00以来的总秒数)。  

WORD   MajorVersion       导出数据的主版本号。未用,设置为0。  

WORD   MinorVersion       导出数据的次版本号。未用,设置为0。  

DWORD   Name              与导出符号相关的DLL的名称ASCII字符串的RVA(例如

                          KERNEL32.DLL)。  

DWORD   Base              这个域包含了这个可执行文件的导出符号所使用的序数值的起始值。

                          通常情况下这个值为1,但并不总是这样。当通过序数查找导出符号时,

                          将序数值减去这个域的值就得到了这个导出符号在导出地址表

                           (Export Address Table ,EAT)中的索引。  
天为什么这么黑, 因为牛在天上飞。
牛为什么飞天上, 因为我在地上吹!
汉化 摄影 音响CAD→→清风工作室
离线fx8332787

发帖
90
金钱
690
威望
69
只看该作者 1 发表于: 2010-09-05
用户被禁言,该主题自动屏蔽!
离线lixupeng
发帖
9
金钱
90
威望
9
只看该作者 2 发表于: 2010-10-01
收下了!!
离线mmmnnn

发帖
14
金钱
150
威望
15
只看该作者 3 发表于: 2010-10-28
     晕!
离线wjrice

发帖
32
金钱
270
威望
27
只看该作者 4 发表于: 2010-12-21
学习了,哈哈!
离线cndmad
发帖
3
金钱
30
威望
3
只看该作者 5 发表于: 2011-02-21
看了下 有些难度
离线ooook
发帖
6
金钱
50
威望
5
只看该作者 6 发表于: 2011-02-22
努力学习之中!!












厦门团购网厦门设计公司
离线雪域幽魂
发帖
1
金钱
10
威望
1
只看该作者 7 发表于: 2011-08-26
很强大,很好。支持了
离线huqicc368

发帖
14
金钱
110
威望
11
只看该作者 8 发表于: 2012-02-17
不错的文章啊,珍藏
离线leaguer

发帖
174
金钱
130
威望
13
只看该作者 9 发表于: 2012-02-18
再深入学习