PE文件结构解析 Part3 NT Headers

news/2024/11/29 16:16:31/文章来源:https://www.cnblogs.com/dewxin/p/18575346

文章来源:https://0xrick.github.io/win-internals/pe4/

目录
  • 简介
  • NT Headers(IMAGE_NT_HEADERS)
    • 签名 Signature
    • File Header(IMAGE_FILE_HEADER)
    • Optional Header (IMAGE_OPTIONAL_HEADER)
  • 总结

简介

在前面的文章中,我们看过了DOS Header的结构以及逆向了DOS stub。
这篇文章我们准备讨论一下PE文件结构中NT Header的部分。
在我们进入正题之前,我们需要讲一讲等下我们会用到很多次的一个重要的概念,相对虚拟地址(Relative Virtual Address)或者RVA。 RVA(相对虚拟地址)就是相对于EXE在内存中起始地址的一个偏移(相对于Image Base)。也就是说,将相对虚拟地址Relative Virtual Address转化为绝对虚拟地址,我们需要将RVA的值加上ImageBase的值。接下来我们会看到,PE很多地方都会用到RVA。

NT Headers(IMAGE_NT_HEADERS)

NT Headers是一个定义在winnt.h的结构体IMAGE_NT_HEADERS,观察它的定义,我们可以看到它有三个成员(DWORD类型的签名,IMAGE_FILE_HEADER类型的FileHeader,以及IMAGE_OPTIONAL_HEADER类型的OptionalHeader)。

值得一提的是,这个结构体有两个版本的定义。一个用于32bit,IMAGE_NT_HEADERS 。 一个用于64bit,IMAGE_NT_HEADERS64

