再读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必知必会》(2)

命令用 ; 结束,仅仅按 Enter 不执行命令 输入 help 或 \h 获得帮助 输入 quit 或者 exit 退出命令行程序 关键字(key word):作为 MySQL 语言组成部分的一个保...

熄灯之后的学习——再读《MySQL必知必会》(5)|| 过滤数据

搜索条件(过滤条件): 只检索所需数据需要指定的。 where子句在表名 (from子句)之后给出,在同时使用 order by 和 where 子句的时候,应该让 order by 位于 whe...

再读分布式一致性算法Raft论文

Raft是一个管理日志副本一致性的算法。相比Paxos结果一样,并且一样高效,但是理解起来更加的容易。Raft将一致性的主要元素分离开来,比如leader选举,log 复制,安全等。同时,也提供了一个...

java再读面向对象

成员变量 V/S 局部变量 成员变量:又叫属性,声明于类中方法外,作用范围所在的类(可放在最前面或最后面没什么影响),成员变量不必初始化系统会自动给初始化。 局部变量:声明于方法体中,...

再读《围墙》,生活我学陶渊明,做事我学马而立。

昨夜一场风雨,出了些许小事:建筑设计所的围墙倒塌了! 这围墙要倒,也在人们的意料之中,因为它太老了。看样子,它的存在至少有百年以上的历史了;已几经倒塌,几经修补。由于历次的修补都不彻底,这三十多公尺...
  • nailwl
  • nailwl
  • 2011-10-05 22:10
  • 4286

再读《The C Programming Language》 第二章 2.4 练习汇总

2.4 练习题汇总 Exercise 2-2.Write a loop equivalent to the forloop above without using &&or ||. ...

再读《The C Programming Language》 第一章 1.9 字符数组

1.9 字符数组 描述需求:读取一堆文本行,然后把最长的那句打印出来。 技术实现:书中写的非常好,用大白话把程序实现的思路一一描述了出来。我就不啰嗦了!当然这时候,如果是读谭老师的书,应该教同学们...

再读 第二篇 面向过程的程序设计3

数组名作函数实参时,不是把实参数组元素的值传递给形参,二手将实参数组首元素的地址传递给形参。 基类型 * 指针变量名     int *pointer; 调用函数时不会改变实参指针变量的值,但可以...

再读《C和指针》(笔记3)

一.数据: 整形包括:字符型,短整型,整型,长整型,它们都分为有符号和无符号两种。 长整型并不一定比短整型大,因为下面这个规定: 长整型至少应该和整型一样长,而整型至少应该和短整型一样长,因为这个...

再读greenplum的admin guide文档

masterThe master is where the global system catalog resides. The global system catalog is the set of...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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