PE文件结构详解 --(完整版)
来源:http://www.tudoupe.com时间:2022-03-23
From: https://blog.csdn.net/adam001521/article/details/84658708
博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、、博客、博客、博客、博客、、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、、
PE格式:段落表格和进口表格结构:https://blog.com/I'm sorry, csdn.
PE文件基本分辨率: https://ww.flickr.com/photos.com/photos.com/PEs/PEs/PEs-基于简况52pojie.cn/thread-102342-1-1-1.html
PE结构中的出口表/进口诊断 - 缩写: https://bbs.com/ no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no,, no, no,, no,, no,, no,, no, no, no,, no, no, no,, no,, no,, no, no,
分析PE文件格式:https://blog.org/I'm sorry,csdn.New York, 2月14569852/article/details/78120335。
这篇文章是我们特别报导埃及抗议活动的部分内容。 com/victive/av6861026。
马匹、杀人犯和病毒必须了解PE结构。
超详细图表中的 PE 文件结构如下:
图 1:

图 2:

图 3:

(一)基本概念
下表总结了本文件通篇的一些想法:
| 名称 | 描述 |
| 地址 | 这是"虚拟地址" 而不是"物理地址"为什么不提供一个“物理地址”? 由于数据在记忆中的位置经常发生变化,因此可以节省记忆成本,避免错误的记忆位置等等。 与此同时,用户不需要知道一个准确的“实际地址 ”, 因为系统将能够为应用创造记忆空间(只要内存足够大 ) 。 |
| 镜像文件 | EXE 文档代表“ 可执行文件 ”, DLL 文档则代表“ 动态链接库 ” 。 为什么是镜子? 因为它们经常被“ 复制” 到记忆中, 在镜子中有些意义 。 |
| RVA | 相对于镜像基地位置的偏移(也称为“反应虚拟地址”)。 |
| 节 | 在PE档案中,一个部分是代码或数据的基本单位,在概念上,各部分分为“代码部分”和“数据部分”。 |
| VA | 英文全称“虚拟地址”。 |
在 Windows 中, 可执行文档被称为 PE (可移动执行) 文件 。DLL,EXE,OCX,SYS等待。 它是由 Microsont 在 UNIX 平台的 COFF (通用对象文件格式) 的基础上建立的 。 最初是为了方便程序在多个操作系统中的可移动性, 此文件格式仅在 Windows 序列中使用 。PE文件包含32个可执行文件,通常称为PE32.64,可执行文件,称为PE+或PE32+,是PE(PE32)的延伸(请注意不支持PE64)。。
事实上,文件是否是 PE 文件与扩展名无关; PE 文件可以有任何扩展名。 因此, Windows 如何区分可执行文件和非可执行文件? 我们用 MaxinLibrary 发送文件名 。系统如何知道此文档是一个有效的动态库? 这是通过使用 PE 文件结构实现的 。

PE文档的结构通常在以下图表中描述:DOS头、NT头、节表,从职位开始。 具体的节。

PE文件执行令
- 当PE文件被运行时,PE 装载器首先检查 DOS 头中 PE 头的偏差。 如果检测到, 直接前往 PE 头的位置 。
- 当 PE 装载器到达 PE 信头时, 第二步是确保 PE 信头是合法的。 如果 PE 信头是有效的, PE 装载器进入 PE 信头的尾端。
- 时间表接近PE信头尾端第二阶段之后,PE装载器开始读取部分表格中的章节信息。执行 PE 文件时, 您也可以使用文件地图 。Windows 开始时不将完整文件装入内存 。这是一个记忆映射机制, 但它是一个记忆映射机制。也就是说,在装入时, Windows 装载器仅在虚拟地址和 PE 文件之间建立映射连接, 只有当存储页的指令真正被执行或特定页面的数据可以访问时, 此页面才会从磁盘传输到物理内存 。,该技术与装入文件的速度或文件的大小无关,可以将这些部分映射成内存,并添加表格中显示的读和写属性。
- 当将一个 PE 文件装入内存时, PE 装载器继续以与导入表相同的方式处理 PE 文件的逻辑组成部分 。
读者可以在这四个阶段审查PE文件执行顺序的具体细节。 (前四个阶段是从Hacker的分解中改编的。 )
PE文件的结构:
- 为使MS-DOS操作系统兼容,需要DOS头条。当此文件在MS-DOS上发布时,目标是提出文本。此软件不会以 DOS 模式运行, 还有一个原因 。用于定义文件 NT 头的位置 。
- NT信头提供关于Windows PE文件的最重要信息,例如“PE”签名、PE信头(IMAGE_FILE_HEADER)和PE信头(IMAGE_OPOPERAL_HEADER32)。
- 节表:是PE文档以下部分的说明,视窗根据分节表格的说明装载每一部分。
- 区域 : 每个区域是一个容器, 可以保存脚本、 数据等等。 每个区域可以拥有自己的内存权利, 例如 。 代码区域默认具有读/ 执行权限, 区域名称和编号可以独立定义, 而不是上图中显示的 3 个 。

相对虚拟地址RVA与虚拟地址VA
当一个 PE 文件装入内存时, 它被称为“ 图像 ” 。硬盘硬盘的PE文件与记忆中的PE文件并不完全相同。,与硬盘相比,它们被装入记忆后 占用的虚拟地址空间 略多于硬盘。这是因为硬盘驱动器上的各部分是连续不断的,并且与内存中的页面对齐,因此装入内存的各部分之间将有一些“空洞”。
由于这种调整,代表专业评价结构内一个地方的地址被以两种方式使用:
- 原始存储地址(又称实物地址)是保存在硬盘上的文件的地址。 显示与文件页眉的偏差
- 一旦将图片装入内存, 请在图片中命名地址 。相对虚拟地址( RVA), 表示内存图像偏移。

