PE知识复习之PE的各种头属性解析

一丶DOS头结构体

typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header WORD   e_magic;                     // Magic numberWORD   e_cblp;                      // Bytes on last page of fileWORD   e_cp;                        // Pages in fileWORD   e_crlc;                      // RelocationsWORD   e_cparhdr;                   // Size of header in paragraphsWORD   e_minalloc;                  // Minimum extra paragraphs neededWORD   e_maxalloc;                  // Maximum extra paragraphs neededWORD   e_ss;                        // Initial (relative) SS valueWORD   e_sp;                        // Initial SP valueWORD   e_csum;                      // ChecksumWORD   e_ip;                        // Initial IP valueWORD   e_cs;                        // Initial (relative) CS valueWORD   e_lfarlc;                    // File address of relocation tableWORD   e_ovno;                      // Overlay numberWORD   e_res[4];                    // Reserved wordsWORD   e_oemid;                     // OEM identifier (for e_oeminfo)WORD   e_oeminfo;                   // OEM information; e_oemid specificWORD   e_res2[10];                  // Reserved wordsLONG   e_lfanew;                    // File address of new exe header} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

DOS头是在16位程序下使用的.所以不用全部关心.只需要关心第一个跟最后一个成员记住即可.

DOS头大小是64个字节,十六进制是0x40 总结一下就是说. 4行只有第一行的前两个字节.以及最后一行的4个字节有用.

 WORD   e_magic  这个成员是操作系统检查的MZ头.
 LONG   e_lfanew 这个成员指向PE头.也很重要.如果上面两个成员更改了.那么文件就不能运行了.

二丶NT头解析

  NT头也是我们所指的PE头. 其中NT头包括了文件头跟扩展头.

