这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习。

简单回忆一下:

3.4  PE文件头部解析

3.4.1 DOS MZ头
IMAGE_DOS_HEADER

DOS MZ头的下面是DOSS Stub。整个DOSS Stub是一个字节块,其内容随着链接时使用的连接器不同而不同,PE中没有与之对应的相关结构。

3.4.2 PE头标识Signature

紧跟在DOS Stub后面的是PE头标识Signature。与大部分分支文件格式的头部结构一样,PE头部信息中有一个四字节的标识,该标识位于指针IMAGE_DOS_HEANDER.e_lfanew指向的位置。其内容固定,对应于ASCII码的字符串”PE\0\0”

3.4.3  标准PE头IMAGE_FILE_HANDER

标准PE头IMAGE_FILE_HEADER紧跟在PE头标识后,即位于IMAGE_DOS_HEADER的e_lfanew值+4的位置。由此位置开始的20个字节为数据结构标准PE头IMAGE_FILE_HEANDER的内容。该结构在微软的官方文档中被称为标准通用对象文件格式(Common
Object File Format,COFF)头,它记录了PE文件的全局属性,该PE文件运行的平台、PE文件类型(是EXE还是DLL文件)、文件中存在的节的总数,其详细定义如下:

该结构常用于判断PE文件是EXE还是DLL类型,不但可以通过该结构得到PE文件中节的数量,还可以当成对接信息进行遍历操作时的循环次数。

3.4.4  扩展PE头IMAGE_OPTIONAL_HEADER32

尽管从名字上看好像该部分数据是可选的,但在PE文件结构中,它却有着比标准PE头更多的内容。详细定义如下:

文件执行时的入口地址、文件被操作系统装入内存后的默认基地址,以及节在磁盘和内存中的对齐单位等信息均可以在此结构中找到。对于该结构中的某些数值的随意改动可能造成对PE文件的加载或运行失败。

3.4.5 PE头IMAGE_NT_HEADERS

这个结构是广义上的PE头,在标准的PE文件中器大小为456个字节。它是3.4.2节、3.4.3节和3.3.4节中提到的三个数据结构的组合,即

IMAGE_NT_HEADERS=4个字节的PE标识  +
  IMAGE_FILE_HEADER +IMAGE_OPTIONAL_HEADER32:

该结构定义如下(汇编):

IMAGE_NT_HEADERS STRUCT

Signature DWORD ?   ;0000h                       -PE文件标识,”PE\0\0”

FileHeader IMAGE_FILE_HEADER <> ;0004h             -PE标准头

OptionalHeader IMAGE_OPTIONAL_HEADER32<>;0018h  -PE扩展头

IMAGE_NT_HEADERS ENDS

3.4.6  数据目录项IMAGE_DATA_DIRECTORY

IMAGE_OPTIONAL_HEADER32(扩展PE头)结构的最后一个字段位DataDirectory。

该字段定义了PE文件中出现的所有不同类型的目录信息。如前所述,应用程序中的数据被按照用途分成很多种类,如导入表、导出表、资源、重定位表等。在内存中,这些数据被操作系统以页位单位组织起来,并赋以不同的访问属性;在文件中,这些数据也同样被组织起来,按照不同的类别分别放在文件的指定位置。该结构就是用来描述这些不同类别的数据在文件(和内存)中的位置及大小的,因为这个字段比较重要。

从Windows NT 3.1
操作系统开始到现在,该数据目录中定义的数据类型一直是16种。PE中使用了一种称作“数据目录项IMAGE_DATA_DIRECTORY”的数据结构来定义每种数据。该结构只有两个字段,结构具体定义如下:

IMAGE_DATA_DIRECTORY STRUCT

VirtualAddress DWORD ? ;000h -
数据其实RVA

isize DWORD ?         ;004h -
数据块的长度

IMAGE_DATA_DIRECTORY ENDS

两个字段依次为VirtualAddress
和 isize。如图3-11所示,总的数据目录一共由16个相同的IMAGE_DATA_DIRECTORY结构连续排列在一起组成。

这16个元组的没组每一项均代表PE中的某一个类型的数据,各数据类型详见表3-1。

如果想在PE文件中寻找特定类型的数据,就需要从该结构开始。比如,要想查看PE中都调用了哪些动态间接库的函数,则需要从数据目录表的第2个元素的IMAGE_DATA_DIRECTORY结构获取导入表在文件中的起始位置和大小,然后再根据VirtualAddress_1地址指向的位置找到导入表相关的字节码。这种信息组织方式正式本章开始的“头部+身体”的数据组织方式。

下面是这16个数据目录项依次展开后的新结构:

3.4.7  节表项IMAGE_SECTION_HEADER

