内容引用自:看雪《逆向工程原理》,http://www.blogfshare.com/pe-header-one.html 。 如有错误,欢迎留言。

1、  PE文件是windows操作系统下使用的可执行文件格式。

  PE文件指的是32位的可执行文件。   64位的可执行文件成为PE+ 或者 PE32+。

2、  PE文件格式为

  DOS头(DOS Header)  +  DOS存根(DOS Stub) + PE 头(PE Header)

    + 节表(区块表 section table) + 节(区块 sections)

  各个部分的定义其实都是一个结构体变量

    DOS Header 对应 IMAGE_DOS_HEADER

    PE Header 对应 IMAGE_NT_HEADER

3、  DOS Header 是由 IMAGE_DOS_HEADER 定义,DOS Header固定为40h个字节,

  其中e_magic 和 e_lfanew 是需要关注的,其他可忽略。

typedef struct _IMAGE_DOS_HEADER {

      +00h WORD e_magic  // Magic DOS signature MZ(4Dh 5Ah)   DOS可执行文件标记 ,固定为 “MZ”

      +02h  WORD e_cblp   // Bytes on last page of file

      +04h WORD e_cp   // Pages in file

      +06h WORD e_crlc   // Relocations

      +08h WORD e_cparhdr   // Size of header in paragraphs

      +0ah WORD e_minalloc   // Minimun extra paragraphs needs

      +0ch WORD e_maxalloc  // Maximun extra paragraphs needs

      +0eh WORD e_ss   // intial(relative)SS value   DOS代码的初始化堆栈SS

      +10h WORD e_sp   // intial SP value   DOS代码的初始化堆栈指针SP

      +12h WORD e_csum   // Checksum

      +14h WORD e_ip   //  intial IP value   DOS代码的初始化指令入口[指针IP]

      +16h WORD e_cs   // intial(relative)CS value   DOS代码的初始堆栈入口 CS

      +18h WORD e_lfarlc   // File Address of relocation table

      +1ah WORD e_ovno  //  Overlay number

      +1ch WORD e_res[4]  // Reserved words

      +24h WORD e_oemid   //  OEM identifier(for e_oeminfo)

      +26h WORD e_oeminfo  //  OEM information;e_oemid specific

      +29h WORD e_res2[10]  //  Reserved words

      +3ch LONG  e_lfanew  // Offset to start of PE header

        指向PE文件头(IMAGE_NT_HEADER)的偏移地址,也就是真正PE文件头在文件中的位置。

    } IMAGE_DOS_HEADER

4、DOS Stub

   在DOS Header 下方,是可选项,大小不固定,即使没有DOS Stub ,文件也可以正常运行。

