news 2026/9/10 15:44:22

第3章 Windows运行机理-3.4 线程的机制(6)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第3章 Windows运行机理-3.4 线程的机制(6)

4. IMAGE_OPTIONAL_HEADER

PE头标的第三部分是一个IMAGE_OPTIONAL_HEADER类型结构。对于PE文件,这部分是必要的。除了标准的IMAGE_FILE_HEADER外,COFF格式还允许单独定义一个附加信息结构。

IMAGE_OPTIONAL_HEADER分为两种,一种是32位的,一种是64位的,我们可以在WINNT.H中找到对应的结构,其名分别为:

IMAGE_OPTIONAL_HEADER32各IMAGE_OPTIONAL_HEADER64。我们在这里只对32位进行介绍,其结构如下:

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// Standard fields.

//

WORD Magic;

BYTE MajorLinkerVersion;

BYTE MinorLinkerVersion;

DWORD SizeOfCode;

DWORD SizeOfInitializedData;

DWORD SizeOfUninitializedData;

DWORD AddressOfEntryPoint;

DWORD BaseOfCode;

DWORD BaseOfData;

//

// NT additional fields.

//

DWORD ImageBase;

DWORD SectionAlignment;

DWORD FileAlignment;

WORD MajorOperatingSystemVersion;

WORD MinorOperatingSystemVersion;

WORD MajorImageVersion;

WORD MinorImageVersion;

WORD MajorSubsystemVersion;

WORD MinorSubsystemVersion;

DWORD Win32VersionValue;

DWORD SizeOfImage;

DWORD SizeOfHeaders;

DWORD CheckSum;

WORD Subsystem;

WORD DllCharacteristics;

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;

Magic表示标志映像文件状态的一个WORD记号。值定义如下:

#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b

#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b

#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107

 0x0107:一个ROM映像。

 0x010B:一个普通的可执行映像(大多数文件含此值)。

MajorLinkerVersion和MinorLinkerVersion表示生成该文件的连接器版本号。该数字以十进制形式显示,而不是十六进制,一个典型的连接器版本号是2.23。

SizeOfCode表示所有代码段组合聚集在一起的尺寸大小,内存中整个PE映像体的尺寸。它是所有头和节经过节对齐处理后的大小。

SizeOfInitializedData表示由初始化的数据(不包括代码段)组成的所有节的总尺寸。

SizeOfUninitializedData表示初始化的数据的大小。未初始化的数据通常被归入称为.bss的一节中。

AddressOfEntryPoint表示映像开始执行位置的地址。PE装载器准备运行的PE文件的第一个指令的RVA。若您要改变整个执行的流程,可以将该值指定到新的RVA,这样,新RVA处的指令首先被执行。

BaseOfCode表示文件代码节开始处的RVA。典型情况下,代码节在PE头标之后,并在数据节之前进入内存。在微软生成的EXE文件中,该RVA通常是0x1000。

BaseOfData表示文件的数据节开始处的RVA。典型情况下,数据节最后进入内存,排在PE头标和代码节后面。

ImageBase表示当连接器创建一个可执行文件时,它假设该文件将被内存映射到内存中的一个指定位置上。也就是PE文件的优先装载程序的地址。因为在Windows操作系统中,总是把可执行程序安装到虚拟空间中去,每个虚拟空间在逻辑上都是相对独立的,不相干的。此值就是表示程序装在虚拟空间的什么地方开始。

SectionAlignment表示内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,则下一节必定从402000h开始,即使401000h和402000h之间还有很多空间没被使用。

FileAlignment表示文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,则下一节必定位于偏移量400h: 即使偏移量512和1024之间还有很多空间没被使用/定义。

MajorOperatingSystemVersion和MinorOperatingSystemVersion表示使用该可执行文件所要求的操作系统最小版本。该域含义有点模棱两可,因为subsystem域(后面的一些域)页体现类似的目的。在大多数Win32文件中,该域为版本1.0。

MajorImageVersion和MinorImageVersion表示一个用户自定义域。该域允许你具有一个EXE或一个DLL的不同版本。可用连接器的/VERSION开关来置该域的值,如LINK/VERSION:2.0 myobj.obj。