typedef struct _IMAGE_NT_HEADERS {DWORD Signature;                      PE标识IMAGE_FILE_HEADER FileHeader;         文件头IMAGE_OPTIONAL_HEADER32 OptionalHeader;扩展头
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

NT头的第一个成员也很重要.是PE标识.占4个字节. DOS头的最后一个成员的偏移.就是NT头.(PE)

例如:

操作系统会检查PE头.以及MZ头.检查是否是正确的值.

而NT头中有两个子结构体.一个是文件头.一个是扩展头.这两个头比较重要.

三丶文件头解析

  文件头挺重要的.里面存储了我们的节表个数.等等一些列信息.跟扩展头息息相关.

文件头大小是20个字节. 十六进制 是0x14大小.如果按照16一行分组.那么就是一行零4个字节.是文件头总大小.

typedef struct _IMAGE_FILE_HEADER {WORD    Machine;                        机器型号.表名了我们CPU执行的这个PE文件是x86的还是x64的.有一系列宏标识.WORD    NumberOfSections;                   节表个数. 此成员很重要.标识着我们的节表有多少个.如果节个数小于节的总数那么程序就不能运行.DWORD   TimeDateStamp;                     文件时间.不重要.与文件属性里面的创建事件修改时间无关.编译器填写的    DWORD   PointerToSymbolTable;                           调试器相关DWORD   NumberOfSymbols;                                 调试器相关.WORD    SizeOfOptionalHeader;                          扩展PE头大小,此成员很重要.表明了我们的扩展头总体大小.WORD    Characteristics;                                文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

machine 标识 #define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64 代表是x64运行的程序. 其中 0x14c则带便是86运行的程序.具体可以查看宏

文件头中标红的都很重要. 一个是操作系统判断是什么系统运行的文件.一个是当前PE的节个数.一个表明了扩展头的大小.一个表明了文件属性

总结: 一行零4个字节.其中前4个字节很重要.分别表示机器型号.以及节个数. 一行零2个字节表明了扩展头大小.也很重要.

关于最后一个成员 是按位来做的.具体成员如下.

四丶扩展头解析

  扩展头的大小.在我们的文件头中标识着. 一般是E0大小.扩展头是可以更改的. E0十进制大小是224个字节.

我们看一下扩展头结构.

x86跟x64的扩展头是不一样的.我们直说一下x86

typedef struct _IMAGE_OPTIONAL_HEADER {//// Standard fields.//
WORD    Magic;              //标志.表名了我们的PE是x86还是x64BYTE    MajorLinkerVersion;          //连接器主要版本号BYTE    MinorLinkerVersion;          //连接器次要版本号 例如 3.54 主要版本就是3.次要就是54DWORD   SizeOfCode;                  //代码段大小,以字节为单位.DWORD   SizeOfInitializedData;       //初始化数据部分的大小.DWORD   SizeOfUninitializedData;     //未知初始化数据的大小DWORD   AddressOfEntryPoint;         //OEP 程序入口点,驱动程序也是入口点.对于DLL而言.是可选的.没有入口则为0DWORD   BaseOfCode;                  //指向代码部分的指针              DWORD   BaseOfData;                  //指向数据部分开头的指针//// NT additional fields.//
DWORD   ImageBase;                  //基址.PE文件加载到内存中的基址.这个值是64k的倍数.DLL默认值是0x100000000,应用程序默认是0x00400000                                         windows CE除外.他是0x00010000DWORD   SectionAlignment;           //PE文件加载到内存中.的内存对齐.按照这个成员进行对齐DWORD   FileAlignment;              //文件对齐,PE存数据存放在文件中.按照文件对其值对其WORD    MajorOperatingSystemVersion;//所需要操作系统的主要版本号.WORD    MinorOperatingSystemVersion;//所需要操作系统的次要版本号.WORD    MajorImageVersion;          //PE主版本号WORD    MinorImageVersion;          //PE次版本号WORD    MajorSubsystemVersion;      //子系统主要版本号.WORD    MinorSubsystemVersion;      //子系统次要版本号.DWORD   Win32VersionValue;          //保留成员,必须为0DWORD   SizeOfImage;                //PE镜像大小.必须是内存对齐的倍数. sizeofImage/SectionAllignment == 0 才可以DWORD   SizeOfHeaders;               // DOS头+NT头+节表的总大小.按照文件对齐存放 sizeofHeaders / FileAlignment == 0   DWORD   SubSystem             //表名PE文件是什么程序. 1驱动程序2窗口程序3控制台程序(DLL)DWORD   CheckSum;                   WORD    DllCharacteristics;         //P的文件属性DWORD   SizeOfStackReserve;         //堆栈保留字节数.我们的程序使用的栈空间多大靠这个成员.不过操作系统只作为参考DWORD   SizeOfStackCommit;          //要为堆栈提交的字节数.不做参考DWORD   SizeOfHeapReserve;          //堆保留字节数.DWORD   SizeOfHeapCommit;           //本地堆提交的字节数. PS: 栈堆保留数值.斗鱼自己的sizeof(Head/stack)Commit成员有关.DWORD   LoaderFlags;                //成员已经过时DWORD   NumberOfRvaAndSizes;        //数据目录数组的大小IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

总结来说.上面的成员挺多的.也很重要.

OEP  AddressOfEntryPoint 指明了PE入口点.在扩展头的0x10字节位置.也就是扩展头往下数一行就是OEP. OEP所在位置是一行零4个字节.ImageBase 基址. 指明了PE加载时候的基址.基址+ OEP就能确定代码在哪里开始运行. 0x1c位置处.也就是扩展头下数一行零12个字节,下面4个字节就是Image. Image所在位置是2行位置.
SectionAlignment 内存对齐,PE加载到内存中所需要的对齐值. 在扩展头两行位置处.往下数4个字节就是. 所在位置两行零4个字节
FileAlignment 文件对齐,PE存放在文件中的数据的对齐值.扩展头两行零4个字节位置. 所在位置是两行零八个字节.也就是两行半.
 SizeOfImage PE的镜像大小. 扩展头 三行半位置往下数4个字节 所在位置.三行零12字节位置处.
SizeOfHeaders DOS头+NT头+节表的大小.按照文件对齐放在文件中的成员. 三行零12字节位置处往下数4个字节. 所在位置是4行位置.
NumberOfRvaAndSizes 数据目录大小.所在位置六行位置处 下面都是数据目录了.数据目录指明了导入表导出表等等一些列的表格位置

关于扩展头.重要成员就这么多. 主要就是熟悉各成员之间的关系.

sizeofImage 跟 内存对齐成员有关  sizeofImage / sectionAlignment == 0sizeofHeaders 头大小.跟文件对齐有关  SizeofHeaders /  FileAlignment == 0

五丶数据目录

  数据目录在我们的扩展头中.作为一个子结构体存放

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

数据目录的作用就是指明了PE文件的导入表.导出表等等一些列表格在哪里存放. 有两个成员.一个是虚拟地址.一个是大小.

 
 
 
 

转载于:https://www.cnblogs.com/iBinary/p/9714965.html

PE知识复习之PE的各种头属性解析相关推荐

  1. PE知识复习之PE的两种状态

    PE知识复习之PE的两种状态 一丶熟悉PE的整体结构 从下面依次网上看.可以得出PE结构 其中DOS头有DOS头结构 也就是 IMAGE_DOS_HEADER 关于结构体的各项属性.前边已经写过了.本 ...

  2. PE知识复习之PE的导入表

    一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数  函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的.  PE文件需要依赖那些模块.以及依赖这些模块中的那 ...

  3. PE知识复习之PE的导出表

    一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就需要依赖DLL.系统DLL就 ...

  4. 滴水逆向三期实践1:PE头字段解析,附PE结构下载

    视频资源详见网盘搜索 或 在线的B站滴水逆向三期 其课件也能在CSDN或百度搜索到,以下部分为课件内容摘要,部分为自己的理解 最后附上详细注释的自写代码 PE(Portable Executable) ...

  5. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  6. 2011计算机等级考试二级c语言公共基础教程.doc,2011年全国计算机等级考试二级c语言公共基础知识复习100题及答案.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试 2011年全国计算机等级考试二级c语言公 ...

  7. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)...

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  8. 什么是windows PE 告诉你Windows PE是什么东东?详细介绍一下winpe精简系统

    什么是windows PE 告诉你Windows PE是什么东东?详细介绍一下winpe精简系统 针对菜菜朋友可以对PE这样理解: 大家是不是都用过xp系统?(一个独立的操作系统) xp系统是由好多好 ...

  9. 【逆向】PE结构分析和关于PE的一些问题及解决

    目录 前言: 开始需要大概了解一些名词: 程序的装入(地址的变换) 分页机制: 大概带着这些知识后,再来看PE的结构: 一些结构的定义 关于地址计算的一些问题 经典例题: 例题分析 ☆如何在PE中查找 ...

最新文章

  1. 红帽7 -本地yum配置
  2. 前端开发-认识前端开发-0226
  3. java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
  4. rpc之使用httpserver实现tpc
  5. pdf python 3.7编程快速入门 潘中强_无python基础,这些书籍可以帮您快速入门。
  6. freemarker java静态方法_java Freemarker页面静态化实例详解
  7. QT_布局管理器 网格布局管理器 QGridLayout 超简单
  8. 视频教程-Excel VBA网抓教程【你学得会】-Office/WPS
  9. [激光器原理与应用-14]:激光器企业组织内部结构解剖
  10. 小程序 tabBar菜单
  11. 微信小程序│ 游戏开发 │连连看游戏
  12. 触宝发布2018年第四季度财报 净收入增长147%
  13. android 经纬度的格式,的Android如何转换经纬度成度格式
  14. C语言学习(七)之数组
  15. 如何给单据分录上增加核算项目的F7(代码示例)。
  16. Photoshop文字特效——炫彩效果文字
  17. 简单了解实体框架EF(Entity Framework)
  18. 鼠标滑轮,滑动加载效果
  19. 操作系统教程第六版——第三章课后作业
  20. html文章目录自动生成,javascript:如何自动生成一篇文章的目录

热门文章

  1. python输出文档内容_python输出文件
  2. 微型计算机的硬件系统普遍采用,2016年9月计算机一级《MS Office》考题与答案
  3. BUUCTF Web [GXYCTF2019]Ping Ping Ping
  4. ai音响怎么连接网络_KTV音响设备怎么连接?点歌机怎么连接?学习下
  5. SPOJ 375 Query on a tree(线段树维护树链剖分)
  6. CentOS配置主机名和主机映射
  7. OpenFeign封装为springboot starter
  8. CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
  9. wannacry哭泣勒索病毒一键修复工具
  10. 面试题13. 机器人的运动范围