堆栈:堆栈中的数据仅暂时保存 。 ,临时储存地点可用作参数、当地变量、衍生中位数等等。。使用弹出数据,在使用数据时清除堆叠中的相关数据。
然而,某些CPU指令需要一个绝对地址。它类似于,比如,全球变数的地址。传递函数的地址,当然,生成的汇编指示必须在绝对地点使用,而不是与图像相对照。因此,PE文件提议操作系统将其装入内存地址(称为基地址)。地址只是一个起点。然而,基本地址并不是确切的地址。所谓基地址 ( 它可被视为一个汇编的全球变量。 它被定义为基准地址,作为计算相对偏差,即与地点有关的基础地址。以下是基础地址和偏转地址的定义: https://blog.51cto.com/godben/1746144 , 基本地址可被视为整个 PE 文件在内存中的页眉地址, 即文件开始的位置), 编译者利用这个地址确定代码中某些全球变量和函数的地址, 并在匹配命令中使用这些变量和函数 。

这被称为虚拟地址(VA)。

在 RVA 和文件偏移之间转换
https://www.bilibili.com/video/av28047648/?p=7

也许有人要问,如果有越共,为什么在越共面前会有越共?因此,尽管PE文件指定了要装入的基本地址,但这不是一个选择。然而,Windows有许多DLLs。每个软件都有自己的DLL如果另一个 DLL 已经拥有想要的地址呢?如果PE文件无法装入所需位置,该系统将协助他重新选择一个合适的基地地址,将他装入这里,旧的VA将停止使用。NT头存储装入 PE 文件所需的信息; 在知道 PE 的基本地址之前, VA 无效 。因此,大多数PE文件页头使用RVA表示地址,而代码则使用VA表示全球变量和功能地址。那又有人要问了,由于装货场已改变,AV不再起作用。那代码里找到的 VAs呢?答案是:重定位。该系统有自己的调整这些数字的方法。后续重新定位表上的文章将更深入地论述这个问题。既然有重定位,为什么NT头不能依靠重新定位 来改变地址到VA?由于并不是所有公共实体都搬家了,原始 EXE 未移动 。
我们都知道,PE文件可以导出其他PE文件可以使用的功能。您也可以从其他 PE 文件导入函数 。这些是如何做到的?通过导出表格, PE 文件确定导出哪个功能 。确定从导入表格中导入的函数。在单独一条中,进出口表格的具体结构详加说明。
PE文件与内存映像(映射)
小甲鱼视频:https://www.bilibili.com/video/av28047648/?p=4
就是把 PE 文件 从 硬盘中 放到 内存中 CPU 然后读取命令并将其从内存中执行 。


为确定位置,文件使用一个抵消(抵消),而内存使用VA(虚拟地址、虚拟地址)。
“VA”一词是指该过程虚拟内存的绝对地址。,RVA(相对虚拟地址,相对虚拟地址)是一个相对地址,从一个基点(图像基地)开始。VA和RVA之间存在以下转换连接:RVA+图像库=VA
***************************************************************
PE头的内部信息主要采用RVA格式。
其原因是,当PE文件(主要是 DLL)装入进程虚拟内存中某个地址时,该位置可能已经被其他PE文件( DLLS) 区域森占用,原因是,当PE文件(主要是 DLLS) 装入进程虚拟内存中某个地址时,该位置可能已经被其他PE文件( DLLS) 占用。
现在必须通过重定向将它装入另一个空白的地方,如果PE头条信息以VA为基础,一般是无法进入的。
因此, " 空中航线 " 被用来改变信息方向,即使已经重新定向,只要与基地位置相对的相对位置保持不变,所要求的信息可以适当调阅,不会出现任何困难。
***************************************************************
当运行一个 PE 文件时, 启动 PE 装载器 。进程分配 4GB 的虚拟地址空间 (关于虚拟地址空间的正式文件: https://docs.microsoft.com/zh-tw/windows-hardware/drivers/gettingstarted/virtual-address-spaces ),然后将应用程序用作虚拟内存的磁盘空间转移到4GB虚拟地址空间。虚拟地址空间0X400的坐标

扩展: 虚拟地址空间
集会进程地址:空间和虚拟存储空间:https://ww.flickr.orgI'm sorry, 博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客、博客
4 - 虚拟地址空间管理:https://ww.un.org/I'm sorry, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, cnblogs, nblogs, cnblogs, nblogs, cnblogs, nblogs, cnblogs, nblogs, nblogs, 。 4 - 虚拟地址: 虚拟地址:https://ww.un.org.org/I'm sorry, https://ww.org.org.org.org/iblogs.org/I'm, im, https, cnbblogs, comblogs, cnblogs, 4 - 4 - 虚拟地址: 空间管理:https. http:http:https.unbblogs. http:http:https.unblogs.unblogs.unblogs.unblogs. ww.unblogs.unblogs. ww. ww.unblogs. ww. ww.unblogs. ww. ww. ww.org.unblogs. ww.org.org.org.unblogs.unb.org/m.org/m.org/m.org/m.m.org.org/m.m.mbb.org/mbb.m.m.m.m.m.m.m.m.m.m.org/m.m.m.m.m.org/m.org.org/m.m.m.m.org/m.org/m.m.m.m.m.m.m.m.
该进程的虚拟地址空间分布:http://ww.un.org/I'm sorry, mamicode.Info-detail-24871221.html。
请接受我的歉意,csdn。这是我们特别报导的澳大利亚。 net/qq_33883085/article/tails/88430087。
这篇文章是我们2011年埃及抗争特别报导的一部分。
- 虚拟内存在 Windows 上,虚拟内存是指在硬盘上创建文件的过程 。存储闲置的内存或交换系统数据(放在哪里等)。这完全取决于操作系统。只有在机器的物理内存耗尽后才经常使用虚拟内存。才会使用到,但是,这个系统在现阶段已经严重受阻。但它不是毫无意义的。一些关于休眠过程的信息该系统可在虚拟记忆中完全进入。
- 虚拟地址空间: 窗口内每个过程都有自己的记忆区。,大小是4G,可以达到不到两G的空间。其余是系统保留的。这2G是能访问的,但是,它不是立即分发的。当进程使用多少时,这是将它与物理记忆区分开来的唯一的东西。它分为以下几部分:“地图”,虚拟内存的初始地址由操作系统标记。它被确定为匹配的物理内存地址。在这里,只有操作系统知道,没有办法了解任何程序。这是WINDOWS高级记忆管理机制选择的。物理内存的地址空间只有操作系统(硬件驱动器)可以访问。但是,它已经处于系统的底部。用户一级负责这一过程)。过程虚拟内存空间与物理内存空间之间的联系只是一张无法看到的地图。
(虚拟地址空间 多任务操作系统中的每个流程都在自己的存储盘中运行。虚拟地址空间(virtual address space)。虚拟地址空间分为两部分:内核空间和用户模式空间。页面表格用于将虚拟地址翻译为物理内存。操作系统维持由CPU引用的表格。每一步都用自己的页页表表示。在页面表中,内核空间享有更高程度的特权。因此,用户-国家方案试图通过引起页码错误来访问这些网页。当核空间仍然存在的时候,在所有过程中,它们都绘制了相同的物理内存图。与此相反,在每个进程开关上,用户模式空间变化的地图。)

- 当一个程序被实施时,它就成为一个过程,内核为每个运行过程分配同等数量的虚拟地址空间,允许几个程序同时运行,而不会相互干扰。
- 特别是,一个进程进入一个地址不会妨碍其他进程进入同一个地址。
- 每个进程有一个4GB(32)虚拟地址空间。每个过程都有自己的私人旧的3G区域,即后1G空间由每个过程共享,即“核内空间”。
- 进入内核的唯一办法就是..系统调用。
- 每个进程都有 4GB 地址空间; 在 CPU 中, 任何特定时刻只有一个虚拟地址空间。 虚拟地址空间随进程转换而不同 。


分析一个完整的程序

DOS 头(许多DOS头和DOS根)
信头结构(100 00-003F,64字节)


应当指出,大多数Win+Intel机器采用低端技术,在记忆中,字节是倒存的。
重要参数为e_magic和e_lfanew,它以多种颜色表示。

DOS储存库的根(0040-00BF,128字节)

Dos root 是一个直接的 DOS 应用程序。此软件不会以 DOS 模式运行 。即使没有监督事务司的存款,程序也能正常执行。 将监督事务司挖掘数据的概念作为参考。
NT 负责人(监督事务司最重要的负责人)e_lfanew决定显示 NT 信头在 DOS 信头之后离开文件起始地址的决定)
- IMAGE_NT_HEADERS32


