news 2026/4/16 17:48:16

汇编语言全接触-50.PE教程1 PE文件格式一览

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-50.PE教程1 PE文件格式一览

考虑到早期写的PE教程1是自己所有教程中最糟糕的一篇,此番决心彻底重写一篇以飨读者。

PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)文件格式。"portable executable"(可移植的执行体)意味着此文件格式是跨win32平台的 : 即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有 win32执行体 (除了VxD和16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel mode drivers)。因而研究PE文件格式给了我们洞悉Windows结构的良机。

本教程就让我们浏览一下 PE文件格式的概要。

DOS MZ header

DOS stub

PE header

Section table

Section 1

Section 2

Section ...

Section n

上图是 PE文件结构的总体层次分布。所有 PE文件(甚至32位的 DLLs) 必须以一个简单的 DOS MZ header 开始。我们通常对此结构没有太大兴趣。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随 MZ header 之后的 DOS stub。DOS stub实际上是个有效的 EXE,在不支持 PE文件格式的操作系统中,它将简单显示一个错误提示,类似于字符串 "This program requires Windows" 或者程序员可根据自己的意图实现完整的 DOS代码。通常我们也不对 DOS stub 太感兴趣: 因为大多数情况下它是由汇编器/编译器自动生成。通常,它简单调用中断21h服务9来显示字符串"This program cannot run in DOS mode"。

紧接着 DOS stub 的是 PE header。 PE header 是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。当我们更加深入研究PE文件格式后,将对这些重要域耳目能详。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从 DOS MZ header 中找到 PE header 的起始偏移量。因而跳过了 DOS stub 直接定位到真正的文件头 PE header。

PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据,比如代码/数据、读/写等。我们可以把PE文件想象成一逻辑磁盘,PE header 是磁盘的boot扇区,而sections就是各种文件,每种文件自然就有不同属性如只读、系统、隐藏、文档等等。 值得我们注意的是 ---- 节的划分是基于各组数据的共同属性: 而不是逻辑概念。重要的不是数据/代码是如何使用的,如果PE文件中的数据/代码拥有相同属性,它们就能被归入同一节中。不必关心节中类似于"data", "code"或其他的逻辑概念: 如果数据和代码拥有相同属性,它们就可以被归入同一个节中。(译者注:节名称仅仅是个区别不同节的符号而已,类似"data", "code"的命名只为了便于识别,惟有节的属性设置决定了节的特性和功能)如果某块数据想付为只读属性,就可以将该块数据放入置为只读的节中,当PE装载器映射节内容时,它会检查相关节属性并置对应内存块为指定属性。

如果我们将PE文件格式视为一逻辑磁盘,PE header是boot扇区而sections是各种文件,但我们仍缺乏足够信息来定位磁盘上的不同文件,譬如,什么是PE文件格式中等价于目录的东东?别急,那就是 PE header 接下来的数组结构 section table(节表)。 每个结构包含对应节的属性、文件偏移量、虚拟偏移量等。如果PE文件里有5个节,那么此结构数组内就有5个成员。因此,我们便可以把节表视为逻辑磁盘中的根目录,每个数组成员等价于根目录中目录项。

以上就是PE文件格式的物理分布,下面将总结一下装载一PE文件的主要步骤:

当PE文件被执行,PE装载器检查 DOS MZ header 里的 PE header 偏移量。如果找到,则跳转到 PE header。

PE装载器检查 PE header 的有效性。如果有效,就跳转到PE header的尾部。

紧跟 PE header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。

PE文件映射入内存后,PE装载器将处理PE文件中类似 import table(引入表)逻辑部分。

上述步骤是基于本人观察后的简述,显然还有一些不够精确的地方,但基本明晰了执行体被处理的过程。

你应该下载 LUEVELSMEYER的《PE文件格式》。 该文的描述相当详细,可用作案头的参考手册。

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

值得买消费产业研究院联合鲸鸿动能发布2025彩妆报告,以消费洞察驱动产业高质量发展

鲸鸿动能广告联盟 近日,值得买消费产业研究院联合鲸鸿动能发布《2025年彩妆消费趋势与指数报告》(简称“报告”)。报告系统解析彩妆行业从“流量红利”向“心智红利”转型的深层逻辑,并运用“TSTE用户科学经营方法论”和“鲸鸿指数…

作者头像 李华
网站建设 2026/4/16 14:28:38

极验4滑块验证码逆向与纯算实现

极验4滑块验证码逆向与纯算实现 在当今自动化测试和数据采集的攻防战场上,验证码早已不再是简单的“看图识字”游戏。随着极验(Geetest)第四代滑块验证码在金融、社交、电商等高安全场景中的广泛部署,其背后复杂的加密链路和动态…

作者头像 李华
网站建设 2026/4/16 11:01:04

数据库合并与流程整合

数据库合并与流程整合 在算法竞赛和高强度数学推理的世界里,速度、精度与逻辑的严密性是决胜的关键。过去,我们习惯于将这些任务交给参数动辄上百亿甚至千亿的“巨无霸”模型——它们知识广博、语感流畅,但在面对需要多步推导、符号计算或严谨…

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

为什么说Open-AutoGLM是AutoML领域的下一个里程碑?

第一章:为什么说Open-AutoGLM是AutoML领域的下一个里程碑?Open-AutoGLM 的出现标志着自动化机器学习(AutoML)进入了一个全新的阶段。它不仅实现了传统模型选择与超参数优化的自动化,更深度融合了大语言模型&#xff08…

作者头像 李华
网站建设 2026/4/15 13:33:10

错过Open-AutoGLM可能意味着落后三年?:解读智谱AI云终端战略布局

第一章:智谱云手机的战略意义智谱云手机作为新一代基于云计算架构的虚拟移动终端,代表了终端计算范式从本地设备向云端迁移的重要趋势。其核心战略价值不仅体现在技术架构的革新,更在于对行业生态、用户体验与数据安全格局的深远影响。重塑移…

作者头像 李华