typedef struct _IMAGE_NT_HEADERS64 {DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;typedef struct _IMAGE_NT_HEADERS {DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

签名 Signature

NT Headers结构体的第一个成员是PE签名,它是DWORD类型,意味着它需要4字节的空间。
这个字段的值总是固定为0x50450000,用ASCII码表示为PE\0\0
下面是来自PE-Bear的截图。

File Header(IMAGE_FILE_HEADER)

也被称作"COFF File Header", File Header这个结构体持有PE文件的一些信息。
它在winnt.h中定义为IAMGE_FILE_HEADER, 下面是它的定义:

typedef struct _IMAGE_FILE_HEADER {WORD    Machine;WORD    NumberOfSections;DWORD   TimeDateStamp;DWORD   PointerToSymbolTable;DWORD   NumberOfSymbols;WORD    SizeOfOptionalHeader;WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

这是一个有着7个成员的结构体:

  • Machine:用于表示可执行文件的目标机器,类型是WORD。这个字段可以有很多值,但是我们只对其中两个感兴趣,0x8864 for AMD64 and 0x14c for i386. 想要了解全部可能的值,可以访问微软官方文档。
  • NumberOfSections:这个字段存储了sections的个数。(也可以说是section header的个数)
  • TimeDateStamp: 表示文件被创建时的unix时间戳。
  • PointerToSymbolTableNumberOfSymbols: 这两个字段保存了 到COFF符号表的偏移以及符号表中有几个对象。它们也可能被设置为0,意味着没有符号表,这是因为COFF调试信息被丢弃了。
  • SizeOfOptionalHeader:Optional Header的大小。
  • Characteristics:用于表示文件属性的flag。这些属性可以是文件能否被执行,是否是系统文件,以及很多其他信息。详情可以访问微软官方文档。

下面是一个真实的PE文件的PE Header的截图。

Optional Header (IMAGE_OPTIONAL_HEADER)

Optional Header是NT headers中最重要的,PE加载器会查找这个header中提供的特定的信息来加载以及执行EXE文件。
它被称为可选头部信息是因为有些文件类型 像是obj文件不需要,但是这个header对于镜像文件image file很重要。
Optional Header没有固定的大小,所以会存在 IMAGE_FILE_HEADER.SizeOfOptionalHeader

Optional Header前8个成员对于COFF文件格式来说是必须实现的标准,header剩余的部分是微软对标准定义的一个扩展,结构体中扩展部分的成员会被用于Windows的PE加载器以及链接器。

正如之前提到的,Optional Header 有两个版本,一个用于32bit的Exe,一个用于64bit。这两个版本有以下两方面的区别:

  • 结构体本身的大小(或者说结构体中定义的成员的数量): IMAGE_OPTIONAL_HEADER32有31个成员,而IMAGE_OPTIONAL_HEADER64只有30个成员, 32bit版本多出的成员为DWORD类型的BaseOfData,存储了data section起始位置的Relative Virtual Address.
  • 一些成员的数据类型:下面5个成员在32bit版本中是DWORD,在64bit版本中是ULONGLONG:
    • ImageBase
    • SizeOfStackReserve
    • SizeOfStackCommit
    • SizeOfHeapReserve
    • SizeOfHeapCommit

我们来看一下两个结构体的定义:

typedef struct _IMAGE_OPTIONAL_HEADER {//// Standard fields.//WORD    Magic;BYTE    MajorLinkerVersion;BYTE    MinorLinkerVersion;DWORD   SizeOfCode;DWORD   SizeOfInitializedData;DWORD   SizeOfUninitializedData;DWORD   AddressOfEntryPoint;DWORD   BaseOfCode;DWORD   BaseOfData;//// NT additional fields.//DWORD   ImageBase;DWORD   SectionAlignment;DWORD   FileAlignment;WORD    MajorOperatingSystemVersion;WORD    MinorOperatingSystemVersion;WORD    MajorImageVersion;WORD    MinorImageVersion;WORD    MajorSubsystemVersion;WORD    MinorSubsystemVersion;DWORD   Win32VersionValue;DWORD   SizeOfImage;DWORD   SizeOfHeaders;DWORD   CheckSum;WORD    Subsystem;WORD    DllCharacteristics;DWORD   SizeOfStackReserve;DWORD   SizeOfStackCommit;DWORD   SizeOfHeapReserve;DWORD   SizeOfHeapCommit;DWORD   LoaderFlags;DWORD   NumberOfRvaAndSizes;IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

每个字段的详细解释可以看对应的文档。

让我们看一下实际PE文件中Optional Header的内容。

我们可以讨论一下其中的一些字段,首先是Magic字段,它的值是0x20B意味着这是一个64位的可执行程序。

我们可以看到程序入口点entry point的相对虚拟地址RVA是0x12C4并且代码段Code Section开始于相对虚拟地址0x1000,内存中的段对齐SectionAlignment的大小也是0x1000.

文件中的段对齐File Alignment被设置为0x200,并且我们可以观察任何一个section来验证。

你可以看到,data section的实际内容是从0x22000x2229,然而section剩余部分被0填充直到0x23ff来满足FileAlignment对齐的要求。
SizeOfImage镜像被加载到内存中的大小被设置为 7000 并且 SizeOfHeaders被设置为400,两个各自都是SectionAlignmentFileAlignment的倍数。

Subsystem字段被设置为3,表示这是一个Windows控制台程序。

DataDirectory下面会讲。

总结

本篇文章到此结束,至此我们看了NT Headers结构,详细讨论了File Header和Optional Header。
下一篇文章我们会看一下Data Directories, Section Headers, 以及sections。

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

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

相关文章

人员背夹佩戴识别智慧矿山一体机斜井人员进出识别:安防设备时间显示错乱原因及具体解决办法

在现代矿山行业中,安全和效率是两个核心议题。随着智能化技术的不断进步,智慧矿山的概念逐渐成为现实,特别是在非煤矿山的管理与运营中,智能化手段的应用已经成为提升安全性、效率和经济性的关键。本文将深入探讨人员背夹佩戴识别智慧矿山一体机在配电室无人巡检识别算法中…

windows下python批量更新软件包

前言 相信很多小伙伴都遇到过python有些软件包版本过低导致无法安装一些模块的问题,刚好我前两天也遇到了,这里写个文章记录一下 一、更新pip版本 打开命令控制面板,输入: python -m pip install --upgrade pip二、查看过期的软件包 pip list可以看到有很多已经过期的包也可…

配电室长期无人巡检识别智慧矿山一体机非煤矿山算法:配电室监控与安全管理

随着科技的进步和智能化技术的迅速发展,矿山行业正在经历一场深刻的变革。智慧矿山的概念应运而生,尤其是非煤矿山的管理与运营中,利用智能化手段提升安全性、效率和经济性已成为热门趋势。长期无人巡检作为智能矿山运营的重要组成部分,其应用不仅降低人力成本,还能实时监…

Web小案例

web小案例web小案例 HTML + CSS3dTab<style> *{margin: 0;padding: 0;box-sizing: border-box;font-family: Oswald, sans-serif; } body {display: flex;justify-content: center;align-items: center;height: 100vh;background: #434750; } ul {position: relative;/*整…

电脑桌面好用便签软件有哪些推荐

打工人在电脑桌面上使用一款好用的便签软件,不仅可以随手记录工作信息,还可以高效管理待办事项,让工作事半功倍! 下面一起来看四款电脑桌面好用的便签软件吧! 一、Win 系统自带便笺 优点: 操作简单,系统自带,直接搜索就能打开,创建、编辑便签都非常容易,新手也能快速…

安装cuda

(1)介绍CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA GPU(图形处理器)的强大计算能力进行通用计算,而不仅仅局限于图形渲染。eg:大量的矩阵运算等计算密集型任务CUDA 提供了一套完整的开发工具,包括…

PbootCMS缩略图上传图片被截取变模糊的解决方法

在使用PbootCMS设置缩略图的时候,发现被自动截取了,缩略图没匹配到后台,而是在程序里设置的。具体方法:打开/config/config.php文件,在第40行// 缩略图配置 ico => array(max_width => 2000,max_height => 1000 ), 此两个参数为最大宽度和最大高度,max_height为空…

PbootCMS授权中文域名方法

中文域名需要转码后才能获取授权码 转码步骤:访问转码工具:https://tool.chinaz.com/urlencode 输入中文域名,选择“转成Punycode” 使用转码后的域名进行授权扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javas…

浅谈随机化算法

用处 在很多情况下,我们很难想到一道题目的正解,这时候,,我们不应什么都不干,我们可以骗分! 随机化——一种最常用的骗分方式,而且它在大部分情况下只要使用方式正确,就能获得非常高的部分分,有时甚至能骗过整道题 分类 我所知道的随机化算法大致分三种,分别是纯随机…

高效安全迁移:PG高可用集群实战方案深度解析

PostgreSQL是一个开源的数据库管理系统,相比于其他开源数据库系统,PostgreSQL有更加丰富的数据类型和可扩展性,并因此被广泛采用。在实际工作中,若企业业务需求变动,则有可能面临PG高可用集群迁移的情况。 云掣具备丰富的帮助企业迁移数据平台的实战经验,提供专业的数据库…

pip 下载包失败(特定版本eg: torch==2.2.1+cu118)

背景介绍: 有时候要复现其项目的实验时,环境需要尽量与原作者实验的环境靠近,这样结果浮现的也更加准确。 这里当需要安装torch==2.2.1+cu118等特定版本的时,出现了报错:解决办法: 根据 PyTorch 官方推荐,可以使用以下命令来安装 torch 2.2.1+cu118 版本 pip install to…

智慧工地算法视频分析服务器物料堆放识别算法:提升建筑工地环境保护与效率的关键技术

随着经济的发展和城市化进程的加速,建筑工地数量急剧增加,物料堆放管理成为工地管理中至关重要的一环。裸露的物料堆不仅会造成扬尘污染,影响空气质量,还可能引发一系列环境问题。为了解决这一难题,视频分析服务器的物料堆放识别算法成为了一项关键技术。物料堆放识别算法…