- IMAGE_FILE_HEADER:有四个,如果文件设置不当,文件执行不当。
![]()
图解:

- IMAGE_ OPOPAL_HEADER: 其中九项参数必须正确设置, 否则文件将无法执行 。
这里发生了什么? p = 3 IMAGE_OPAL_HEADER
数据日志 [] 数据目录数组:每个数组都有独特的值。若干要素与各种数据结构有关。专注于进口和出口。这些是PE头部的关键组成部分。其余的都没那么重要大致了解下即可。
(二)可执行文件头
在(一) 基本概念中深入地介绍了《经济文件》的某些基本原则,首先全面讨论了《经济文件》的重要结构。
了解文件的格式应首先了解文件标题的重要性。由于关键信息储存在几乎所有文件格式的首部,该系统通过跟踪头部信息来解构整个文件。好吧,让我们来谈谈PE文件的头条结构 记得上一本书里的照片吗?

DOS 信头和 NT 信头是两个重要的 PE 文件信头。
一、DOS头
DOS信头是可用于MS-DOS操作系统的可执行文件。在32比特的PE档案中DOS的功能是显示一行文字。提醒: 我需要 32 个 Windows 来运行 。在我看来,这是一个不错的笑话。因为他跑得跟描述的一样快其实已经运行了,只是DOS身上没有工作 人们希望看到完成好吧,我承认这不是重点。但是,让我们看看这个头的界定方式:
我们只需要集中关注两个领域:
- e_magic: WRD 类型, 值为常数 0x4D5A, 值“ MZ” 在文本编辑器中显示, 所有可执行文件必须从“ MZ” 开始 。
- e_lfannew: DOS 头在相对于文件起始地址的 NT 页眉偏移。

二、NT头
我们可以使用DOS的头部的e_lfanew 来定位它。32位PE文件中最有用的头部是NT头部。,定义如下:
下图是一张真实的 PE文件头结构 以及其 各个域的取值 :


块对齐:

