[读书][笔记]WINDOWS PE权威指南《三》PE的原理和基础 之 第三章 PE文件头(下)

简介: [读书][笔记]WINDOWS PE权威指南《三》PE的原理和基础 之 第三章 PE文件头(下)

3.4.7 数据目录项——IMAGE_DATA_DIRECTORY

IMAGE OPTIONAL HEADER32(扩展PE头)结构的最后一个字段为DataDirectory。

该字段定义了PE文件中出现的所有不同类型的数据的目录信息

如前所述,应用程序中的数据被按照用途分成很多种类:

  • 导出表、
  • 导入表、
  • 资源、
  • 重定位表等。

在内存中,这些数据被操作系统以页为单位组织起来,并赋以不同的访问属性;

在文件中,这些数据也同样被组织起来,按照不同类别分别存放在文件的指定位置。

作用:该结构就是用来描述这些不同类别的数据在文件(和内存)中的位置及大小的,因为这个字段比较重要

从Windows NT3.1操作系统开始到现在,该数据目录中定义的数据类型一直是16种。

PE中使用了一种称作“数据目录项——IMAGE DATA DIRECTORY”的数据结构来定义每种数据。

该结构只有两个字段,结构具体定义如下:

Windows c++中:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

两个字段依次为VirtualAddress和isize。

如图所示,总的数据目录一共由16个相同的IMAGE DATA DIRECTORY结构连续排列在一起组成。

在Windows头文件winnt.h中 属于拓展PE头结构体IMAGE_OPTIONAL_HEADER的成员DataDirectory

这16个元组的数组每一项均代表PE中的某一个类型的数据:

如果想在PE文件中寻找特定类型的数据,就需要从该结构开始。

比如:

要想查看PE中都调用了哪些动态链接库的函数?

则需要从数据目录表的第2个元素(数组编号为1)的IMAGE DATA DIRECTORY结构 获取导入表在文件中的起始位置和大小,然后再根据VirtualAddress地址指向的位置找到导入表相关的字节码。

这种信息组织方式正是本章最开始介绍的“头部+身体”的数据组织方式。

3.4.8 节表项——IMAGE_SECTION_HEADER

PE头IMAGE NT HEADERS后紧跟着节表。

它由许多个节表项(IMAGE SECTION HEADER)组成,每个节表项记录了PE中与某个特定的节有关的信息,如节的属性、节的大小、在文件和内存中的起始位置等。

节表中节的数量由字段IMAGE FILE HEADER, NumberOfSections来定义。节表项的数据结构详细定义如下:

Windows 头文件winnt.h中IMAGE_SECTION_HEADER结构体:

节表后面就是节的内容。截至节表,PE文件头部涉及的所有数据结构已经全部介绍完毕。

3.5 数据结构字段详解

参考于2010年9月21日发布的Microsoft Portable Executable and Common Object File Format Specification(Revision v8.2)

3.5.1 PE头——IMAGE_NT_HEADER的字段

1.IMAGE_NT_HEADER.Signature

2.IMAGE_NT_HEADER.FileHeader

3.IMAGE_NT_HEADER.OptionalHeader

3.5.2 标准PE头——IAMGE_FILE_HEADER的字段

4.IMAGE_FILE_HEADER.Machine

5 IMAGE_FILE_HEADER.NumberOfSections

6.IMAGE_FILE_HEADER.TimeDateStamp

7.IMAGE_FILE_HEADER.PointerToSymbolTable

8.IMAGE_FILE_HEADER.NumberOfSymbols

9.IMAGE_FILE_HEADER.SizeOfOptionalHeader

10.IMAGE FILE HEADER.Characteristics

3.5.3 扩展PE头——IMAGE_OPTIONAL_HEADER32的字段

11.IMAGE OPTIONAL HEADER32.Magic

12.IMAGE OPTIONAL HEADER32.MajorLinkerVersion

13.IMAGE OPTIONAL HEADER32.MinorLinkerVersion

14.IMAGE OPTIONAL HEADER32.SizeOfCode

15.IMAGE OPTIONAL HEADER32.SizeOflnitializedData

