1 IMAGE_DOS_HEADER STRUCT 【M_DOS头部 共64字节】

{
+00 h WORD e_magic // DOS可执行文件标记 MZ(4Dh 5Ah)
+02 h WORD e_cblp ; Bytes on last page of file
+04 h WORD e_cp ; Pages in file
+06 h WORD e_crlc ; Relocations
+08 h WORD e_cparhdr ; Size of header in paragraphs
+0A h WORD e_minalloc ; Minimun extra paragraphs needs
+0C h WORD e_maxalloc ; Maximun extra paragraphs needs
+0E h WORD e_ss // DOS代码的初始化堆栈SS
+10 h WORD e_sp // DOS代码的初始化堆栈指针SP
+12 h WORD e_csum ; Checksum
+14 h WORD e_ip // DOS代码的初始化指令入口[指针IP]
+16 h WORD e_cs // DOS代码的初始堆栈入口
+18 h WORD e_lfarlc ; File Address of relocation table
+1A h WORD e_ovno ; Overlay number
+1C h WORD e_res[4] ; Reserved words
+24 h WORD e_oemid ; OEM identifier(for e_oeminfo)
+26 h WORD e_oeminfo ; OEM information;e_oemid specific
+29 h WORD e_res2[10] ; Reserved words
+3C h LONG e_lfanew // 指向PE文件头
} IMAGE_DOS_HEADER ENDS

2 DOS Stub【大约100个字节左右<此处字节数可选>】

3 typedef struct _IMAGE_NT_HEADERS 【PE文件头 共248字节】