签署(签名):
16是 0, 16是 0x4550, 带有“ PE” 字符, 类似于 DOS 信头中的 e_ magic 。
PE文件头部的“C”定义是 IMAGE_FILE_HEADER。
以下是每一领域的确切定义:
机器: 此文档的操作平台为 x86、 x64 或 I64, 例如, 可以是以下数字之一 。
PE文件所列部分的数目,即表中各节的数目
TimeDateStamp: 通常在连接器的帮助下生成一个 PE 文件 。
点ToSymbolTable: 文件与 CIFF 文档符号表的差异 。
符号表:符号表的数量。
选择头的大小 : 下一个选择头的大小 。
特征: 可执行文件的属性可能处于以下阶段或地点之一。
可以看出,PE页头提供PE装载器装载时将使用的PE文件的一些基本信息和属性;如果装载器发现PE页头中描述的某些属性不符合目前的操作环境,PE页头将显示已终止的PE负荷,PE页头提供PE装载器装入时将使用的PE文件的一些基本信息和属性;如果装载器发现PE页头中定义的某些属性不符合目前的操作环境,PE负荷将终止。
PE 可选头 , 别把它当做你有选择,没什么选择
另一个重要的头就是 PE 可选头 连看他的名字都不用看 也不短然而,它因平台的不同而有所不同,例如,IMAGE_OPOPAL_HEADER32和IMAGE_OPAL_HEADER64分别为32和64。为了简单起见,我们只需看32。
PE 可选头各个字段分析说明
- 魔法:此属性表示潜在信头的类型 。
- LinkerVersion少校和次要LinkerVersion:链接的版本号 。
- 代码大小 : 代码段的长度, 如果有多个代码段, 代码段的总长度 。
- 初始化数据大小 : 初始化数据长度 。
- 未初始化数据大小:未初始化数据的长度。
- 程序门户网站上的RVA是入境点的地址。对于Exe, 这个地址相当于 Winmain 的 RVA 。对于DLL,这个地址可以被解释为DllMain的RVA。如果是驱动程序,这可被解释为DritricEntry的RVA。当然,切入点实际上不是WinMain。DllMain 和驱动程序这些功能之前先有一系列必须完成的初始化程序。当然,这不是本研究报告的主题。
- BaseofCode: 代码段起始地址的遥控飞行器
- BaseofData:RVA在数据部分的起始地址。
- 图像数据库: 如果图像无法装入此地址, 图像的基础地址( 推荐在内存中装入 PE 文件) 将被自动选中 DLL 。
- 部分变异:当将 PE 中的各部分放入内存时,它们与此字段提供的值如 0x100 和每个部分起始的地址为零一致。
- 文件对齐 : 在文档中, 区域与此值对齐, 部分的饱和必须大于或等于文件对齐 。
- 主要操作系统 -- -- 矿物操作系统 -- -- 系统:这似乎不像以前那样重要,因为需要的操作系统版本越来越多。
- 主要图像版本, 次要图像版本: 连接器填充图像版本号, 由创建者设置 。
- 主要子系统、次要子系统:所需子系统的版本号。
- Win32 VersionValue: 保留值必须是零。
- 图像大小 : 此值决定作为图像大小所占用的虚拟空间的大小, PE 文件的内存空间负荷是连续的 。
- 文件对齐符合所有信头的大小( 包括部分表格) 和大小页眉的大小 。
- CheckSum: 图像文件总计 。
- 子系统:运行 PE 文件所需的子系统可定义为以下内容之一:
- 桌面保存大小 : 运行时, 此函数会跟踪每个线条垫的内存大小 。
- 堆叠信条大小 : 执行时, 每个线条板会消耗最初的内存大小 。
- 数字储量大小: 运行时, 保持进程堆积的内存大小 。
- 心电感应的大小: 进程堆积在运行时的初始内存大小 。
- 装入炉渣: 保留必须设定为零。
- 数字RvaAndSizes:数据目录中的记录数量,即此数组中的条目数量
- 数据目录:数据目录,由下列项目组成:
- RVA代表虚拟地址。
- 大小 : 有一个大小 。
这两个数字有什么用?一个是地址,一个是大小,这个数据目录项目指定为区域。他定义的范围是什么?如前所述,数据局是一个数字。每个数组对应于一个特定的数据结构。,包括进出口表格等形式。,它基于许多指数,有许多结构。如以下代码所示,标题文件确定了每个项目代表的结构:
看到这么多的定义,大家估计要头疼了,很难从PE档案中学习这是一波从天而降的巨浪建筑。不用紧张,有了前面的知识,其余的被砍掉。下一个项目将开始解构此数据目录的剩余部分 。继续关注哦~
虫类、块名单和块块:https://ww.flickr.org对不起,Bilililili。怎么了?p=5
这篇文章是我们特别报导El Nio的一部分, 也是我们特别报导全球之声网络的一部分。 对不起, Bilibilili。怎么了? p= 6
(三)PE导出表
Aphid 视频 - 出口表: https://ww.flickr.com/I'm sorry, Bililili。 怎么了? p = 10

导出表是 用来描述模块(dll)。如果模块导出一个函数,该函数将在出口表格中注册,以便使用 GetProcExpress 函数动态抓取该函数的地址。
导出表扩展名不存在, 导出表存在于 dll 文件中, 是其它文件的导出函数 。

