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. HDFS原理及操作

    1 环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放 Hadoop等组件运行包.因为该目录用于安装had ...

  2. [大数据学习研究] 4. Zookeeper-分布式服务的协同管理神器

    本来这一节想写Hadoop的分布式高可用环境的搭建,写到一半,发现还是有必要先介绍一下ZooKeeper这个东西. ZooKeeper理念介绍 ZooKeeper是为分布式应用来提供协同服务的,而且Z ...

  3. Centos第一次使用配置IP地址

    1.vim /etc/sysconfig/network-scripts/ifcfg-eth0   修改默认配置文件 TYPE=Ethernet BOOTPROTO=static #静态 可修改为[n ...

  4. 20 (OC)* GCD、NSOperation、NSThread。多线程

    多线程编程技术的优缺点比较 NSThread (抽象层次:低) 优点:轻量级,简单易用,可以直接操作线程对象 缺点: 需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销. C ...

  5. 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式

    目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...

  6. Hadoop入门 之 Hadoop的安装

    1.安装Hadoop的三大步骤 答:1.Linux环境,2.JDK环境,3.配置Hadoop. 2.安装Linux 答:利用阿里云,腾讯云等公有云.选择Ubuntu进行安装,然后利用小putty进行操 ...

  7. vim编辑python脚本时Tab补全

    所属分类:成长之路 使用Linux写python脚本的时候,初期最痛苦的是什么?当然是各种库的不熟悉,知道了库,里面的方法还要挨个看,挨个记. 所以这时候,很多小伙伴使用了ipython,最强大的功能 ...

  8. java-ztest测试报告的搭建,python-BeautifulReport

    今天用testng的时候感觉测试报告贼丑又慢,以下图片是对比.了解到ztest,搭建的时候发现网上没有教程,对java真是太不友好了,所以步骤记录下吧.有疑问的可进群:231733032 使用ztes ...

  9. 教你用开源 JS 库快速画出 GitHub 章鱼猫

    本文作者:HelloGitHub-kalifun 在上一篇文章我们介绍了 Zdog 如何使用,接下来这篇文章我将带领各位利用 Zdog 画出一个 GitHub 章鱼猫(和官方的还是有些差别的). Zd ...

  10. 【ASP.NET基础--MVC】MVC视图基础语法学习

    初步接触.net MVC的视图语法,很多东西都不太熟悉,感觉跟之前的aspx以及html都有一些区别,最近看别人的代码,一边看一边研究,现把学到的东西在这里记录一下,以便日后翻阅. 第一部分:基础知识 ...