PE 文件格式详解
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 文件格式详解的更多相关文章
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- PE文件格式详解,第三讲,可选头文件格式,以及节表
PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...
- PE文件格式详解(七)
PE文件格式详解(七) Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了. 0x01 输出表结构 ...
- PE文件格式详解(下)
作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...
- PE文件格式详解(上)
作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...
- PE文件格式详解(六)
0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以 ...
- PE文件格式详解(一)
PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...
- PE文件格式详解(八)
0x00 前言 前面了解了PE文件的输入和输出,今天来看看另一个重要的结构——资源.资源结构是很典型的树形结构,层层查找,最终找到资源位置. 0x01 资源结构介绍 Windows程序的各种界面成为资 ...
随机推荐
- Spring Boot 利用 nginx 实现生产环境的伪热更新
当我们在服务器部署Java程序,特别是使用了 Spring Boot 生成单一 Jar 文件部署的时候,单一文件为我们开发单来的极大的便利性,保障程序的完整性.但同时对我们修改程序中的任何一处都带来重 ...
- Unity3D_10_文件夹目录架构
一:几个特殊文件夹介绍 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论 ...
- win7 安装mysql5.7
Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini以及服务无法启动的解决办法以及修改初始密码的方法 LZ初学SQL,本来以为开源的安装很简单,但 ...
- apache ignite系列(二):配置
ignite有两种配置方式,一种是基于XML文件的配置,一种是基于JAVA代码的配置: 这里将ignite常用的配置集中罗列出来了,一般建议使用xml配置. 1,基于XML的配置 <beans ...
- CCPC桂林
在得知我们队伍前往桂林参加CPPC区域赛后,我是非常激动的,因为我们网络赛并没有得到名额,如果不是新都赠予我们名额,我们都没有出去打比赛的机会,同时,我们也不想浪费这个名额,我们也想打出成绩来,于是我 ...
- caffe学习一:ubuntu16.04下跑Faster R-CNN demo (基于caffe). (亲测有效,记录经历两天的吐血经历)
兜兜转转,兜兜转转; 一次有一次,这次终于把Faster R-CNN 跑通了. 重要提示1:在开始跑Faster R-CNN之前一定要搞清楚用的是Python2 还是Python3. 不然你会无限次陷 ...
- 【读书笔记】C++ primer 5th 从入门到自闭(一)
这几天看了C++ primer 5th的一二章,有很多收获,但是有的地方因为翻译的问题也搞得理解起来颇为难受啊啊啊啊.尤其是const限定符,在C语言并没有这么多复杂的语法,在C++里面语法细节就多的 ...
- 55 (OC)* 图片圆角处理
iOS图片设置圆角性能优化 问题 圆角虽好,但如果使用不当,它就是你的帧数杀手,特别当它出现在滚动列表的时候.下面来看圆角如何毁掉你的流畅度的. 实测 layer.cornerRadius 我创建 ...
- Kubernetes Dashboard 终结者:KubeSphere
原文链接:Kubernetes Dashboard 终结者:KubeSphere 2018 年 7 月份,青云在 Cloud Insight 云计算峰会上推出了一款全新的容器平台--KubeSpher ...
- Spring Cloud 负载均衡初体验
目录 服务搭建 1.注册中心--Eureka Server 2.服务提供方--Service Provider 3.服务消费方--Service Consumer 服务消费 Feign 与断路器 Hy ...