{
+00 h DWORD Signature // PE标识头PE(50h 45h),共4字节
+04 h IMAGE_FILE_HEADER FileHeader // 结构体一,PE头共20个字节
+18 h IMAGE_OPTIONAL_HEADER32 OptionalHeader // 结构体二,PE文件共224字节
} IMAGE_NT_HEADERS ENDS, *PIMAGE_NT_HEADERS32;
结构体一:typedef struct _IMAGE_FILE_HEADER 【PE头共20个字节】
{
+04 h WORD Machine; // 运行平台
+06 h WORD NumberOfSections; // 文件的区块数目
+08 h DWORD TimeDateStamp; // 文件创建日期和时间
+0C h DWORD PointerToSymbolTable; // 指向COFF符号表(主要用于调试)
+10 h DWORD NumberOfSymbols; // COFF符号表中符号个数(同上)
+14 h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER3 2 结构大小
+16 h WORD Characteristics; // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; 
结构体二:typedef struct _IMAGE_OPTIONAL_HEADER【PE文件共224字节,其中数据目录表占128字节】
{
+18 h WORD Magic; // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1A h BYTE MajorLinkerVersion; // 链接程序的主版本号
+1B h BYTE MinorLinkerVersion; // 链接程序的次版本号
+1C h DWORD SizeOfCode; // 所有含代码的节的总大小
+20 h DWORD SizeOfInitializedData; // 所有含已初始化数据的节的总大小
+24 h DWORD SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28 h DWORD AddressOfEntryPoint; // 程序执行入口RVA
+2C h DWORD BaseOfCode; // 代码的区块的起始RVA
+30 h DWORD BaseOfData; // 数据的区块的起始RVA
+34 h DWORD ImageBase; // 程序的首选装载地址
+38 h DWORD SectionAlignment; // 内存中的区块的对齐大小
+3C h DWORD FileAlignment; // 文件中的区块的对齐大小
+40 h WORD MajorOperatingSystemVersion; // 要求操作系统最低版本号的主版本号
+42 h WORD MinorOperatingSystemVersion; // 要求操作系统最低版本号的副版本号
+44 h WORD MajorImageVersion; // 可运行于操作系统的主版本号
+46 h WORD MinorImageVersion; // 可运行于操作系统的次版本号
+48 h WORD MajorSubsystemVersion; // 要求最低子系统版本的主版本号
+4A h WORD MinorSubsystemVersion; // 要求最低子系统版本的次版本号
+4C h DWORD Win32VersionValue; // 莫须有字段,不被病毒利用的话一般为0
+50 h DWORD SizeOfImage; // 映像装入内存后的总尺寸
+54 h DWORD SizeOfHeaders; // 所有头 + 区块表的尺寸大小
+58 h DWORD CheckSum; // 映像的校检和
+5C h WORD Subsystem; // 可执行文件期望的子系统
+5E h WORD DllCharacteristics; // DllMain()函数何时被调用,默认为 0
+60 h DWORD SizeOfStackReserve; // 初始化时的栈大小
+64 h DWORD SizeOfStackCommit; // 初始化时实际提交的栈大小
+68 h DWORD SizeOfHeapReserve; // 初始化时保留的堆大小
+6C h DWORD SizeOfHeapCommit; // 初始化时实际提交的堆大小
+70 h DWORD LoaderFlags; // 与调试有关,默认为 0
+74 h DWORD NumberOfRvaAndSizes; // 下边数据目录的项数,Windows NT 发布是16
+78 h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 数据目录表【共占
128字节16个子参数】;结构体一
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
结构体一:typedef struct _IMAGE_DATA_DIRECTORY 【共占8字节】
{
+00 h DWORD VirtualAddress; //数据的RVA
+04 h DWORD Size; //数据的大小
}IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;

4 typedef struct _IMAGE_SECTION_HEADER 【区块表,共占40字节】

{
+00 h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 节表名称,如“.text”【共占8字节】
+08 h union
{ DWORD PhysicalAddress; // 物理地址
DWORD VirtualSize; // 真实长度,这两个值是一个联合结构,可以使
用其中的任何一个,一般是取后一个
} Misc;
+0C h DWORD VirtualAddress; // 节区的虚拟内存中RVA地址
+10 h DWORD SizeOfRawData; // 节表在文件中对齐后的尺寸
+14 h DWORD PointerToRawData; // 节表在文件中的偏移量
+18 h DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移
+1C h DWORD PointerToLinenumbers; // 行号表的偏移(供调试使用地)
+20 h WORD NumberOfRelocations; // 在OBJ文件中使用,重定位项数目
+22 h WORD NumberOfLinenumbers; // 行号表中行号的数目
+24 h DWORD Characteristics; // 节属性如可读,可写,可执行等
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; 

5 IMAGE_IMPORT_DESCRIPTOR STRUCT 【输入表结构,共20字节】

{
+00 h union
{DWORD Characteristics ; 不知到是神马浮云,不重要
DWORD OriginalFirstThunk //指向IMAGE_THUNK_DATA数组的指针
}ends
+04 h DWORD TimeDateStamp //可执行文件是否与DLL绑定,不绑定为0
+08 h DWORD ForwarderChain //第一个转向的API索引
+0C h DWORD Name //指向DLL的虚拟RVA
+10 h DWORD FirstThunk //实际指向IMAGE_THUNK_DATA数组的指针,结构体一
};IMAGE_IMPORT_DESCRIPTOR ENDS
结构体一:IMAGE_THUNK_DATA STRUC 【共占4字节】{
union u1
{DWORD ForwarderString ; 指向一个转向者字符串的RVA
DWORD Function ; 被输入的函数的内存地址
DWORD Ordinal ; 被输入的API的序数值
DWORD AddressOfData ; 高位为0则指向IMAGE_IMPORT_BY_NAME 结构体二
}ends
}IMAGE_THUNK_DATA ENDS
结构体二:IMAGE_IMPORT_BY_NAME STRUCT 【共占大小动态分配】
{
+00 h WORD Hint //可选指向函数字段,神马的浮云
+04 h BYTE Name ? //此处内存大小动态分配,定义了导入函数的以0结尾的字符串
};IMAGE_IMPORT_BY_NAME ENDS

6 资源

IMAGE_RESOURCE_DIRECTORY STRUCT 【资源表位于数据目录表的第三项,共动态分配字节,其中结构体中的成员指出的RVA偏移量都是对于此结构体的地址作为基地址】
{
+00 h DWORD Characteristics ; 理论上为资源的属性,不过事实上总是0
+04 h DWORD TimeDateStamp ; 资源的产生时刻
+08 h WORD MajorVersion ; 理论上为资源的版本,不过事实上总是0
+0A h WORD MinorVersion
+0C h WORD NumberOfNamedEntries ; 以名称(字符串)命名的入口数量
+0E h WORD NumberOfIdEntries ; 以ID(整型数字)命名的入口数量
};IMAGE_RESOURCE_DIRECTORY ENDS
IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT
{
+10 h DWORD Name ; 目录项的名称字符串指针或ID,高位为1时指向子结构体一
+14 h DWORD OffsetToData ; 目录项指针,高位为1时指向子结构体二
};IMAGE_RESOURCE_DIRECTORY_ENTRY ENDS
IMAGE_RESOURCE_DIR_STRING_U STRUCT
{
+00 h DWORD Length ; 字符串的长度
+04 h DWORD NameString ; UNICODE字符串,由于字符串是不定长的。由Length 制定长度
};IMAGE_RESOURCE_DIR_STRING_U ENDS
IMAGE_RESOURCE_DATA_ENTRY STRUCT
{
+00 h DWORD OffsetToData ; 资源数据的RVA
+04 h DWORD Size ; 资源数据的长度
+08 h DWORD CodePage ; 代码页, 一般为0
+0C h DWORD Reserved ; 保留字段
};IMAGE_RESOURCE_DATA_ENTRY ENDS

7 IMAGE_EXPORT_DIRECTORY STRUCT导出表

数据目录表的第一个成员指向导出表,是一个IMAGE_EXPORT_DIRECTORY(以后简称IED)结构,IED 结构的定义如下:

IMAGE_EXPORT_DIRECTORY STRUCT【导出表,共40字节】{+00 h DWORD Characteristics ; 未使用,总是定义为0+04 h DWORD TimeDateStamp ; 文件生成时间+08 h WORD MajorVersion     ; 未使用,总是定义为0+0A h WORD MinorVersion ; 未使用,总是定义为0+0C h DWORD Name     ; 模块的真实名称+10 h DWORD Base     ; 基数,加上序数就是函数地址数组的索引值+14 h DWORD NumberOfFunctions ; 导出函数的总数+18 h DWORD NumberOfNames ; 以名称方式导出的函数的总数+1C h DWORD AddressOfFunctions ; 指向输出函数地址的RVA+20 h DWORD AddressOfNames ; 指向输出函数名字的RVA+24 h DWORD AddressOfNameOrdinals ; 指向输出函数序号的RVA};IMAGE_EXPORT_DIRECTORY ENDS

8 【基址重定位位于数据目录表的第六项,共8+N字节】

IMAGE_BASE_RELOCATION STRUC
{
+00 h DWORD VirtualAddress ;重定位数据开始的RVA 地址
+04 h DWORD SizeOfBlock ;重定位块得长度,标识重定向字段个数
+08 h WORD TypeOffset ;重定项位数组相对虚拟RVA,个数动态分配
};
IMAGE_BASE_RELOCATION ENDS

PE文件数据结构汇总相关推荐

  1. 滴水三期:day41.2-PE阶段所有代码汇总(PE文件分析器基本C代码)

    一.代码汇总 1.功能如下 打印PE头字段 打印节表 将文件读入到FileBuffer,FileBuffer到ImageBuffer到newBuffer,最后存盘 RVA转FOA.FOA转RVA 向代 ...

  2. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...

    基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...

  3. PE文件和COFF文件格式分析——RVA和RA相互计算

    之前几节一直是理论性质的东西非常多.本文将会讲到利用之前的知识得出一个一个非常有用的一个应用.(转载请指明来源于breaksoftware的csdn博客) 首先我们说下磁盘上A.exe文件和正在内存中 ...

  4. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

    本文将讨论PE文件中非常重要的一部分信息.(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构."签名.COFF文件头和可选文件头"这三部分 ...

  5. PE文件详解(教程1-7)

    PE文件详解(教程1-7) ========================================= PE教程1: PE文件格式一览 PE 的意思就是 Portable Executable ...

  6. 小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

    小甲鱼视频讲解: https://www.bilibili.com/video/av6889190?p=6 https://www.bilibili.com/video/av6889190?p=7 从 ...

  7. PE文件学习系列二 DOS头分析

    合肥程序员群:49313181.    合肥实名程序员群 :128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com PE文件 ...

  8. pe文件签名信息检测技术

    [摘要] 签名信息中包含有很多有用的信息,可以辅助对二进制软件进行安全检测.读者可以从本博客中了解到pe文件中签名信息是如何组织的,如何用python代码从pe文件中获取内嵌的签名信息等知识. **什 ...

  9. 快速查询PE文件知识点和PE文件解析(下)

    延迟加载导入表 延迟加载导入表(Delay Load Import Table)是PE中引入的专门用来描述与动态链接库延迟加载相关的数据,因为这些数据所起的作用和结构与导入表数据基本一致,所以称为延迟 ...

最新文章

  1. JS Array filter()方法
  2. 星光灿烂 拍夜景的技巧和设置
  3. Liferay Portlet 结构分解
  4. java 读mdb,使用Java / Jackcess从加密的Access .mdb中读取
  5. [ 物联网篇 ] 03 - Yocto Project (YP)构建 Alexa SDK
  6. 2000坐标系xy坐标几位_2000国家大地坐标系
  7. 1853: [Scoi2010]幸运数字[容斥原理]
  8. Python开发【项目】:生产环境下实时统计网站访问日志信息
  9. 在线制图工具团队版介绍
  10. Anaconda Navigator卡logo打不开闪退问题处理方案-更换阿里云镜像源
  11. packet tracer 下载及简介
  12. bucket是什么意思?有什么作用?
  13. 云中的安全api使用云端点espv2 beta运行云功能和应用程序引擎
  14. 2013年中国40位40岁以下的商界精英(转载)
  15. Python爬虫核心知识-第二章:2.2 爬虫urllib.parse模块
  16. 第五章 机械加工工艺过程设计 小结
  17. 【题解】吉首大学第六届新星杯暨程序设计大赛(新生网络同步赛).2016
  18. python之界面案例
  19. 【光学】基于matlab模拟双孔干涉附matlab代码
  20. (PMP)第9章-----项目资源管理

热门文章

  1. springboot 控制台输出错误信息_springboot日志详解
  2. 转载:python pyppeteer手动、离线安装 chromium
  3. pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
  4. VS2013(Visual Studio 2013)官方中文旗舰版安装激活方法
  5. 学习正点原子讲解FreeRTOS中断管理心得和cortex-M3权威指南笔记
  6. CTFshow 命令执行 web50
  7. C程序中变量存放方式介绍
  8. STL_vector
  9. Vs定义超大数组时,stack OverFlow的解决方法
  10. 高滤波器opencv(Python)