PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称。里面包含了许多PE装载器用到的重要字段。

先看看该结构体:

typedef struct _IMAGE_NT_HEADERS {DWORD                 Signature;IMAGE_FILE_HEADER     FileHeader;IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

第一个参数是一个标志。在一个有效的PE文件里, Signature字段被设置为 00004550h, ASCI|| 字符码是: PE00。标志着PE文件的开头。
看看下面的这个例子,使用UE查看的16进制代码:

第二个参数是:IMAGE_FILE_HEADER。如下图:

说完了这个 IMAGE_FILE_HEADER 结构,那么接下来就是第三个参数OptionalHeader。

先看看这个结构体的定义吧。

typedef struct _IMAGE_OPTIONAL_HEADER
{
//
// Standard fields.
//
+18h WORD Magic; // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah BYTE MajorLinkerVersion; // 链接程序的主版本号
+1Bh BYTE MinorLinkerVersion; // 链接程序的次版本号
+1Ch DWORD SizeOfCode; // 所有含代码的节的总大小
+20h DWORD SizeOfInitializedData; // 所有含已初始化数据的节的总大小
+24h DWORD SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h DWORD AddressOfEntryPoint; //----!!!!!! 程序执行入口RVA
+2Ch DWORD BaseOfCode; // 代码的区块的起始RVA
+30h DWORD BaseOfData; // 数据的区块的起始RVA
//
// NT additional fields. 以下是属于NT结构增加的领域。
//
+34h DWORD ImageBase; // ----!!!!!!程序的首选装载地址
+38h DWORD SectionAlignment; // 内存中的区块的对齐大小
+3Ch DWORD FileAlignment; // 文件中的区块的对齐大小
+40h WORD MajorOperatingSystemVersion; // 要求操作系统最低版本号的主版本号
+42h WORD MinorOperatingSystemVersion; // 要求操作系统最低版本号的副版本号
+44h WORD MajorImageVersion; // 可运行于操作系统的主版本号
+46h WORD MinorImageVersion; // 可运行于操作系统的次版本号
+48h WORD MajorSubsystemVersion; // 要求最低子系统版本的主版本号
+4Ah WORD MinorSubsystemVersion; // 要求最低子系统版本的次版本号
+4Ch DWORD Win32VersionValue; // 莫须有字段,不被病毒利用的话一般为0
+50h DWORD SizeOfImage; // 映像装入内存后的总尺寸
+54h DWORD SizeOfHeaders; // 所有头 + 区块表的尺寸大小
+58h DWORD CheckSum; // 映像的校检和
+5Ch WORD Subsystem; // 可执行文件期望的子系统
+5Eh WORD DllCharacteristics; // DllMain()函数何时被调用,默认为 0
+60h DWORD SizeOfStackReserve; // 初始化时的栈大小
+64h DWORD SizeOfStackCommit; // 初始化时实际提交的栈大小
+68h DWORD SizeOfHeapReserve; // 初始化时保留的堆大小
+6Ch DWORD SizeOfHeapCommit; // 初始化时实际提交的堆大小
+70h DWORD LoaderFlags; // 与调试有关,默认为 0
+74h DWORD NumberOfRvaAndSizes; // 下边数据目录的项数,这个字段自Windows NT 发布以来 // 一直是16
+78h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//----!!!!!!!! 数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

这是个可选映像头,是一个可选的结构体。里面定义了很多PE文件的属性。

然而  这个结构体的大部分字段不重要的,虽然这么多。重点掌握上面的注释以 “//---!!!!!!*****”的字段。
    下面是各字段的解释:

AddressOfEntryPoint 字段

指出文件被执行时的入口地址,这是一个RVA地址。若在一个可执行文件上附加了一段代码并想让这段代码首先被执行,呢么只需要将这个入口地址指向附加的代码就行了。

ImageBase 字段:

之初文件的有点先装入地址,也就是当文件被执行时,若可能,Windows有限将文件装入到ImageBase 字段指向的地址中,只有指定的地址已经被其他的模块使用时,文件才被装入到其他地址中,链接器产生可执行文件的时候对应 这个 地址来生成机器码。当文件被装入这个地址时不需要进行重定位操作,装入速度最快,若文件被装载到其他的地址,将不得不进行重定位操作。

在链接的时候,可以自定义优先装载地址,如果不指定这个选项话,一般地EXE文件的默认装载地址是00400 0000h,而DLL文件的默认优先装土地址被定位1000 0000h。

SectionAlignment 和 FileAlignment字段

SectionAlignment字段指定了字节被装入内存 后的对齐的单位,每个字节被装入的地址必定是本子段指定的数值的整数倍。而FileAlignment字段指定了存储在磁盘文件中的对齐的单位。通常来讲X86CPU的内存对齐页面大小是4KB。

Subsystem 字段

指定使用界面的子系统。这个字段决定了系统如何为程序建立初始化的界面,连接时的/subsystem:xxx 选项指定的就是这个字段的值。

DataDirectory 字段

数据目录表。这个字段是一个指针,它由16个相同的 IMAGE_DATA_DIRECTORY,结构组成。虽然PE文件中的数据是按照装入内存后的页属性归类而被放在不同的字节中,但是这些处于各个字节中的数据按照用途可以被分为导出表,导入表,资源,重定位表等数据块,这个16个IMAGE_DATA_DIRECTORY 结构就是用来定义多种不同的数据块。它的定义很简单,仅仅指出了某种数据块的位置和长度:

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

在PE文件中寻找特定的数据时,就是从这些IMAGE_DATA_DIRECTORY 结构开始的。

PE文件详解之IMAGE_NT_HEADER结构相关推荐

  1. PE文件详解(教程1-7)

    PE文件详解(教程1-7) ========================================= PE教程1: PE文件格式一览 PE 的意思就是 Portable Executable ...

  2. PE文件结构详解 --(完整版)

    From:https://blog.csdn.net/adam001521/article/details/84658708 PE结构详解:https://www.cnblogs.com/zheh/p ...

  3. Linux 目录结构及特殊文件详解

    一.linux目录详解 1./(根)目录 每一个文件和目录从根开始,/下的目录有: 2./bin目录 看到"bin"大家应该能想到 bin 文件, bin 文件就是可执行文件.所以 ...

  4. 使用ls命令查看Linux的目录结构,linux ls命令查看目录文件详解

    首页 > Linux教程 > 常用命令 > ls 查看目录文件 linux ls命令查看目录文件详解 linux中ls命令用来查看目录中的所有文件和子目录,可选的参数比较多,本文筛选 ...

  5. PE文件结构详解(四)PE导入表

    PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...

  6. PE文件结构详解(二)可执行文件头

    by evil.eagle 转载请注明出处. http://blog.csdn.net/evileagle/article/details/11903197 在PE文件结构详解(一)基本概念里,解释了 ...

  7. 【转】PE文件结构详解--(完整版)

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 ...

  8. PE 格式详解与试验

    PE 格式详解与试验 可执行文件结构分析 DOS头 文件头 可选头 PE RVA 地址与文件地址转换 块表 Section Header 导入表 Data Directory 基址重定位 reloc ...

  9. PE文件结构详解(一)基本概念

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 ...

最新文章

  1. 从源码了解spring bean实例化过程
  2. socket心跳检测
  3. SpringBoot 统一异常处理 ControllerAdvice
  4. 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器
  5. POJ 1228 Grandpa's Estate --深入理解凸包
  6. 接口开发指的是什么_企业在什么情况下要选择定制开发软件
  7. c 调用上层类中函数_Matlab系列之函数嵌套
  8. CMakeList.txt的简介
  9. Crontab 计划任务
  10. coco训练集darknet_YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
  11. 一印度学生Asp.net源码分享讨论
  12. 洛谷 P1896 状压DP
  13. 面试官最爱的volatile关键字
  14. 地产行业信息化建设分析
  15. 为Linux内核text段计算SHA1摘要以检测篡改
  16. 入门GTD时间管理系统必读(链接必读--很完整的一个GTD系统)
  17. VC++中使用使用winnet类获取网页内容
  18. s3c24xx的时钟初始化
  19. 如何用Excel做一个战斗模拟器(三)战斗过程模拟
  20. 最初的承諾都抵不過時間的洗禮。

热门文章

  1. unity中用shader实现大海的特效
  2. 信息安全数学基础电子书_电子书推送No.111
  3. 瑜伽八支,瑜伽人的精进之路|阿斯汤加瑜伽(Ashtanga Yoga)第一序列学习与实践笔记(九)
  4. 白帽子讲web安全——第二章 Note
  5. Wondershare Filmora for Mac(视频编辑软件)
  6. (9)调整图像的亮度和对比度
  7. Termius 的替代方法
  8. 彻底删除Windows 7下残留打印机驱动
  9. 双人合作:黄金点游戏进阶
  10. 计划任务-定时关闭、重启软件