在最后一篇文章中,对PE文件结构做了完整描述(二),可执行信头的尾端是一大组。每个阵列代表一个不同的结构。Rtlimage 日志 EntryToData 方法可用于使用函数从数组获取对象 。3⁄4 ̄ ̧漯B函数原型如下:
PVOID NTAPI RtlImageDirectoryEntryToData(PVOID Base, BOOLEAN MappedAsImage, USHORT Directory, PULONG Size);
基数: 基地的模块地址 。
MappedAsimage: 是否应该绘制地图 。
目录中数据目录要素索引。
大小: 例如数据目录项的大小。 目录为零, 表示导出表格的大小 。
返回与数据目录项目初始地址相对应的值。
让我们从第一个开始: 将表格导出。
实际上,出口表用于描述模块(dll)。如果模块导出一个函数,该函数将在出口表格中注册,以便使用 GetProcExpress 函数动态抓取该函数的地址。
输出函数有两种方式:
- 一种方法是按按钮导出名称。
- 一种选择是按序号导出。
在出口表中,对这两种出口方法的描述也有所不同。
模块的出口功能可使用 " 依赖漫游工具 " 进行检查:

前一图片中的红框位置代表模块的导出功能。出口函数的名称有时带有若干符号。像 ??0CP2PDownloadUIInterface@@QAE@ABV0@@Z,这是 C++ 函数名称 。编辑器更改了名称 。
出口表的定义如下:
导出表结构:

同样,结构也相当直截了当,每个含义如下:
- 特征:不再使用,一般为零。
- TimeDateStamp: 连接器生成导出表格提供的时间戳 。
- 少校Version, 次要Version: 名字是一个版本, 但它似乎并不相关, 因为它全部是零。
- 名称: 模块名称 。
- 基数:序列号的基数乘以函数的序列号值,乘以来自基地的序列号。
- 职能编号:出口功能的总数。
- 名称数:导出的命名函数数 。
- 地址:地址:一个风险和增值局指出,DWORD出口功能的RVA阵列,其顺序与出口序号相同。
- 地址名称 : 一个 RVA 仍然指向 DWORD 阵列, 其中每个阵列指向函数名称 。
- 一种RVA, 名称名称名称地址也可以用来指WORD阵列。每个数组对应一个地址名称 。表示地址协议中的名称函数编号。

男孩的鞋身后面的五个人首先暴露在这个结构之下,他打倒了它,意识到这个结构比结构本身复杂得多,而且案文的描述无论如何含糊不清。

在上图中,地址名称指数组。数组包含一组RVA。每个RVA代表一个字符串。此字符串是导出函数名称 。3⁄4 ̄ ̧漯B在获得出口职能地址后,地址名称包含相同名称 。比如Func2,他是地址名的第二号第二个值使用地址Name Ordinals。这里是2,显示函数项被保存在标记为 2 的地址执行条目的数组中。即第三项,取出其中的值,在出口函数的地址中添加模块基础地址。如果该函数基于序列号,当你看的时候,你取一个序列号 然后从它中扣除基地。结果是函数在地址协议中的下标。

用代码实现如下:
(四)PE导入表
一个简短的竹鱼视频 - 进口表格: https://ww.flickr.com/I'm sorry, Bililili.
https://www.bilibili.com/video/av28047648/?p=9
导入表是导入函数,它包含在文件中,您自己使用它。
当装入 PE 文件时, 依附的 DLL (模块) 根据表格内容装入, 并填充所需函数的地址 。


C++ 代码:
PE 文档结构描述 (二) 文件演示文稿结束时的可执行页眉。(三) PE出口表格说明第一份出口表格的格式,此文章显示此数组的第二个元素: IMAGE_DirectORY_ENTRY_IMPORT, 其类型中的第一个。即导入表。
也许大家注意到过,IMAG_ 数据- 方向进口表格有各种名称。其中包括:IMAGE-DirectorOry_entry_entry_import。IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,IMAGE - 直接 - 直接 - 进口和IMAGE - 直接 - 直接他们之间有什么关系?听我慢慢道来。
- 我们最熟悉的进口表是IMAGE_DirectOry_ENTIY_IMPORT。当装入 PE 文件时, 依附的 DLL( 模块) 会被装入, 所需函数的地址会根据此表格的内容进行显示 。
- 具有约束力的进口表格是 IMAGE_DirectOry_ENTRY_BOUND_IMport。在装入该批次后,第一张进口表格中的进口地址被更改。如果将更多的 DLL 或函数导入到 PE 文件,则负载会大大减慢。因此,进口是有约束力的。在装入进口表格之前,已对表格进行了修改。这样就会快一些。
- 迟到的进口表格是 IMAGE_DirectOry_ENTIY_DELAY_IMPORT。AE 文件可以履行各种功能。此外,还进口了无数DLL。然而,并非所有负荷都用于它提供的所有功能。它不需要将其用于所有必须进口的 DLL 。这就是为什么进口出现延误的原因。只有一个PE文件使用所需的 DLL 。这就是DLL上膛的原因即使只使用单一的进口功能,此函数地址仅被更改 。
- 进口地址表是 IMAGE_DirectORY_ENTRY_IAT;前三个表格是进口功能的描述;真正的功能地址放在进口地址表中。
以下列图像为例:

此代码执行 RegOpenKeyW 导入函数 。其代码为FF 15 00 19 30。事实上,论坛第十五届会议表示,这是一个间接呼吁。调用 dword ptr [301900], 然后调用 dword ptr [301900]这意味着要拨打的地址为30190,00。地址30190,00 在进口地址清单的范围之内。当模块加载时,根据进口表格中的信息,PE装载器修改30190,00内存的内容。

