【逆向基础】十七、PE文件格式(二)

一、简介

本篇章主要PE文件组成部分中使用的结构体;根据结构体的成员变量去了解各个字节的含义。(ps:我们依旧以”cmd.exe“为例展开解析;)
在这里插入图片描述

二、DOS Header

1、结构体:IMAGE_DOS_HEADER

IMAGE_DOS_HEADER结构体的背景是为了兼容DOS文件,即拓展当时被人们广泛使用DOS文件的DOS EXE头。
下图是使用UE使用Hex Editor打开的cmd.exe文件中DOS Header的内容。以及大小为0x40个字节的结构体信息。
在这里插入图片描述

typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部USHORT e_magic; 		// 魔术数字(0x5A4D  "MZ")****************USHORT e_cblp; 			// 文件最后页的字节数USHORT e_cp; 			// 文件页数USHORT e_crlc; 			// 重定义元素个数USHORT e_cparhdr; 		// 头部尺寸,以区块落为单位USHORT e_minalloc; 		// 所需的最小附加区块USHORT e_maxalloc; 		// 所需的最大附加区块USHORT e_ss; 			// 初始的SS值(相对偏移量)USHORT e_sp; 			// 初始的SP值USHORT e_csum; 			// 校验和USHORT e_ip; 			// 初始的IP值USHORT e_cs; 			// 初始的CS值(相对偏移量)USHORT e_lfarlc; 		// 重分配表文件地址USHORT e_ovno; 			// 覆盖号USHORT e_res[4]; 		// 保留字USHORT e_oemid; 		// OEM标识符(相对e_oeminfo)USHORT e_oeminfo; 		// OEM信息USHORT e_res2[10];		// 保留字LONG e_lfanew;     		// 新NT头的地址,************
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
1.1 e_magic:

e_magic表示DOS签名,所有未被加密的PE文件开始部分都有DOS签名(“MZ”:PE文件设计者Mark Zbikowski),

1.2 e_lfanew:

e_lfanew表示Name Table Heard的偏移地址;占用四个字节内存;

三、DOS Stub

DOS存根(Stub)位于DOS Header下方。可有可无,且大小不固定;由代码和数据混合而成。下图是使用UE使用Hex Editor打开的cmd.exe文件中DOS Stub的内容。
在这里插入图片描述

以下位对应汇编指令内容。PE文件带有MS-DOS兼容模式,可以在Dos环境下运行,输出“This program cannot be run in DOS mode”后终止。(在DOS环境中运行16位DOS代码,在Winsows环境中运行32位Windows代码)。
在这里插入图片描述

四、NameTable Header

1、结构体:IMAGE_NT_HEADERS32

IMAGE_NT_HEADERS32头主要由3个成员组成,下图是使用UE使用Hex Editor打开的cmd.exe文件中NT Header的内容。以及大小为0xF8个字节的结构体信息。