16.IMAGE_OPTIONAL_HEADER32.SizeOfUninitializedData

17.IMAGE OPTIONAL HEADER32.AddressOfEntryPoint

18.IMAGE OPTIONAL HEADER32.BaseOfCode

19.IMAGE OPTIONAL HEADER32.BaseOfData

20.IMAGE OPTIONAL HEADER32.ImageBase

21.IMAGE OPTIONAL_HEADER32.SectionAlignment

22.IMAGE OPTIONAL HEADER32.FileAlignment

23.IMAGE OPTIONAL HEADER32.MajorOperatingSystemVersion

24.IMAGE OPTIONAL HEADER32.MinorOperatingSystemVersion

25.IMAGE_OPTIONAL_HEADER32.MajorlmageVersion

26.IMAGE OPTIONAL HEADER32.MinorlmageVersion

27.IMAGE OPTIONAL HEADER32.MajorSubsystemVersion

28.IMAGE OPTIONAL HEADER32.MinorSubsystemVersion

29.IMAGE_OPTIONAL_HEADER32.Win32VersionValue

30.IMAGE OPTIONAL HEADER32.SizeOflmage

31.IMAGE OPTIONAL HEADER32.SizeOfHeaders

32.IMAGE OPTIONAL HEADER32.CheckSum

33.IMAGE OPTIONAL HEADER32.Subsystem

34.IMAGE OPTIONAL HEADER32.DlICharacteristics

35.IMAGE OPTIONAL HEADER32.SizeOfStackReserve

36.IMAGE OPTIONAL HEADER32.SizeOfStackCommit

37.IMAGE OPTIONAL HEADER32.SizeOfHeapReserve

38.IMAGE OPTIONAL HEADER32.SizeOfHeapCommit

39.IMAGE OPTIONAL HEADER32.LoaderFlags

40.IMAGE OPTIONAL HEADER32.NumberOfRvaAndSize

41.IMAGE OPTIONAL HEADER32.DataDirectory

3.5.4 数据目录项——IMAGE_DATA_DIRECTORY的字段

42.IMAGE DATA DIRECTORY.VirtualAddress

43.IMAGE DATA DIRECTORY.isize

3.5.5 节表项——IMAGE_SECTION_HEADER的字段

44.IMAGE SECTION HEADER.Name1

45.IMAGE SECTION HEADER.Misc

46.IMAGE SECTION HEADER.VirtualAddress

47.IMAGE SECTION HEADER.SizeOfRawData

48.IMAGE SECTION HEADER.PointerToRawData

49.IMAGE SECTION HEADER.PointerToRelocations

50.IMAGE SECTION HEADER.PointerToLinenumbers

51.IMAGE SECTION HEADER.NumberOfRelocations

52.IMAGE_SECTION_HEADER.NumberOfLinenumbers

53.IMAGE SECTION HEADER.Characteristics

3.5.6 解析HelloWorld程序的字节码

3.6 PE内存映像

3.7 PE文件头编程

3.7.1 RVA与FOA的转换

3.7.2 数据定位

3.7.3 标志位操作

3.7.4 PE校验和

3.8 总结


相关文章
|
3月前
|
存储 UED Windows
Windows服务器上大量文件迁移方案
Windows服务器上大量文件迁移方案
192 1
|
3月前
|
iOS开发 MacOS Windows
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
|
1月前
|
安全 前端开发 Windows
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
本文介绍了 Electron 应用在 Windows 中的更新原理,重点分析了 `NsisUpdater` 类的实现。该类利用 NSIS 脚本,通过初始化、检查更新、下载更新、验证签名和安装更新等步骤,确保应用的更新过程安全可靠。核心功能包括差异下载、签名验证和管理员权限处理,确保更新高效且安全。
34 4
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
|
2月前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
76 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
2月前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
43 1
|
2月前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
1110 1
|
2月前
|
API Windows
Windows之窗口原理
这篇文章主要介绍了Windows窗口原理和如何使用Windows API创建和管理窗口。
63 0
|
2月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
49 0
|
3月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
3月前
|
Windows
7-3|windows删除目录下的所有文件的命令
7-3|windows删除目录下的所有文件的命令