因此,如何更新 IAT (进口地址表) 来说明进口表格中的信息?让我们看看进口表格的定义:
提供 RtlImage EntryToData 编号 1 的索引。他们将得到一个类似于 结构顶部的指针。实际上,它指向了这些结构的集合。导入的任何 DLL 成为一个数组的成员 。也就是说,此结构对应于导入的 DLL 。
- 质量和最初的尝试:一团乱。如果数组的最后一项为 0,RVA 被原创初星拯救了表示包含 IMAGE_THUNK_DATA 的数组。这些阵列中的每一阵列都是进口函数的表示。
- TimeDateStamp: 其值在图片被绑住之前为 0, 然后输入模块的时间戳 。
- 转发链:转发链;如果没有转发器,这个值为-1。
- 名称:指向进口模块名称的RVA,而IMAGE_IMPOR_DEscripptor则指向进口的 DLL。
- 首先:它也是RVA,指向IMAGE_THUNK_DATA的阵列。

原始第一图克和第一图克与此有许多关系, 因为他们指向 IMAGE_THUNK_DATA 阵列 。此外,这些领域的名称也非常相似。他俩有什么区别呢?为了解答这个问题,IMAGE_THUNK数据结构:
转发符字符串用于转发数据 。暂时不用考虑,函数地址由动作表示 。如果您按序号导入奥迪纳尔, 将会很方便 。导入地址( 地址) 时指向名称信息 。可以看出,这一结构是一个庞大的联盟。我们都知道,一个包含许多领域的工会, 在不同的时间可以传达各种含义, 不管是名字还是序列号。该如何区分呢?Ordinal可以用来做决定如果奥迪纳尔的最高位置是1就是按序号导入的,这时候,进口序号低16位数。如果最高位是0,地址Data是一种RVA。这是一个叫做IMAGE_IMPORT_BY_NAME的结构。用来保存名字信息,不允许Ordinal和地址OfData使用相同的内存空间,因为它们实际上在同一内存空间。因此,地址OfData 仅比RVA低31个位子, 这就是所有关于RVA的说法。因此,PE文件不能大于2GB。因此,最大值始终为零。这是对空间利用的明智做法。微软公司实际上通过提供两个宏观定义的处理序列号来编制代码:IMAGE_SNAP_BY_ORDINAL负责确定是否按序列号进口,IMAGE_SNAP_BY_ORDINAL负责确定是否按序列号进口。进口序号使用IMAGE_ORDINAL获得。
使用第一洞,我们可以回顾 原始第一洞。导入的数据存储在由原始FirstThunk控制的 IMAGE_THUNK_DATA 阵列中。在此数组中, 只有 Ordinal 和地址OfData 可用 。因此,该函数的地址可以使用原始FirstThunk搜索检索。第一次是有点不同。在装入 PE 文件之前或执行导入表之前,他指的阵列与最初的“第一洞”相同,但不是相同的阵列。尽管如此,实质是相同的。都包含了导入信息,而在加载之后,FirstThunk 函数被激活 。他表示真正的功能地址。因为第一层 真正连接到一个在IAT的所在地,IAT作为 IMAGE_THUNK_数据阵列。加载完成后,这些ITT要素被转换成现实世界的功能地址。这就是活动的定义。让我们看看它和最后一个相比如何:

上图是加载前。

上图是加载后。

最后总结一下:
进口表格包括一个IMAGE_IMPOR_DEDIRIPtory阵列,每个进口DLL都有一个IMAGE_IMPORT_DEDIRIPtory。
IMAGE_IMPORT_Descriptor 有两个 IMAGE_THUNK_DATA 阵列,每个进口功能一个。
装入点前的初始第一图集和初始第一图集的数组以命名信息,而装入点后的第一个图集的数组则指向实际功能位置。
(五)延迟导入表
详细详细的PE 文件结构(四) PE 导入表 就《经济》进口总表而言,这次让我们再看看另一个进口表格:延迟进口。看名字就知道,当进口其他 DLL 时, 进口技术是“ 延迟 ” 。为什么要迟呢?由于某些进口业务的频率较低,或者,它将根据具体情况使用。某些函数在程序完成运行后方可使用 。这些功能可推迟到他需要这些功能来装载相关的 DLL 。此外,该软件不需要在装上后立即初始化。
这个方法似乎令人着迷,因为它可以加快启动时间,但是我们应该如何使用它呢?如下图所示,VC包括一个选项,让我们可以简单地使用这个功能:

