PE文件 是微软 Win32 环境下可执行文件的标准格式。

所谓的可执行文件并不仅仅是常见的 EXE 文件,DLL,SYS,VXD 等文件也都属于 PE 格式。

|-------> DOS_MZ_Header ------> 结构体:IMAGE_DOS_HEADER

|-------> DOS_Header ------|

|                                        |-------> DOS_Stub ------->"This program cannot be run in DOS mode."

|

PE 文件格式        |-------> PE_Header -------> 结构体:IMAGE_NT_HEADERS

|

|

|-------> Section_Table --------> 结构体:IMAGE_SECTION_HEADER

IMAGE_DOS_HEADER 结构体:

typedef struct _IMAGE_DOS_HEADER  // 该结构体大小为 64byte。
{
WORD e_magic;
// DOS 可执行文件标记。值为 0x5A4D,由于低位在前高位在后,所以存储为 0x4D5A。即 ASCII 字符为"MZ"。
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
// DOS 代码的初始化堆栈。
WORD e_sp; // DOS 代码的初始化堆栈指针SP。
WORD e_csum;
WORD e_ip;
// DOS 代码的初始化指令入口[指针IP]
WORD e_cs;
// DOS 代码的初始化堆栈入口。
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[];
LONG e_lfanew;
// PE 文件头偏移位置。
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

IMAGE_NT_HEADERS 结构体:

typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature; // 标识 PE 文件头部。值为 0x00004550,ASCII 码即 "PE00"。
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

IMAGE_FILE_HEADER 结构体:

typedef struct _IMAGE_FILE_HEADER
{
WORD Machine; // 计算机的体系结构类型。
WORD NumberOfSections; // 节数。这指示节表的大小, 它紧跟在标题后面。
DWORD TimeDateStamp; // 图像的时间戳的低32位。这表示链接器创建映像的日期和时间。
DWORD PointerToSymbolTable; // 符号表的偏移量
DWORD NumberOfSymbols; // 符号表中的符号数。
WORD SizeOfOptionalHeader; // 紧跟在该结构体后面的 IMAGE_OPTIONAL_HEADER32 结构体的大小。
WORD Characteristics; // 图像的特征。
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

IMAGE_OPTIONAL_HEADER32 结构体:

typedef struct _IMAGE_OPTIONAL_HEADER 
{
WORD Magic; // 图像文件的状态。
BYTE MajorLinkerVersion; // 链接器的主要版本号。
BYTE MinorLinkerVersion; // 链接器的次要版本号。
DWORD SizeOfCode; // 代码节的大小。
DWORD SizeOfInitializedData; // 初始化数据节的大小。
DWORD SizeOfUninitializedData; // 未初始化数据节的大小。
DWORD AddressOfEntryPoint; // 指向入口点函数的指针。
DWORD BaseOfCode; // 指向代码节的开头的指针
DWORD BaseOfData; // 指向数据节开头的指针
DWORD ImageBase; // 在内存中加载图像的第一个字节的首选地址。
DWORD SectionAlignment; // 在内存中加载的节的对齐方式。
DWORD FileAlignment; // 图像文件中各节的原始数据的对齐方式
WORD MajorOperatingSystemVersion; // 所需操作系统的主要版本号。
WORD MinorOperatingSystemVersion; // 所需操作系统的次要版本号。
WORD MajorImageVersion; // 图像的主要版本号。
WORD MinorImageVersion; // 图像的次要版本号。
WORD MajorSubsystemVersion; // 子系统的主要版本号。
WORD MinorSubsystemVersion; // 子系统的次要要版本号。
DWORD Win32VersionValue; // 必须为 0。
DWORD SizeOfImage; // 图像的大小。
DWORD SizeOfHeaders; // 头结构体的总大小,
DWORD CheckSum; // 图像文件校验和。
WORD Subsystem; // 运行此映像所需的子系统。
WORD DllCharacteristics; // 图像的 DLL 特征。
DWORD SizeOfStackReserve; // 要为堆栈保留的字节数。
DWORD SizeOfStackCommit; // 要为堆栈提交的字节数。
DWORD SizeOfHeapReserve; // 要为本地堆保留的字节数。
DWORD SizeOfHeapCommit; // 要为本地堆提交的字节数。
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

IMAGE_DATA_DIRECTORY 结构体:

typedef struct _IMAGE_DATA_DIRECTORY
{
DWORD VirtualAddress; // 表的相对虚拟地址。
DWORD Size; // 表的大小。
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

IMAGE_SECTION_HEADER 结构体:

typedef struct _IMAGE_SECTION_HEADER
{
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 用了定义区块名。
union {
DWORD PhysicalAddress; // 文件地址。
DWORD VirtualSize; // 加载到内存中的节的总大小
} Misc;

DWORD VirtualAddress; // 加载到内存中的节的第一个字节的地址 (相对于映像基)。
DWORD SizeOfRawData; // 磁盘上初始化数据的大小。
DWORD PointerToRawData; // 指向 COFF 文件中第一页的文件指针。
DWORD PointerToRelocations; // 指向该节的重新定位项开头的文件指针。如果没有迁移, 则此值为零。
DWORD PointerToLinenumbers; // 指向该节的行号条目开头的文件指针。如果没有 COFF 行号, 则此值为零。
WORD NumberOfRelocations; // 该节的搬迁条目数。此值为可执行图像的零。
WORD NumberOfLinenumbers; // 节的行号条目数。
DWORD Characteristics; // 图像的特征。
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

PE 文件格式详解的更多相关文章

  1. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  2. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  3. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  4. PE文件格式详解(七)

    PE文件格式详解(七)   Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了.   0x01 输出表结构 ...

  5. PE文件格式详解(下)

    作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...

  6. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  7. PE文件格式详解(六)

    0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以 ...

  8. PE文件格式详解(一)

    PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...

  9. PE文件格式详解(八)

    0x00 前言 前面了解了PE文件的输入和输出,今天来看看另一个重要的结构——资源.资源结构是很典型的树形结构,层层查找,最终找到资源位置. 0x01 资源结构介绍 Windows程序的各种界面成为资 ...

随机推荐

  1. Shiro使用Session缓存

    Shiro的Session缓存主要有两种方案,一种是使用Shiro自己的Session,不使用HttpSession,自己实现Shiro的Cache接口和Session缓存等:另外一种是直接使用spr ...

  2. 大数据平台搭建 - cdh5.11.1 - spark源码编译及集群搭建

    一.spark简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,Spark 是一种与 hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同 ...

  3. EasySwoole+ElasticSearch打造 高性能 小视频服务系统

    EasySwoole+ElasticSearch打造高性能小视频服务 第1章 课程概述 第2章 EasySwoole框架快速上手 第3章 性能测试 第4章 玩转高性能消息队列服务 第5章 小视频服务平 ...

  4. Salem and Sticks-萨鲁曼的棍子 CodeForce#1105A 暴力

    题目链接:Salem and Sticks 题目原文 Salem gave you 

  5. Windows认证 | 域认证

    在Windows中的身份认证方式有很多,也在不断的升级,但是在域中,依旧使用的是Kerberos认证. Kerberos 是一种网络认证协议,它的实现不依赖于主机操作系统的认证,无需基于主机地址的信任 ...

  6. Sentinel基本概念

     Sentinel是阿里开源的一款高性能的限流框架.这里将对Sentinel的使用和实现进行介绍.  这里先介绍下Sentinel中涉及到的基本概念,包括使用上或者实现上.主要是笔者在阅读文档和源码时 ...

  7. 编程范式 --- 函数式编程(Funtional Programming,简称FP)

    函数式编程(Funtional Programming,简称FP)是一种编程范式,也就是如何编写程序的方法论 主要思想:把计算过程尽量分解成一系列可复用函数的调用 主要特征:函数是"第一等公 ...

  8. css或Angular框架限制文本字数

    提需求的来了 某一期产品迭代时,新增了一个小功能,即:在单元格中的文本内容,字符超过20个字的时候,需要截断,并显示20个字符+一个省略号,未超过,无视. 这需求看上去不怎么复杂,看起来可以用css做 ...

  9. 【SQL server基础】object_id()函数

    在SQLServer数据库中,如果查询数据库中是否存在指定名称的索引或者外键约束等,经常会用到object_id('name','type')方法,做笔记如下: ? 语法:object_id('obj ...

  10. Hyperion: Building the Largest In memory Search Tree

    Introduction 索引在数据管理中起到很重要的作用,很多索引结构都会采用访问速度快而且内存消耗少的trie树,但一般常见的trie树索引结构都强调效率而忽视内存的效率,他们的效率虽然高,但内存 ...