typedef struct _IMAGE_NT_HEADERS {DWORD Signature;							//签名IMAGE_FILE_HEADER FileHeader;				//文件头结构体IMAGE_OPTIONAL_HEADER32 OptionalHeader;		//可选头结构体
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
1.1、Signature

占用四个字节,其值位0x50450000 (“PE..”).

1.2、结构体:IMAGE_FILE_HEADER

IMAGE_FILE_HEADER结构体、文件内容、较为重要的结构体部分成员如下所示:
在这里插入图片描述

typedef struct _IMAGE_FILE_HEADER {USHORT Machine; 							//运行平台USHORT NumberOfSections;					//文件的区块数ULONG TimeDateStamp;						//文件创建日期和时间ULONG PointerToSymbolTable;					//指向符号表(用于调试)ULONG NumberOfSymbols;						//符号表中符号的个数(用于调试)USHORT SizeOfOptionalHeader;				//IMAGE_OPTIONAL_HEADER32结构的大小USHORT Characteristics;						//文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
1.2.1 Machine

MachineCUP芯片对应的专属ID;以下是定义在winnt.h文件中的Machine码; 当前cmd.exe对应的Machine = 0x8664;

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
...
Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE
1.2.2 NumberOfSections

NumberOfSections表示当前文件中存在的节区数量,当前值必须大于零且与实际节区数一样,否则程序运行错误。

1.2.3 NumberOfOptionalHeader

NumberOfOptionalHeader表示IMAGE_OPTIONAL_HEADER32结构体的大小。
因为PE32+格式使用的是IMAGE_OPTIONAL_HEADER64结构体,所以PE文件需要区分结构体大小;

1.2.4 Characteristics

Characteristics表示文件属性。比如文件是否可运行,是否是exe文件等; 一下是winnt.h文件中的Characteristics值表示的属性;当前文件的characteristics = 0x0022; 即兼容两种属性IMAGE_FILE_EXECUTABLE_IMAGEIMAGE_FILE_LARGE_ADDRESS_AWARE; (注意:PE文件也存在不可执行的属性,类似".obj"文件)

#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved external references).
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
1.3 节构体:IMAGE_OPTIONAL_HEADER32

IMAGE_OPTIONAL_HEADER32是PE头中占用空间最大的结构体。

typedef struct _IMAGE_OPTIONAL_HEADER {// Standard fields.WORD    Magic;								//标志字BYTE    MajorLinkerVersion;					//链接器主版本号BYTE    MinorLinkerVersion;					//链接器次版本号DWORD   SizeOfCode;							//所有含有代码的区块的大小DWORD   SizeOfInitializedData;				//所有初始化数据区块的大小DWORD   SizeOfUninitializedData;			//所有未初始化数据区块的大小DWORD   AddressOfEntryPoint;				//程序执行人口 RVADWORD   BaseOfCode;							//代码区块起始RVADWORD   BaseOfData;							//数据区块起始RVA// NT additional fields.DWORD   ImageBase;							//程序默认载人基地址DWORD   SectionAlignment;					//内存中区块的对齐值DWORD   FileAlignment;						//文件中区块的对齐值WORD    MajorOperatingSystemVersion;		//操作系统主版本号WORD    MinorOperatingSystemVersion;		//操作系统次版本号WORD    MajorImageVersion;					//用户自定义主版本号WORD    MinorImageVersion;					//用户自定义次版本号WORD    MajorSubsystemVersion;				//所需子系统主版本号WORD    MinorSubsystemVersion;				//所需子系统次版本号DWORD   Win32VersionValue;					//保留,通常被设置为0DWORD   SizeOfImage;						//映像载入内存后的总大小DWORD   SizeOfHeaders;						//MS-DOS头部、PE文件头、区块表总大小DWORD   CheckSum;							//映像校验和WORD    Subsystem;							//文件子系统WORD    DllCharacteristics;					//显示 DLL特性的旗标DWORD   SizeOfStackReserve;					//初始化时栈的大小DWORD   SizeOfStackCommit;					//初始化时实际提交栈的大小DWORD   SizeOfHeapReserve;					//初始化时保留堆的大小DWORD   SizeOfHeapCommit;					//初始化时实际保留堆的大小DWORD   LoaderFlags;						//与调试相关,默认值为0DWORD   NumberOfRvaAndSizes;				//数据目录表的项数IMAGE_DATA_DIRECTORY DataDirectory[16];		//数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
1.3.1 Magic

Magic = 0x010B时,表示使用结构体IMAGE_OPTIONAL_HEADER32Magic = 0x020B时,表示使用结构体IMAGE_OPTIONAL_HEADER64

1.3.2 AddressOfEntryPoint

AddressOfEntryPoint表示PE程序的入口点,是最先执行程序代码的地方,所以它的值表示程序执行代码的起始地址;其中地址值使用RVA(Relative
Virtual Address)值表示;

1.3.3 ImageBase

ImageBase表示基址;是PE文件被加载到内存时优先装入的地址;可通过编译器设置;
其中DLL文件的ImageBase默认值是0x00100000
其中exe文件的ImageBase默认值是0x00400000
执行PE文件是,PE装载其先创建进程(进行内存范围0~0xFFFFFFFF),再将文件载入内存,最后把EIP寄存器的值设置位`ImageBase

  • AddressOfEntryPoint`;
1.3.4 SectionAlignment

SectionAlignment表示节区在磁盘文件中的最小单位;不对齐则用null填充;

1.3.5 FileAlignment

FileAlignment表示节区在内存中的最小单位;不对齐则用null填充;

1.3.6 SizeOfImage

SizeOfImage表示加载PE文件到内存时,PE Image在虚拟内存中所占空间的大小;

1.3.7 SizeOfHeader

SizeOfHeader表示整个PE头的占用空间的大小,当前文件中SizeOfHeader = 0x400;
第一节区的起始位置在PE头位置之后;

1.3.8 Subsystem

Subsystem表示文件类型,也可称为子系统;如下图表示值对应含义。
在这里插入图片描述

1.3.8 NumberOfRvaAndSizes

NumberOfRvaAndSizes表示成员变量DataDirectory的个数(数组大小不一定是16个);即数据目录表的实际数量;

1.3.9 DataDirectory

DataDirectory表示IMAGE_DATA_DIRECTORY的结构体类型;数组表示每张表对应的虚拟地址和大小;结构体数组指定下标含义如下所示:

typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress;DWORD Size;
}IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    DataDirectory[0] = "EXPORT Directory";        //函数导出表DataDirectory[1] = "IMPORT Directory";        //函数导入表DataDirectory[2] = "RESOURCE Directory";DataDirectory[3] = "EXCEPTION Directory";DataDirectory[4] = "SECURITY Di rectory";DataDirectory[5] = "BASERELOC Directory";DataDirectory[6] = "DEBUG Directory";DataDirectory[7] = "COPYRIGHT Directory";DataDirectory[8] = "GLOBALPTR Directory";DataDirectory[9] = "TLS Directory";          //线程局部存储器;用于反调试DataDirectory[10] = "LOAD CONFIG Directory";DataDirectory[11] = "BOUND IMPORT Directory";DataDirectory[12] = "IAT Directory";		//导入地址表,用于设置钩子DataDirectory[13] = "DELAY IMPORT Directory";DataDirectory[14] = "COM DESCRIPTOR Directory";DataDirectory[15] = "Reserved Directory";

五、Section Header

1、节构体:IMAGE_SECTION_HEADER

PE文件中包含如code(代码)、data(数据)、resource(资源)等节区。节区头定义了PE文件中各个节区的属性。并同故宫为每个截取设置不同特性,访问权限等,可以提高程序的安全性。
在这里插入图片描述
节区头是由IMAGE_SECTION_HEADER结构体组成的数组,每个结构体对应一个节区。

typedef struct _IMAGE_SECTION_HEADER {BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];//8字节的块名区块大小union {DWORD   PhysicalAddress;DWORD   VirtualSize;			//内存中节区所占大小} Misc;DWORD   VirtualAddress;				//区块的RVA地址DWORD   SizeOfRawData;				//在文件中对齐后的大小DWORD   PointerToRawData;			//在文件中的偏移,即节区起始位置DWORD   PointerToRelocations;		//在 OBJ文件中使用,重定位的偏移DWORD   PointerToLinenumbers;		//行号表的偏移(供调试用)WORD    NumberOfRelocations;		//在OBJ文件中使用,重定位项数目WORD    NumberOfLinenumbers;		//行号表中行号的数目DWORD   Characteristics;			//节区的属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
1.1 Name

Name表示节区名称,但是不一定用NULL结束;

1.2 VirtualAddress

VirtualAddress表示虚拟地址,是当前节区在内存的起始地址;

1.3 SizeOfRawData

SizeOfRawData表示文件偏移,是当前节区在磁盘文件中的偏移

1.4 Characteristics

Characteristics在头文件“winnt.h”的定义如下:

#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.contents comdat.
#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

六、小结

文本章详细讲解了PE文件头的信息。包括Dos HeaderDos StubNT HeaderSection Header等四个主要部分,并列举了其中包含的结构体信息。通过注释,举例的方式快速帮助我们了解PE文件最初的样子。时而观之,温故知新呀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

忘记7-zip文件7-zip文件,还可以解压zip文件吗?

文件压缩与解压已成为我们日常处理数据和存储信息的常规操作。7-Zip,作为一款开源且功能强大的文件压缩工具,凭借其高压缩率、支持多种格式以及免费使用的特点,赢得了广大用户的青睐。然而,出于保护文件内容安全的考虑&#xff0c…

基于NVIDIA NIM平台—生成属于自己的DIY食谱

目录 一、介绍NVIDIA NIM平台 二、生成DIY食谱Demo 三、小结 一、介绍NVIDIA NIM平台 NVIDIA NIM(Nvidia Inference Microservices)平台是NVIDIA推出的一个微服务套件,旨在加速生成式AI模型在云端、数据中心和工作站上的部署和使用。以下是…

怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质

主谓宾与主系表是英语句子结构中的两种基本类型,它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下: 关注点 主谓宾I love you:主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为,通常描…

4K双模显示器7款评测报告

4K双模显示器7款评测报告 HKC G27H7Pro 4K双模显示器 ROG华硕 XG27UCG 4K双模显示器 雷神 ZU27F160L 4K双模显示器 泰坦军团 P275MV PLUS 4K双模显示器 外星人(Alienware)AW2725QF 4K双模显示器 SANC盛色 D73uPro 4K双模显示器 ANTGAMER蚂蚁电竞 …

MySql中表的约束

​ 本篇中将会介绍关于 MySql 数据库中的表的约束,关于表的约束其实约束的是表中的数据类型,因为有的数据类型很单一,需要我们添加一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性&#xf…

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

leetCode算法题爬楼梯递归写法

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2输出&#xff1a;2解释&#xff1a;有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

GPIO输入和输出

参考视频&#xff1a;2.1 [GPIO]4种输出模式_哔哩哔哩_bilibili 输出&#xff1a;通过写0或者写1&#xff0c;控制引脚输出低电压或高电压。 输入&#xff1a;通过读取引脚是0还是1&#xff0c;判断引脚输入的是高电压还是低电压。 输出 推挽开漏通用通用输出推挽通用输出开漏…

Asp.net Core MVC 动态路由

动态路由 asp.net core 3.0 就支持了 // 映射关系public class TranslationDatabase{private static Dictionary<string, Dictionary<string, string>> Translations new Dictionary<string, Dictionary<string, string>>{{"en", new Dictio…

yolo自动化项目实例解析(八)自建UI-键鼠录制回放

项目中关于键鼠的操作&#xff0c;不像我们之前自动化那样一步一步去定义的&#xff0c;而是用C写了一个记录键鼠的操作&#xff0c;通过回放的方法来实现的 一、通讯系统 1、创建websocket服务器 首先通过事件循环asyncio 和websockets&#xff0c;创建一个持久化的服务端进程…

通过页面添加国际化数据,实现vue的国际化

element ui 写在前面1. 原有的vue的国际化处理1.1 语言文件1.2 lang的index.js1.3 入口文件导入1.3 应用 2. 通过页面添加国际化数据2.1 做法2.2 lang的index.js文件修改2.3 需要注意的点 总结写在最后 写在前面 需求&#xff1a;在系统的国际化管理页面添加国际化数据&#x…

我想电脑批量管理 30 台苹果手机,怎么操作更简单方便呢?

在如今的数字化时代&#xff0c;手机已经成为了我们日常生活中不可或缺的一部分。无论是工作还是娱乐&#xff0c;我们都需要使用各种各样的应用软件来满足自己的需求。 而对于那些需要管理大量苹果手机设备的企业来说&#xff0c;如何高效地完成这些任务就成了一个重要问题。…

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色&#xff0c;无论是基础科学研究还是实际工程应用&#xff0c;强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器&#xff0c;对于确保科研和工作的顺利进行至关重要。 首先&#xff0c;明确自身需求是重中之重。要仔细考虑计算…

六个方向比较分析:ChatGPT-o1-preview与 ChatGPT-4o在论文写作辅助上的差异

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究和论文撰写的领域&#xff0c;人工智能助手正变得越来越重要。随着技术的不断进步&#xff0c;ChatGPT-o1-preview和ChatGPT-4o作为两个先进的语言模型&#xff0c;在辅助论文…

文件上传漏洞及安全

文件上传 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题&#xff0c;对于如何确保这类安全问题&#xff0c;一般会从原生态功能中的文件内容&#xff0c;文件后缀&#xff0c;文件类型等方面判断&#xff0c;但是漏洞可能不仅在本身的代码…

C++学习路线(二十二)

构造函数 构造函数作用 在创建一个新的对象时&#xff0c;自动调用的函数&#xff0c;用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。 构造函数特点 1.自动调用(在创建新对象时&#xff0c;自动调用) 2.构造函数的函数名&#xff0c;和类名相同 3.构造函数…

Pytorch学习--如何下载及使用Pytorch中自带数据集,如何把数据集和transforms联合在一起使用

一、标准数据集使用 pytorch官网–标准数据集 这里以CIFAR10数据集为例&#xff1a;CIFAR10 下载数据集 代码&#xff1a; import torchvision train_datatorchvision.datasets.CIFAR10(root"datasets",trainTrue,downloadTrue) test_datatorchvision.datasets.…

盘古信息制造数字化优才计划 | 解决人才困境 赋能智能制造

在中国制造2025的大背景下&#xff0c;制造业正以前所未有的速度向数字化、智能化转型。在这场深刻的变革中&#xff0c;人才作为核心驱动力&#xff0c;其重要性日益凸显。作为全球领先的制造运营管理工业软件供应商&#xff0c;盘古信息深知构建制造人才生态的重要性&#xf…

EasyExcel_动态表头的导入导出

文章目录 前言一、EasyExcel二、使用步骤1.引入jar包2.数据准备2.1 数据库 3.方法实例3.1 无实体的导入3.1.1 Controller3.1.2 Service3.1.3 Listener3.1.4 Utils3.1.5 无实体导入数据返回说明 3.2 无实体的导出3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理)3.2.2…

Kafka Tool(Offset Explorer)在windows下配置访问kerberos认证Kafka

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置文件配置软件参数及启动 前言 Offset Explorer&#xff08;以前称为Kafka Tool&#xff09;是一个用于管理和使用Apache Kafka集群的图形用户界面&#xff08;GUI&#xff09;应用程序。…