填入 DLL 名称, 需要在此条目后延迟导入; 连接器将自动帮助我们将这些 DLL 导入转换为延迟导入 。
我们现在了解如何使用延迟进口。那么,这一表面上强大的程序功能是如何运作的呢?让我们来看看吧。IMAG_ 数据- 方向IMAGE_DORY_ENTIY_DELAY_IMPORT是其中之一。这是因为表格进口中出现打嗝。IMAGE_DATA_DirectORY. 虚拟通讯指出延迟进口表格的起始地址 。既然是表,肯定又是一个数组,每一个都是ImgDelay Descr结构。和导入表一样,每个代表进口的DLL。来看看定义:
- grATrs:为了区分版本, 1 是新版本, 0 是旧版本, 后面是旧版本中的rvaXXxx域是指针头, 而 RVA 用于新版本, 我们只讨论新版本 。
- rvaDLLName: 包含所导入 DLL 名称的 RVA 。
- rvaHmod: 一种RVA, 指模块输入 DLL 的基准地址。在导入前, 此基地址是 NULL 。
- rvaIAT: 显示导入函数表的 RVA 指向 ITT, 在装入 DLL 之前, IAT 持有一个小代码的地址, 然后装入真正的导入函数地址 。
- rvaINT: 指向进口功能名称清单的RVA。
- rUnloadIAT: 推迟导入函数以卸载表格。
- dwTimeStamp: DLL 时间戳导入延迟 。
定义知道了,那么,他是怎么处理的?前面提到了,在IAT中,延迟进口功能是针对的,默认保存代码的地址 。当软件首次援引这一延迟的进口功能时,该守则是程序的结果。这个代码是什么意思?请审查下列真正延迟进口功能的例子:
此代码实际上只用两行构建, 第一行将导入函数 IAT 地址保存在 eax 中, 然后用 jmp 跳出; 他跳到哪里? 我们将继续监视 :
其中最关键的是DELAY_IMPORT_DESRIPORTOR_WININET推力。如上所述,这是ImgDelay Descr的结构。Wininenet 娃娃是他的DLL的名字之后,荷尔普,电话有延误在这个函数里,执行了加载DLL,查找导出函数,填写一系列表格,如进口表格。真正的进口函数是该函数结尾处的ITAT地址。同时,该函数返回导入函数的地址。因此,函数地址是 leax 的剩余部分。最后的jmp eax 称为真正的导入函数 。
这个过程很完美,也很灵巧,但是,如果你仔细看一看 你会发现有些事情不太对劲你发现了吗?_delayLoadHelper的论据只是包括抵消IAT和整个模块_DELAY_IMPORT_DESCRIPOR_WINNET的延迟进口说明。但是,在您想要从中导入函数的参数中没有名称。也许你说,名字列在DELAY_IMPORT_DESRIPOR_WINININET名称列表中。是的,那里确实有名字,但是别忘了,那是个表,它拥有要导入的所有模块功能的名称 。不是调用函数的名称函数。也许你认为参数应该包括一个索引号要导入的函数名称是名称列表中的第一个项目。可悲的是,在参数中没有这种信息。Windows怎么会在这个国家出名?微微软在此采用聪明的战略:DELAY_IMPORT_DESRIPOR_WINNET,其中之一是RVAIAT,其中之一是:前面提到了,这是所有关于IAT。抵消模块初始进口功能的ITAT,我们现在有两个偏差。将输入的 IAT 函数(作为 RVA1) 与输入模块的第一个 IAT 函数(作为 RVA0) 之间的偏移(RVA1-RVA0)/4 = rvaIAT 中的进口函数 IAT 物项表示,粗体名称的顺序与粗体名称的顺序相同。所以下标也相同,因此,您可以获得进口功能的名称。在模块名称和函数名称的帮助下,GetProcPress 返回导入函数的地址 。
下图概述上述方法:

最后但并非最不重要的是,应提请你注意两点:
只有在首次援引该函数时才出现延迟导入装入的情况,在此之后,IAT代之以适当的功能地址,而不删除_delayLoadHelper。
延迟一次只导入一个函数,而不是完整模块的函数。
(六)重定位
飞虫在移动基地:https://ww.flickr.com/I'm sorry, Bililili。这是怎么回事?p=11。



前面两篇 详细详细的PE 文件结构(四) PE 导入表 和 PE文件结构详解(五)延迟导入表 介绍了PE文件中比较常用的两种导入方式,不知道大家有没有注意到,在调用导入函数时系统生成的代码是像下面这样的:
在这里,Internet Explorer 中的 iExporation 函数从 dll 中导入了 Kernel32. GetCommandLineA 方法 。正如你所看到的,这是一个欺骗性的召唤。目的地的地址存储在00401004的记忆中。根据图中描述的符号信息,00401004是 Exporer 模块中的有效地址 。事实上,这就是国际行政法庭的地址。这是 IE6 可执行文件的一个例子 。如果您从其他 dll 导入函数, 必须在 dll 中输入 。结果也是一样的。这样就有一个问题,代码中的呼叫地址是一个模块地址 。而且是一个 VA,因此,如果基于模块的模块能够应对变化,地址不正确吗?这个问题如何解决?
解释是 Windows 使用重新定位技术来确保上述功能被适当调用, 不论该模块装入的基点位置。 您如何操作? 并不困难。 这是一个三步程序 。
- 一. 当模块编译时,汇编者将确定模块中的项目是否使用直接 VA,如推、全局变量、函数地址,以及在模块装入时必须移动的这些命令的操作数量。
- 二. 当链接创建 PE 文件时,汇编者将重新定位项目记录在数据日志中保存的表格中,其序列号为 IMAGE_DirectORY_ENTERY_BASEREOC。
- 三。当您装入 PE 文件时, PE 装载器分析重新定位表格,并根据当前模块基数对每个表格进行重新定位。
前两个阶段涉及知识的汇编和联系,对本研究意义不大,我们着重第三步,这与本系列的特性是一致的。
在研拟调整表的定义之前,让我们看看他是怎么保持的。有助于后面的理解。按照常规思路,每个重新定位的项目必须是DWORD。它包括必须移动的ARVA。寻找需要搬迁的东西将是一项容易的任务。然而,它不是微软以这种方式设计的。这是因为空间不够。试想一下,添加包含 n 重新定位项目的文件 。然后它需要四个字节。因此,Windows采用分组办法。根据重新定位项目所在的页面分组,每个组保存一个RVA页面,这是该组的地址。页面上每个重新定位项目都使用一个 WRD来保存页面上重新定位项目的偏差。因此,重新定位表的规模大为缩小。
我们现在可以利用上述概念研究基地点重新定位表的定义:
- RVA是该页面的首页地址。
- 大小块块: 表示该组存储了许多重新定位元素 。
- 这一领域有两个不同的含义。大家都知道,如果您移动第12页的位址,您就可以表达。其余4个职位用于具体说明重新定位的类型。而事实上,视窗只使用了一种IMAGE_REL_BASED_HIGHLOW 3 的IMAGE_REL_BASED_HIGHLOW值,即3。