MajorSuvsystemVersion和MinorSubsystemVersion表示运行该可执行文件所要求的最小子系统版本。该域的一个典型值是4.0(意为Windows 4.0,即Windows 95)。

Reserved1一般总为0。

SizeOfImage一般是装载器不得不关心的映像部分的总尺寸。它是从映像基地址开始直到最后一节的尾端这个范围的长度。最后一节的尾端是被调整为最接近节对齐值的倍数的。

SizeOfHeaders表示PE头标和节(对象)表的尺寸。这些节的生数据直接跟在所有头标部分之后。

SizeOfHeaders =所有头+节表的大小

也就等于文件尺寸减去文件中所有节的尺寸。

CheckSum总是值0。

Subsystem表示该可执行文件为它用户接口而使用的子系统类型。WINNT.H定义了如下值:

// Unknown subsystem.

#define IMAGE_SUBSYSTEM_UNKNOWN 0

// Image doesn't require a subsystem.

#define IMAGE_SUBSYSTEM_NATIVE 1

// Image runs in the Windows GUI subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2

// Image runs in the Windows character subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3

// image runs in the OS/2 character subsystem.

#define IMAGE_SUBSYSTEM_OS2_CUI 5

// image runs in the Posix character subsystem.

#define IMAGE_SUBSYSTEM_POSIX_CUI 7

// image is a native Win9x driver.

#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8

// Image runs in the Windows CE subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 3:49:39

计算机毕业设计springboot航空大学就业服务平台 基于SpringBoot的民航院校毕业生就业信息管理系统 基于Java的航空类高校职业发展与招聘服务平台

计算机毕业设计springboot航空大学就业服务平台(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着我国航空运输业的蓬勃发展以及国产大飞机等战略项目的深入推进,航…

作者头像 李华
网站建设 2026/9/6 13:54:24

PPO算法(整理)

从TRPO到PPO:更简洁高效的强化学习算法 在强化学习领域,TRPO(置信域策略优化)算法凭借其理论上的性能单调性保证,在诸多场景中取得了出色的应用效果。然而,它也存在一个明显的短板:计算过程复杂,每一步更新的运算量都非常大,这在一定程度上限制了它的广泛应用。 为了…

作者头像 李华
网站建设 2026/9/6 21:40:33

这份榜单够用!9个AI论文网站测评:本科生毕业论文+科研写作全攻略

随着人工智能技术的不断进步,AI写作工具在学术领域的应用越来越广泛。对于本科生而言,撰写毕业论文不仅是一项重要的学术任务,更是一次综合能力的考验。然而,从选题构思到文献综述,再到内容撰写与格式规范,…

作者头像 李华
网站建设 2026/9/8 19:22:37

计算机毕业设计springboot汉东大学锦里校区食堂美食点评网 基于SpringBoot的校园餐饮评价与互动分享平台 JavaWeb高校食堂菜品推荐与用户反馈管理系统

计算机毕业设计springboot汉东大学锦里校区食堂美食点评网(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着移动互联网技术的普及与校园数字化建设的深入推进,高校…

作者头像 李华
网站建设 2026/9/5 11:23:07

三相不平衡潮流计算:基于Matlab的前推回代法实现

三相不平衡潮流计算matlab 程序采用前推回代法,考虑三相不平衡和互阻抗,可通过改变三相负荷和线路参数构建三相不平衡模型,程序运行可靠,有注释在电力系统分析中,三相不平衡潮流计算是一项重要的任务。今天就和大家分享…

作者头像 李华
网站建设 2026/9/5 10:08:03

可视化大屏展示Java基于springboot+vue的模拟证券交易软件平台

前言 在金融投资教育与实践领域,Spring Boot 模拟证券交易软件平台发挥着至关重要的作用。它依托 Spring Boot 强大的后端开发能力,为投资者尤其是新手提供了一个接近真实市场环境的虚拟交易场所,助力他们熟悉证券交易流程、积累投资经验、提…

作者头像 李华