5、PE Header 由 IMAGE_NT_HEADER32 定义, IMAGE_NT_HEADER32 固定为 F8h个字节

    typedef struct _IMAGE_NT_HEADER {

      +0h DWORD Signature                    PE文件标识 , 固定为 50 45 00 00 (“PE00”)

      +4h   IMAGE_FILE_HEADER  FileHeader

      +18h IMAGE_OPTIONAL_HEADER32 OptionalHeader

    } IMAGE_NT_HEADER32

    typedef  struct _IMAGE_FILE_HEADER {      # 固定大小为14h个字节

      +04h    WORD          Machine;   // 运行平台
      +06h      WORD          NumberOfSections; // 文件的区块数目
      +08h    DWORD         TimeDateStamp;  // 文件创建日期和时间
      +0Ch      DWORD       PointerToSymbolTable; // 指向符号表(主要用于调试)  

                COFF符号表的文件偏移位置 常为00 00 00 00
      +10h     DWORD         NumberOfSymbols;  // 符号表中符号个数(同上)  常为00 00 00 00
      +14h      WORD          SizeOfOptionalHeader;  // IMAGE_OPTIONAL_HEADER32 结构大小
      +16h      WORD          Characteristics;  // 文件属性

    } IMAGE_FILE_HEADER

    需要注意的点:

      Machine 定义可执行文件的目标CPU类型,常见的值如下:

      

      NumberOfSections 定义区块的数目

      TimeDateStamp 定义文件创建时间,自1970年1月1日以来计算的秒数

      SizeOfOptionalHeader 定义IMAGE_OPTION_HEADER32的大小,

          对于32位PE文件通常为 00 E0,64位 PE+文件 通常为00 F0

      Characteristics 定义文件的属性,以bit OR形式组合起来,各个位定义属性如下:

      

    typedef struct _IMAGE_DATA_DIRECTORY {

      DWORD VirtualAddress;

      DWORD Size;

    } IMAGE_DATA_DIRECTORY

    #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16

    typedef struct _IMAGE_OPTIONAL_HEADER {

      +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
      +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

    需要注意的点:

      Magic 逆向工程核心原理此处有错误, 普通可执行文件的值为 01 0Bh

      AddressOfEntryPoint 指向入口地址  RVA地址

      ImageBase 指出文件的优先装入地址。 进程虚拟内存空间为0-FFFFFFFF(32位系统),

        EXE、DLL文件被装入内存的0-7FFFFFFF中,SYS文件被装入内存的80000000-FFFFFFFF中。

        对于EXE文件,由于每个文件都使用独立的虚拟地址空间,优先装入地址不会被占用,所以总是可以依照该地址装入,

        EXE文件也不需要重定位信息,一般EXE文件对应的该值为00400000h。

        DLL文件的优先装入地址可能被占用,因此DLL文件必须包含重定位信息,一般DLL文件对应的该值为10000000h

      SectionAlignment  指定了节被装入内存后的对齐单位

      FileAlignment    指定了节存储在磁盘文件中的对齐单位

      SizeOfImage 指定了 当PE文件被加载进内存后在虚拟内存占用的空间大小

      SizeOfHeader  指定了 所有头 + 区块表 的大小

      SubSystem  指定使用界面的子系统,  该字段决定系统如何为程序建立初始的界面,取值如下:

      

      NumberOfRvaAndSizes 指定 DataDirectory 数组长度   目前为止固定为 00 00 00 10h

      DataDirectory  最重要的字段之一,由16个IMAGE_DATA_DIRECTORY结构组成。

        虽然PE文件中的数据是按照装入内存后的页属性归类而被放在不同的节中的,但是这些

        处于各个节中的数据按照用途可以被分为导出表、导入表、资源、重定位表等数据块,

        这16个IMAGE_DATA_DIRECTORY结构就是用来定义多种不同用途的数据块的。

       数据目录列表(DataDirectory) 包含以下结构:  比较重要的是 导出表  导入表  资源表 重定位表 TLS Directory(thread local storage)

      

      

转载于:https://www.cnblogs.com/lwhat/p/7758209.html

PE 文件格式 详解 一相关推荐

  1. 【破解教程】PE文件格式详解(上)

    PE文件格式详解(上) 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specif ...

  2. PE文件格式详解(7)

    调试信息段,.debug 调试信息位于.debug段之中,同时PE文件格式也支持单独的调试文件(通常由.DBG扩展名标识)作为一种将调试信息集中的方法.调试段包含了调试信息,但是调试目录却位于早先提到 ...

  3. PE文件格式详解(3)

    PE可选头部 PE可执行文件中接下来的224个字节组成了PE可选头部.虽然它的名字是"可选头部",但是请确信:这个头部并非"可选",而是"必需&quo ...

  4. [系统安全] PE文件格式详解1

    文章目录 PE文件概述 PE文件相关各类地址 MS-DOS头① DOS Stub② PE头③ Signature字段 IMAGE_FILE_HEADER结构体 IMAGE_OPTIONAL_HEADE ...

  5. PE文件格式详解(手工实现一个可执行文件)

    [转载文章-看雪学院]非常经典 http://www.pediy.com/kssd/index.html 其实还是很多细节的地方没弄懂,保存下来,认真分析分析. [文章标题]: 手写可执行程序 [文章 ...

  6. PE文件格式详解(二)

    0x00 前言 上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起.这个字段 ...

  7. PE文件格式详解(八)

    0x00 前言 前面了解了PE文件的输入和输出,今天来看看另一个重要的结构--资源.资源结构是很典型的树形结构,层层查找,最终找到资源位置. 0x01 资源结构介绍 Windows程序的各种界面成为资 ...

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

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

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

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

最新文章

  1. NXT节点搭建(三)安装Nxt客户端
  2. 直接拿来用!最火的Android开源项目(完结篇)(转)
  3. 一定备足货!卢伟冰再曝红米骁龙855旗舰:性价比之王
  4. PowerShell: 如何使用powershell处理Excel
  5. 一键下载大学慕课等课程视频
  6. html遮罩层动画制作,《Flash遮罩层动画的制作》的教学反思
  7. 2、金字塔原理:思考的逻辑(6-7)-阅读笔记
  8. zip 的ZipEntry转换为InputStream
  9. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
  10. 问卷调查设计以及敏感性问题调查
  11. 无油螺杆鼓风机-市场现状及未来发展趋势
  12. 编译 发布 release的apk
  13. IntelliJ IDEA 2018.2激活方法及常用快捷键
  14. android打开app白色页面,完美解决Android App启动页有白屏闪过的问题
  15. 用命令提示符打开资源管理器目录
  16. html5编写微信留言,HTML5春节(支持微信和填写姓名)祝福所有程序员幸福快乐...
  17. 7-5 修理牧场 (25 分)
  18. 为什么深度学习都在用python,你知道吗
  19. 目前常见的大数据分析软件有哪些?
  20. qps、tps、吞吐量

热门文章

  1. 关键业务开放平台助金融行业数字化转型
  2. 未来架构师的平台战略范例(2)_集装箱
  3. python下使用pymongo操作mongodb
  4. Java设计模式陈列
  5. PHP手机获取6为不反复验证码
  6. 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
  7. Android 图标上面添加提醒(一)使用Canvas绘制
  8. Solaris下设置nfs与nfs挂载
  9. aspnet实现搜索查询_C#算法设计查找篇之01-顺序查找
  10. 蓝桥杯 ADV-204 算法提高 快速幂