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程序的各种界面成为资 ...
随机推荐
- CLR中你想知道的事
CLR是什么? CLR 公共语言运行时,是一个可由多个语言共同使用的运行环境,核心(内存管理,程序集加载,安全性,异常处理和多线程) Visual Studio是一种编译器,编译器也可称为语法检查器和 ...
- Metasploit工具----辅助模块
Metasploit框架(Metasploit Framework,MSF)是一个开源工具,旨在方便渗透测试,他是有Ruby程序语言编写的模板化框架,具有很好的扩展性,便于渗透测试人员开发.使用定制的 ...
- DBCP
DBCP(DataBase Connection Pool)数据库连接池,由Apache公司开发.连接池的运用避免了反复建立连接造成的资源浪费,预先建立一些连接放在数据库连接池中,需要时取出,不需要时 ...
- 51 (OC) NSURLComponent 组成部分。
网页地址协议 url scheme
- 【POJ - 3723 】Conscription(最小生成树)
Conscription Descriptions 需要征募女兵N人,男兵M人. 每招募一个人需要花费10000美元. 如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱. 给出若干男女之前的1 ...
- 验证fstab文件修改是否正确
/etc/fstab文件是系统启动时要挂载点文件系统. 如果fstab文件配置错误,会导致系统无法正常启动. 最近我就是因为大意,在配置fstab重启服务器后,出现系统无法识别挂载点/opt/back ...
- 接口测试时数据格式是json,如何将响应内容转换为字典解析
import requests url = 'http://127.0.0.1:5050/index' def apiTestPost(url): datas = { 'a':'cisco3', 'b ...
- JMeter 压测Server Agent无法监控资源问题,PerfMon Metrics Collector报Waiting for sample,Error loading results file - see file log, Can't accept UDP connections java.net.BindException: Address already in use 各种疑难杂症
如何安装插件此博主已经说得很详细了. https://www.cnblogs.com/saryli/p/6596647.html 但是需注意几点: 1.修改默认端口,这样可以避免掉一个问题.Serve ...
- 读《深入理解Elasticsearch》点滴-查询分类
1.如何分类,略.个人不接受书中的分类方法,建议采用官网上的分类方法 2.term查询,可以模拟No-SQL数据库
- Cisco交换机基本使用命令
作者:小啊博 QQ:762641008 转载请声明URL:https://www.cnblogs.com/-bobo/ 一.进入命令行 switch> ...