Windows逆向工程提升之IMAGE_OPTIONAL_HEADER

目录

[IMAGE_OPTIONAL_HEADER 概述](#IMAGE_OPTIONAL_HEADER 概述)

作用

位置

[IMAGE_OPTIONAL_HEADER 结构体字段详解](#IMAGE_OPTIONAL_HEADER 结构体字段详解)

数据目录(DataDirectory)​


IMAGE_OPTIONAL_HEADER 概述

作用

  • 描述PE文件在内存中的布局和运行时的关键参数。
  • 包含代码段、数据段、堆栈大小、入口地址、子系统类型等信息。
  • 对于可执行文件(EXE)是必需的(尽管名为"Optional"),动态链接库(DLL)也包含此结构。

位置

  • 位于PE头的第二部分,紧随 IMAGE_FILE_HEADER 之后。
  • 在32位和64位系统中有不同版本:
    • IMAGE_OPTIONAL_HEADER32(32位)
    • IMAGE_OPTIONAL_HEADER64(64位)

IMAGE_OPTIONAL_HEADER 结构体字段详解

|------------------------------|--------|---------------------------------------------------------|----------------------|
| 字段名 | 大小(字节) | 描述 | 32/64位差异说明 |
| ​Magic | 2 | 标识文件类型:0x10B(32位PE),0x20B(64位PE) | 关键标志位 |
| ​MajorLinkerVersion | 1 | 链接器的主版本号 | 可自定义 |
| ​MinorLinkerVersion | 1 | 链接器的次版本号 | 可自定义 |
| ​SizeOfCode | 4 | 所有代码节的总大小(.text段等,按FileAlignment对齐后的值) | 仅统计可执行代码 |
| ​SizeOfInitializedData | 4 | 已初始化数据的节总大小(如.data、.rdata段) | 包含全局变量、常量等 |
| ​SizeOfUninitializedData | 4 | 未初始化数据的节总大小(.bss段,文件不存储,内存中用零填充) | 文件偏移为0 |
| ​AddressOfEntryPoint | 4 | 程序入口点RVA(指向main或DllMain,若为0则无入口) | 加壳程序会修改此值 |
| ​BaseOfCode | 4 | 代码段起始RVA(通常为.text段,64位PE中仍保留) | 64位中意义相同 |
| ​BaseOfData | 4 | 数据段起始RVA(仅32位PE有效,64位PE中此字段被移除) | ​64位无此字段 |
| ​ImageBase | 4/8 | 首选加载基址(32位为4字节,64位为8字节,默认EXE=0x00400000,DLL=0x10000000) | 受ASLR影响实际基址可能不同 |
| ​SectionAlignment | 4 | 内存中节的对齐粒度(通常为0x1000即4KB) | 必须≥FileAlignment |
| ​FileAlignment | 4 | 文件中节的对齐粒度(通常为0x200即512字节,或0x1000) | 文件尺寸优化关键 |
| ​MajorOperatingSystemVersion | 2 | 要求的最低操作系统主版本号(如Windows 10=10) | 影响加载行为 |
| ​MinorOperatingSystemVersion | 2 | 要求的最低操作系统次版本号 | 通常为0 |
| ​MajorImageVersion | 2 | 映像文件的主版本号(由开发者定义,如程序版本号) | ​补充字段 |
| ​MinorImageVersion | 2 | 映像文件的次版本号 | ​补充字段 |
| ​MajorSubsystemVersion | 2 | 子系统主版本号(如GUI程序需≥4.0) | 兼容性关键 |
| ​MinorSubsystemVersion | 2 | 子系统次版本号 | 通常为0 |
| ​Win32VersionValue | 4 | 保留字段,必须为0 | ​补充字段 |
| ​SizeOfImage | 4 | 映像加载到内存后的总大小(按SectionAlignment对齐) | 必须准确否则加载失败 |
| ​SizeOfHeaders | 4 | 所有头结构(DOS头+PE头+节表)的总大小(按FileAlignment对齐) | 包含节表结束后的填充字节 |
| ​CheckSum | 4 | 文件校验和(用于驱动、系统DLL,EXE可选,工具可生成)CheckSumMappedFile | ​补充用途说明 IMAGEHlP.DLL |
| ​Subsystem | 2 | 子系统类型 | l决定是否显示控制台窗口 |
| ​DllCharacteristics | 2 | DLL属性标志 | ​补充标志位细节 |
| ​SizeOfStackReserve | 4/8 | 初始保留的栈大小(32位为4字节,64位为8字节,默认1MB) | 栈溢出防护相关 |
| ​SizeOfStackCommit | 4/8 | 初始提交的栈大小(32位为4字节,64位为8字节,默认4KB) | 动态扩展栈空间 |
| ​SizeOfHeapReserve | 4/8 | 初始保留的堆大小(32位为4字节,64位为8字节,默认1MB) | 堆管理相关 |
| ​SizeOfHeapCommit | 4/8 | 初始提交的堆大小(32位为4字节,64位为8字节,默认4KB) | 动态扩展堆空间 |
| ​LoaderFlags | 4 | 加载标志 | ​补充用途说明 |
| ​NumberOfRvaAndSizes | 4 | 数据目录项数量(固定为16) | 必须一致 |
| ​DataDirectory | 16×8 | 数据目录数组,每个条目包含VirtualAddress(RVA)和Size | |

数据目录(DataDirectory)​

数据目录是 IMAGE_OPTIONAL_HEADER 的最后一部分,包含16个条目,每个条目由两个字段组成:

  • VirtualAddress:数据结构的RVA地址
  • Size:数据结构的大小

|-----|------------------------------|------------------------------------|
| 索引 | 名称 | 用途描述 |
| ​0 | ​导出表(Export Table)​ | 存储DLL导出函数的名称、序号及地址,供外部程序动态链接。 |
| ​1 | ​导入表(Import Table)​ | 记录程序依赖的DLL及导入函数信息,加载时填充IAT(导入地址表)。 |
| ​2 | ​资源表(Resource Table)​ | 存储程序的图标、字符串、版本信息、对话框等资源。 |
| ​3 | ​异常表(Exception Table)​ | 包含结构化异常处理(SEH)。 |
| ​4 | ​安全目录(Security Directory)​ | 存储数字签名、证书等安全信息(独立于资源表,用于文件完整性验证)。 |
| ​5 | ​重定位表(Relocation Table)​ | 处理基址重定位(ASLR启用时调整内存地址)。 |
| ​6 | ​调试信息(Debug Directory)​ | 调试符号、时间戳及PDB文件路径(调试版本存在)。 |
| ​7 | ​架构特定数据(Architecture)​ | 保留字段,通常为0(历史遗留,未实际使用)。 |
| ​8 | ​全局指针(Global Ptr)​ | RISC架构中用于全局寄存器优化。 |
| ​9 | ​TLS表(Thread Local Storage)​ | 定义线程本地存储数据。 |
| ​10 | ​加载配置表(Load Config)​ | 安全特性配置(如SEH合法性检查、控制流防护CFG)。 |
| ​11 | ​绑定导入表(Bound Import)​ | 预绑定DLL地址以加速加载。 |
| ​12 | ​IAT(Import Address Table)​ | 导入函数的实际内存地址表,加载时由系统填充。 |
| ​13 | ​延迟导入(Delay Import)​ | 延迟加载的DLL信息。 |
| ​14 | ​CLR运行时头(COM Descriptor)​ | 与 .NET 程序相关的 CLR(公共语言运行时)头信息。 |
| ​15 | ​保留(Reserved)​ | 未使用,必须为0。 |

相关推荐
小马哥编程2 小时前
【软考架构】第七章 系统架构设计基础知识-7.2基于架构的软件开发方法:Architecture-Based Software Design,ABSD
架构·系统架构
西陵2 小时前
Nx带来极致的前端开发体验——任务编排
前端·javascript·架构
打码人的日常分享2 小时前
运维服务方案,运维巡检方案,运维安全保障方案文件
大数据·运维·安全·word·安全架构
WhoisXMLAPI3 小时前
WhoisXML API再次荣登2025年美国Inc. 5000快速成长企业榜单
网络·安全
LQ深蹲不写BUG5 小时前
微服务的保护方式以及Sentinel详解
微服务·云原生·架构
你是人间五月天5 小时前
sentinel实现控制台与nacos数据双向绑定
windows·sentinel
失散136 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
布列瑟农的星空6 小时前
大话设计模式——观察者模式和发布/订阅模式的区别
前端·后端·架构
lingggggaaaa7 小时前
小迪安全v2023学习笔记(七十九讲)—— 中间件安全&IIS&Apache&Tomcat&Nginx&CVE
笔记·学习·安全·web安全·网络安全·中间件·apache