再读PE结构(一)

原创 2007年09月17日 11:11:00
 还记得第一次见到PE这个名词的时候,还是在铜陵市图书馆里,在一本《计算机学报》里看到的,也不知道是哪一期了,当时也没看明白说的什么,看的云里雾去。第二次又见PE是半年前,因为工作需要,花了几天通了解了一遍,现在又忘的差不多,其中也有一部分当时看的就似懂非懂。所以现在在拾起来再看一遍,谁叫它是Windows的基础呢。费话就不多说了,下面开始。

PE结构鸟瞰
一、PE文件的存储形式
磁盘中的PE文件 ==>> 0:+-------------------+           +-------------------+    ImageBase <<=== 内存中的PE文件
                                 | DOS Header           |  ---->   | DOS Header          |
                                 |--------------------|             |-------------------|
                                 | PE Header              | ---->    | PE Header             |
                                 |--------------------|            |-------------------|
                                 | Section Talbe         | ---->    | Section Talbe        |
                                 |--------------------|            |-------------------|
                                 | Section 1               |  -+       |                           |
                                 |--------------------|   +-->  | Section 1               |
                                 | Section 2               | -+        |                           |
                                 |--------------------|  |         |------------------|
                                 | ...                        |  +-->   |                           |
                                 |--------------------|            | Section 2               |
                                 | Section n               | -+        |                           |
                                 +--------------------+    |       |------------------|
                                                                    |       | ...                           |
                                                                    |       |------------------|
                                                                    |       |                           |
                                                                    +--> | Section 2             |
                                                                            |                           |
                                                                            +-------------------+
 
    一般文件节(FileAlignment)的大小为512B(0x200),内存节(SectionAlignment)的大小为4K(0x1000)。也有文件节等于内存节的,这样载入速度是很快的,但相对来说,文件所占的磁盘空间也较大。

二、PE文件结构定义
可参考头文件WINNT.H
1 DOS Header: _IMAGE_DOS_HEADER结构
  记住结构中的最后一个LONG型的成员e_lfanew,一般在基址的3C偏移处,它的值指向PE Header的偏移。

2 PE Header: _IMAGE_NT_HEADERS结构
其结构定义为:
  typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

  _IMAGE_NT_HEADERS结构又包含了两个结构:IMAGE_FILE_HEADER文件头结构和IMAGE_OPTIONAL_HEADER可选头结构。
 1) IMAGE_FILE_HEADER文件头结构比较简单,其结构为:
typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;//目标CPU
    WORD    NumberOfSections;//节的数目
    DWORD   TimeDateStamp;//时间戳
    DWORD   PointerToSymbolTable;//
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;//可选头大小
    WORD    Characteristics;//文件属性标志位:可执行文件,驱动程序,DLL文件,系统文件等等。
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
 2) IMAGE_OPTIONAL_HEADER最为复杂,
  在这只要记住它包含了一个IMAGE_DATA_DIRECTORY数据目录的结构就行了。

3 Section Talbe节表:
节表数目有文件头结构的NumberOfSections成员指定。节表结构定义如下:
typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];//节名,可为任意,对OS不影响。
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;//一般指定为该项,该节在内存中的大小
    } Misc;
    DWORD   VirtualAddress;//该节在内存中的起始偏移量
    DWORD   SizeOfRawData;//该节在磁盘文件中数据的大小
    DWORD   PointerToRawData;//该节在磁盘文件中的起始偏移量
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;//节在内存中的特征:可读,可写,可执行等等。
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 

数据结构与算法分析再读之引论和算法分析

本章由两个问题引开,并证明了一些算法基础的数学公式。

熄灯之后的学习——再读《MySQL必知必会》(3)

SQL 语句不区分大小写 多条 SQL 语句必须以 ; 进行分隔 多数 SQL 人员认为,将 SQL 语句分成多行更容易阅读和调试 SELECT * FROM TABLENAME; 返回名为 TABL...

再读GOF设计模式之原型模式

1,简介 原型模式:          用原型实例来指向创建对象的种类,通过拷贝原型来创建新的对象。使用原型模式可以尽可能减少客户所知道的类的数目,独立于产品的创建,构成和表示,使运行时动态配置应用成...

再读《The C Programming language》 - 第一章 1.2 变量和算术表达式

1.2 变量和算术表达式 C语言是一门实践科学!以例子来讲解其自身在好不过了,但凡是要循序渐进,K&R大师立即给出了这个小程序,华氏温度和摄氏温度之间的转换,来引导大家!如果你学习到后面,相信这个程...

熄灯之后的学习——再读《MySQL必知必会》(9)|| 创建计算字段

字段field :基本与列 column 的意思相同。经常互换使用,不过数据库列一般称为列,而属于字段通常用在计算字段的连接上。拼接concatenate:将值联结到一起构成单个值。MySQL 中使用...

再读《我与地坛》

《我与地坛》这篇散文,我第一次阅读是在高中,其前一段和第二段被纳入人民教育出版社的高一教材中。前两部分注重讲地坛和他与母亲的后悔,对于中学生来说,这是一篇令人反思的出色文章。犹记得语文老师上课讲得很深...

再读LVS

警告:为了更深入地理解LVS,应该深入理解、测试8种调度算法中的每一种!!切记!!! 一、cluster 篇 在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请...

再读《The C Programming language》 - 第一章 1.1 入门

1.1 入门 第一章开始 K&R大师给出了经典的Hello,world!程序,如此轻松的带我们进入了神奇的C语言世界~,有个笑话是这样的“有个资深程序员想业余时间培养下其他爱好,于是想去练习书法,网...

再读《The C Programming Language》 第二章 2.2 运算符

2.2 运算符 运算是计算机的灵魂!不就是计算机计算能力比人强,所以我们要仰仗它么!其实在计算机里的运算也就那么几种,但用起来却变化无穷~ 1、算术运算 '+'   '-'   '...

Where Power Comes From - 再读Becoming A Technical Leader

晚上在看一些资料的时候,觉得有些烦躁,看不进去,于是随手拿起一本书来翻翻,是G. M. Weinberg的Becoming A Technical Leader,去年的8月份买的。这本书之前读完过,很...
  • superqa
  • superqa
  • 2011年10月17日 22:39
  • 1881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再读PE结构(一)
举报原因:
原因补充:

(最多只允许输入30个字)