当前位置: 首页 > news >正文

第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

http://www.jsqmd.com/news/424945/

相关文章:

  • 初中语文文言文辅导哪家强?不花冤枉钱,家长直接抄作业 - 品牌测评鉴赏家
  • 矩阵加速
  • println() 与print() 的区别
  • 初中语文网课大揭秘!这几家平台让孩子成绩狂飙 - 品牌测评鉴赏家
  • 小型开发社区:娱乐游戏之后的下一步社交形态
  • 中国个人开发者社区构建的真实阻力与路径选择
  • 中考文言文翻译总丢分?5家宝藏线上机构实测推荐 - 品牌测评鉴赏家
  • 8.ts_内置对象代码雨
  • 开发者社区的“丧尸式“构建策略:从理论到实践
  • 亲测不踩雷!4款初中语文神仙APP,从基础到中考全覆盖(家长必存) - 品牌测评鉴赏家
  • 中考文言文翻译总丢分?5家宝藏线上机构实测推荐,适配不同基础初中生 - 品牌测评鉴赏家
  • PyTorch神经网络组件之Conv2d
  • 中考阅读理解丢分严重?3家靠谱线上机构实测推荐,帮娃高效提分不踩坑 - 品牌测评鉴赏家
  • 看2026上海家装,原木风装修厂家推荐排行来啦,轻奢大平层设计/新中式软装设计/原木风精装房设计,上海家装厂家有哪些 - 品牌推荐师
  • 2026初中语文阅读理解线上辅导大揭秘,选对机构成绩飙升! - 品牌测评鉴赏家
  • 这次终于选对AI论文工具,千笔·专业学术智能体 VS 云笔AI,专科生专属!
  • Task04:字符串
  • 261_尚硅谷_单元测试综合案例
  • 基于YALMIP和CPLEX的Matlab程序实现配电网故障重构模型的二阶锥优化方法,通用性高...
  • 用while循环输出1~1000之间能被5整除的数,并且每行输出3个
  • 实测才敢推!MBA专属降AI神器 —— 千笔·专业降AI率智能体
  • 初中语文提分秘籍!揭秘3家极速提分线上机构 - 品牌测评鉴赏家
  • 干货来了:千笔·降AI率助手,遥遥领先的降AI率工具
  • 2026年灰铁厂家推荐,精密圆棒生产与质量检测认证 - 品牌鉴赏师
  • 小学语文阅读理解辅导哪个平台好?实测5大热门平台,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • Copilot 模式和 Agent 模式的区别是什么?
  • 论文写不动?千笔ai写作,人气爆表的AI论文网站
  • std::stringstream 超详细讲解(C++ 字符串流)
  • 【ISAC】6G低空经济新突破!协作式ISAC技术实现无人机精准感知与参数估计【附MATLAB代码】
  • 什么是向量数据库?在基于大模型的应用开发中,向量数据库主要解决什么问题?