既然有了这个信息,我肯定 建立你自己的代码来转移桌子 很简单,所以你为什么不自己试试呢?
本文是我们通过电子邮件特别报导全球之声网络的部分内容。 鹰(Eagle)发表时有消息源。 本文是我们特别报导2011年叙利亚抗争的部分内容。 抱歉, csdn。 这篇文章是我们特别报导澳洲. net/villegle/article/ details/ 12886949的一部分。
总而言之,哪些举措应当重新定位?
- 一. 代码使用全球变量指令,因为全球变量必须是模块的地址,而使用全球变量的语句生成了一个命令,该命令在构建时指全球变量基地址。
- 二. 将模块函数指针的值移动到变量或参数,因为分配值或通过参数产生需要直接地址的 mov 和 push 指令。
- 在 C++ 中, 构建和拆卸函数各指定一个非功能的表指针, 它本身就是一个校准项目, 由您自己来考虑 。
PE 深度资源
对不起,Bililili。这是怎么回事?p=12个世界末日资源创造和软件改造:https://ww.flickr.org。
https://www.bilibili.com/video/av28047648/?p=13
抱歉,Csdn,这篇文章是我们特别报导的土著民族的一部分。 net/lj94090993/article/ details/50504110。
PE格式九、资源表分析和操作操作:https://ww.flickr.com/I'm sorry、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs、cnblogs 9、pff格式九、fE格式九、资源表分析和操作练习:https/mlickr.com/mbs、com/I's、cnbblogs、cnblogs、nblogs、nbb、cnbb、cnbb、c、cnblogs、nblogs、nblogs、nbb、nbb、c、c、cbb、c、c、c、c、c、c、c、nblogs、nblogs、nb、nb、c、c、c、c、c、c、c、c、c、cbb、c、c、c、c、c、cbb、c、c、cbb、c、c、c、c、c、c、c、cbb、c、c、c、cb、c、c、c、cbb、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c、c
资源表:https://blog. com/I'm sorry, csdn。


com/s/1HFUKvBvwwHm_5oa0DxGcroA 提取代码: ay6p
我不知道你在说什么 宝贝 Com/s/17 HVKGN8bKZ9acg3f9Drw 提取代码: exjf



以下是IMAGE_资源_直接业务和IMAGE_资源_直接业务的定义:

1. 第一层
第一层以 IMAGE_Resources_DirectOry 头开始,然后是 IMAGE_Resources_DIRECORY_ENTIY 数组数值。数组个数=NumberOfNamedEntries+NumberOfIdEntries。
IMAGE_Resources_DirectORY_ENTIY 使用名称和偏移日志,其中分别描述资源类型和第二层的数据偏移地址。

偏移数据抵消地址与整个资源结构相对应,这意味着第二级偏移地址等于第一级初始偏移地址加上偏移位置地址。
2. 第二层
与第一层一样,二楼以IMAGE_Resources_Dirtory头为主。下一个是IMAGE_资源_ 方向_ 发射阵列。数组数是数字OpNamedEntries和数字OpidEntries的总和。
IMAGE_RESOURCE_DirectORY_ENTIY 使用Is String、 nameoffet、 Id 和Offset To Timiny 等名称。董事会是其中之一, 而且是第一级。这个项目是我们人权观察社特别报道的一部分。这还取决于总体资源结构。
如果名称有一个字符串值,以名称( UNICODE 编码字符串) 指定的资源描述,名称集是相对于总体资源结构的名称偏移地址 。相反,如果名称的字符串值为零,由 ID 确定的资源描述( 整数),ID号为Id。
名称抵消涉及IMAGE_Resources_DIR_STRING_U的结构,其定义如下:

3. 第三层
与前两层一样,二楼以IMAGE_Resources_Dirtory头为主。后面紧接着是IMAGE_RESOURCE_DIRECTORY_ENTRY数组,但不同的是数组个数=1。
IMAGE_RESOURCE_DirectORY_ENTRY分别使用名称和偏移ToData参数来指定资源数据的资源语言类型和相对地址。 CREDIT是936。
冲抵ToData是相对于总体资源结构的抵消地址,该结构指向一个IMAGE_Resources_Data_ENTERY结构,其说明如下:

上一篇:rog如何设置u盘启动
下一篇:winpeu盘安装绕过密码
相关新闻
- 2023-05-07 联想v310安装win7教程(联想v310加内存
- 2023-05-07 华硕重新win7系统教程(华硕a555b装
- 2023-05-07 用u盆电脑安装系统教程(电脑克隆系
- 2023-05-07 xp系统从u盘重装教程视频(u盘重装服
- 2023-05-07 启动u盘本地模式教程(开机按什么进
- 2023-05-07 lol没声音但是电脑有声音(lol没声音
- 2023-05-07 好装机一键装机教程(装机助理u盘装
- 2023-05-07 大白菜华硕u盘装系统教程视频(大白
- 2023-05-07 pe使用教程 电脑店(万能驱动pe使用
- 2023-05-07 原版xp用u盘安装教程(win10原版u盘安
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
