news 2026/4/23 11:55:39

汇编语言全接触-53.PE教程4 Optional Header

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-53.PE教程4 Optional Header

本课我们将要研究 PE header 的 file header(文件头)部分。

至此,我们已经学到了哪些东东,先简要回顾一下:

DOS MZ header 又命名为 IMAGE_DOS_HEADER.。其中只有两个域比较重要: e_magic 包含字符串"MZ",e_lfanew 包含PE header在文件中的偏移量。

比较e_magic 是否为IMAGE_DOS_SIGNATURE以验证是否是有效的DOS header。比对符合则认为文件拥有一个有效的DOS header。

为了定位PE header,移动文件指针到e_lfanew所指向的偏移。

PE header的第一个双字包含字符串"PE\0\0"。该双字与IMAGE_NT_SIGNATURE比对,符合则认为PE header有效。

本课我们继续探讨关于 PE header 的知识。 PE header 的正式命名是 IMAGE_NT_HEADERS。再来回忆一下这个结构。

IMAGE_NT_HEADERS STRUCT

Signature dd ?

FileHeader IMAGE_FILE_HEADER <>

OptionalHeader IMAGE_OPTIONAL_HEADER32 <>

IMAGE_NT_HEADERS ENDS

Signature PE标记,值为50h, 45h, 00h, 00h(PE\0\0)。

FileHeader 该结构域包含了关于PE文件物理分布的一般信息。

OptionalHeader 该结构域包含了关于PE文件逻辑分布的信息。

最有趣的东东在 OptionalHeader 里。不过,FileHeader 里的一些域也很重要。本课我们将学习FileHeader,下一课研究OptionalHeader。

IMAGE_FILE_HEADER STRUCT

Machine WORD ?

NumberOfSections WORD ?

TimeDateStamp dd ?

PointerToSymbolTable dd ?

NumberOfSymbols dd ?

SizeOfOptionalHeader WORD ?

Characteristics WORD ?

IMAGE_FILE_HEADER ENDS

Field name

Meanings

Machine

该文件运行所要求的CPU。对于Intel平台,该值是IMAGE_FILE_MACHINE_I386 (14Ch)。我们尝试了LUEVELSMEYER的pe.txt声明的14Dh和14Eh,但Windows不能正确执行。看起来,除了禁止程序执行之外,本域对我们来说用处不大。

NumberOfSections

文件的节数目。如果我们要在文件中增加或删除一个节,就需要修改这个值。

TimeDateStamp

文件创建日期和时间。我们不感兴趣。

PointerToSymbolTable

用于调试。

NumberOfSymbols

用于调试。

SizeOfOptionalHeader

指示紧随本结构之后的 OptionalHeader 结构大小,必须为有效值。

Characteristics

关于文件信息的标记,比如文件是exe还是dll。

简言之,只有三个域对我们有一些用: Machine, NumberOfSections 和 Characteristics。通常不会改变 Machine 和Characteristics 的值,但如果要遍历节表就得使用 NumberOfSections。

为了更好阐述 NumberOfSections 的用处,这里简要介绍一下节表。

节表是一个结构数组,每个结构包含一个节的信息。因此若有3个节,数组就有3个成员。我们需要NumberOfSections值来了解该数组中到底有几个成员。 也许您会想检测结构中的全0成员起到同样效果。Windows确实采用了这种方法。为了证明这一点,可以增加NumberOfSections的值,Windows仍然可以正常执行文件。据我们的观察,Windows读取NumberOfSections的值然后检查节表里的每个结构,如果找到一个全0结构就结束搜索,否则一直处理完NumberOfSections指定数目的结构。 为什么我们不能忽略NumberOfSections的值? 有几个原因。PE说明中没有指定节表必须以全0结构结束。Thus there may be a situation where the last array member is contiguous to the first section, without empty space at all. Another reason has to do with bound imports. The new-style binding puts the information immediately following the section table's last structure array member. 因此您仍然需要NumberOfSections。

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

YOLO模型部署到Kubernetes:自动化管理GPU节点集群

YOLO模型部署到Kubernetes&#xff1a;自动化管理GPU节点集群 在智能制造工厂的质检线上&#xff0c;上百台摄像头实时回传视频流&#xff0c;每秒需要处理数千帧图像以识别产品缺陷。传统做法是为每个检测任务单独配置一台服务器&#xff0c;但很快就会面临资源浪费、维护困难…

作者头像 李华
网站建设 2026/4/18 1:40:36

STM32的ADC是什么,其转换精度通常有那些选项?

在嵌入式系统与物联网设备的开发中&#xff0c;模拟信号采集是连接物理世界与数字世界的关键桥梁。无论是读取温度传感器的电压、检测电池电量&#xff0c;还是处理麦克风的音频信号&#xff0c;都离不开一个核心外设——模数转换器&#xff08;ADC&#xff09;。作为业界领先的…

作者头像 李华
网站建设 2026/4/21 14:32:51

Deno移动开发完整教程:Web技术构建全平台应用的终极方案

Deno移动开发完整教程&#xff1a;Web技术构建全平台应用的终极方案 【免费下载链接】deno denoland/deno: 是一个由 Rust 编写的新的 JavaScript 和 TypeScript 运行时&#xff0c;具有安全、快速和可扩展的特点。适合对 JavaScript、TypeScript 以及想要尝试新的运行时的开发…

作者头像 李华
网站建设 2026/4/18 6:52:05

YOLO在电力巡检中的应用:基于GPU的绝缘子缺陷识别

YOLO在电力巡检中的应用&#xff1a;基于GPU的绝缘子缺陷识别从一场暴雨后的巡检说起 去年夏天&#xff0c;南方某省电网遭遇强台风袭击。灾后抢修中&#xff0c;一支无人机巡检队紧急出动&#xff0c;对数百公里输电线路进行排查。以往需要数天才能完成的任务&#xff0c;这次…

作者头像 李华
网站建设 2026/4/22 6:24:57

JVM学习指南:从零开始掌握Java虚拟机知识体系

想要深入理解Java虚拟机知识体系&#xff0c;却不知从何入手&#xff1f;别担心&#xff0c;这份指南将带你从零开始&#xff0c;用最通俗易懂的方式掌握JVM核心概念&#xff0c;让你在技术道路上少走弯路&#xff01;&#x1f680; 【免费下载链接】jvm &#x1f917; JVM 底层…

作者头像 李华
网站建设 2026/4/18 0:43:23

7天快速上手:用MarkSheet免费开源项目开启你的网页制作之旅

7天快速上手&#xff1a;用MarkSheet免费开源项目开启你的网页制作之旅 【免费下载链接】marksheet Free tutorial to learn HTML and CSS 项目地址: https://gitcode.com/gh_mirrors/ma/marksheet 想学习网页制作却不知从何开始&#xff1f;MarkSheet这个完全免费的开源…

作者头像 李华