[读书][笔记]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 总结


相关文章
|
21天前
|
编解码 5G Linux
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国首个8K及5G视频编码标准,相比AVS2和HEVC性能提升约30%。解码器libuavs3d支持8K/60P视频实时解码,兼容多种平台。《FFmpeg开发实战》书中介绍了在Windows环境下如何集成libuavs3d到FFmpeg。集成步骤包括下载源码、使用Visual Studio 2022编译、调整配置、安装库文件和头文件,以及重新配置和编译FFmpeg以启用libuavs3d。
36 0
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
|
1月前
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
41 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
|
1月前
|
Java 程序员 Windows
【windows自带exe】使用`findstr.exe`来搜索包含某个字符串的文件
【windows自带exe】使用`findstr.exe`来搜索包含某个字符串的文件
51 0
|
1月前
|
安全 Linux 网络安全
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
30 0
|
1月前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
524 1
|
1月前
|
安全 数据安全/隐私保护 Windows
Windows文件搜索神器Everything安装配置结合内网穿透实现公网查询本地文件
Windows文件搜索神器Everything安装配置结合内网穿透实现公网查询本地文件
|
1月前
|
Apache 项目管理 数据安全/隐私保护
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
|
1月前
|
编解码 Linux Windows
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
本文档介绍了在Windows环境下如何为FFmpeg集成libopus和libvpx库。首先,详细阐述了安装libopus的步骤,包括下载源码、配置、编译和安装,并更新环境变量。接着,同样详细说明了libvpx的安装过程,注意需启用--enable-pic选项以避免编译错误。最后,介绍了重新配置并编译FFmpeg以启用这两个库,通过`ffmpeg -version`检查是否成功集成。整个过程参照了《FFmpeg开发实战:从零基础到短视频上线》一书的相关章节。
51 0
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
|
1月前
|
Rust 前端开发 Windows
blog-engine-06-pelican 静态网站生成 windows11 安装实战笔记
这篇内容是一个关于在Windows 11上安装和使用静态网站生成器的教程,主要包括对多个博客引擎(如Jekyll、Hugo、Hexo等)的简介和对比,以及详细步骤教你如何在Windows环境下安装Python、Pelican、Rust和Cargo。作者首先介绍了Python和Pelican的安装,然后在遇到依赖问题时,引导读者安装Rust和Cargo来解决。最后,通过`pelican-quickstart`创建项目,编写Markdown文章并生成、预览站点。
|
4天前
|
编解码 安全 网络安全
RealVNC的 VNC server在windows7系统下无法正确运行
在Windows 7上运行旧版VNC Server(如4.1.2)可能存在兼容性问题,但可通过调整配置解决。步骤包括:安装VNC Server,设置兼容性模式(选择Windows XP SP3),启动VNC Server,配置VNC连接参数。若遇到问题,检查防火墙设置,确保系统更新,并考虑升级到新版VNC Server以提高性能和兼容性。