PE头IMAGE_NT_HEADERS后面紧跟着节表。它由许多节表项(IMAGE_SECTION_HEADER)组成,每个节表项纪录了PE中与某个特定节有关的信息,如节的属性、节的大小、在文件和内存中的起始位置等。节表中节的数量有字段IMAGE_FILE_HEADER.NumberOfSections来定义。

节表项的数据结构详细定义如下:

节表后面就是节的内容。截至节表,PE文件头设计的所有数据结构已经全部介绍完毕。接下来,集中对以上所有数据结构中每个字段进行详细介绍。

Windows Pe 第三章 PE头文件(中)的更多相关文章

  1. Windows Pe 第三章 PE头文件(上)

    第三章  PE头文件 本章是全书重点,所以要好好理解,概念比较多,但是非常重要. PE头文件记录了PE文件中所有的数据的组织方式,它类似于一本书的目录,通过目录我们可以快速定位到某个具体的章节:通过P ...

  2. Windows Pe 第三章 PE头文件(下)

    3.5  数据结构字段详解 3.5.1  PE头IMAGE_NT_HEADER的字段 1.IMAGE_NT_HEADER.Signature +0000h,双字.PE文件标识,被定义为00004550 ...

  3. Windows Pe 第三章 PE头文件-EX-相关编程-2(RVA_FOA转换)

    RVA-FOA之间转换 1.首先PE头加载到内存之后是和文件头内容一样的,就算是偏移不同,一个是磁盘扇区大小(400H)另一个是内存页大小(1000H),但是因为两个都是开头位置,所以相同. 2.看下 ...

  4. Windows Pe 第三章 PE头文件-EX-相关编程-1(PE头内容获取)

    获取pE头相关的内容,就是类似如下内容 原理:比较简单,直接读取PE到内存,然后直接强转就行了. #include <windows.h> #include <stdio.h> ...

  5. Android JNI入门第三篇——jni头文件分析

    一. 首先写了java文件: public class HeaderFile { private native void  doVoid(); native int doShort(); native ...

  6. C++-模板的声明和实现为何要放在头文件中

    源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 ...

  7. C ++模板的声明和实现为何要放在头文件中?

    源: http://blog.csdn.net/lqk1985/archive/2008/10/24/3136364.aspx 如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 ...

  8. c语言头文件中定义全局变量的问题

    c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...

  9. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

随机推荐

  1. 深入浅出新一代跨平台抓包&调式利器Fiddler Everywhere

    什么是Fiddler Everywhere? Fiddler Everywhere is a web debugging proxy for macOS, Windows, and Linux. Ca ...

  2. JS的this指向深入

    this指向深入 this的绑定规则 默认绑定 this默认指向了window 全局环境下this指向了window 函数独立调用,函数内部的this也指向了window <script> ...

  3. Azure Front Door(二)对后端 VM 进行负载均衡

    一,引言 上一篇我们讲到通过 Azure Front Door 为我们的 Azure App Service 提供流量转发,而整个 Azure Front Door 在添加后端池的时候可选的后端类型是 ...

  4. LNMP配置——Nginx配置 —— 用户认证

    一.配置 再来创建一个新的虚拟主机 #cd /usr/local/nginx/conf/vhost #vi test.com.conf 写入: server { listen 80; server_n ...

  5. Bug调试专项训练四笔记

    Ajax案例一 导入项目直接运行出现联想无反应 错误原因: 错误1: 55行找不到方法: 错误1解决方案: 解决错误1点击仍无反应 错误2:通过浏览器得出错误2:58行找不到方法 错误2解决方案: 解 ...

  6. [Python] 波士顿房价的7种模型(线性拟合、二次多项式、Ridge、Lasso、SVM、决策树、随机森林)的训练效果对比

    目录 1. 载入数据 列解释Columns: 2. 数据分析 2.1 预处理 2.2 可视化 3. 训练模型 3.1 线性拟合 3.2 多项式回归(二次) 3.3 脊回归(Ridge Regressi ...

  7. Linux入门视频笔记二(Shell)

    一.Shell脚本编程基础 1.简单地理解是脚本就是一堆的Linux命令或其他命令,把他们写到一起,打包成一个文件就是脚本,Shell脚本一般以.sh后缀结尾 2.sh text.sh:运行text. ...

  8. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...

  9. 8、MyBatis之使用注解开发

    9.使用注解开发 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的.而到MyBatis 3提供了新的基于注解的配置.不幸的是,Java 注解的的表达力和灵活性十分 ...

  10. Typora常用编辑方法-一个能将写博客变作享受的工具

    1,标题 ctrl+数字(1~5) 2,序号 数字序号 数字 + . +空格,之后回车换行会自动产生数字序号 非数字序号 有三种 实心圆 ,非实心圆与实心方框 都是 +空格 ,之后按tab键向内缩进, ...