这一章的上半部分大体介绍了下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. solr 远程代码执行(CVE-2019-12409)

    Apache Solr 远程代码执行漏洞(CVE-2019-12409) 简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.是apache的顶级开源项 ...

  2. 比较String 字符串的字节大小

    package com.ittx.edi.erp;import java.io.File;import java.io.FileWriter;import java.io.IOException;pu ...

  3. CentOS 7 卸载 OpenJDK 安装 OracleJDK

    查看 JDK 安装版本 java -version java version 1.7.0_51 OpenJDK Runtime Environment ( rhel-2.4.5.5.el7-x86_6 ...

  4. 从零学脚手架(八)---webpack-dev-server源码分析

    上一篇中介绍了webpack-dev-server属性配置 这一篇就简单的梳理下webpack-dev-server内部实现. 由于涉及到源码解析,所以会涉及到一些比较难啃的知识,我会尽量进行简单化描 ...

  5. [系统重装日志2]win10系统安装pytorch0.4.1(gpu版本)

    目录 0,资源整理 1,安装最新版的显卡驱动 2,安装visual studio 3,安装cuda 4,安装cudnn,配置环境变量 5,安装pytorch 6,安装torchvision 7,验证 ...

  6. 【故障公告】阿里云 RDS SQL Server 数据库实例 CPU 100% 引发全站故障

    非常抱歉,今天 8:48 开始,我们使用的阿里云 RDS SQL Server 数据库实例突然出现 CPU 100%  问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故障后立即进行主备切换,和 ...

  7. 数据调度组件:基于Azkaban协调时序任务执行

    一.Azkaban概述 1.任务时序 在数据服务的业务场景中,很常见的业务流程就是日志文件经过大数据分析,再向业务输出结果数据:在该过程中会有很多任务需要执行,并且很难精准把握任务执行的结束时间,但是 ...

  8. 通过xshell实现内网linux上公网yum、apt-get安装软件

    环境:在内网,我的机器可上网,内网服务器不可上网,本来在我机器上开个代理,服务器直接通过我机器上网就可以,奈何网络配置太复杂,目前只有ssh端口可通. 先安装ccproxy软件,配置http监听端口为 ...

  9. linux安装nginx 并配置文件服务器和代理服务器

    linux安装nginx搭建服务并实现文件服务器和代理服务器配置 1.课题的背景和意义 由于编码过程中需要进行文件上传服务,文件上传后 需要有http资源的路径需要访问.原则上可以通过Apache . ...

  10. 前端 | JS 任务和微任务:promise 的回调和 setTimeout 的回调到底谁先执行?

    首先提一个小问题:运行下面这段 JS 代码后控制台的输出是什么? console.log("script start"); setTimeout(function () { con ...