以下内容摘录自《加密与解密》:

  为了在PE文件中避免有确定的内存地址,出现了相对虚拟地址(RVA)的概念。RVA只是内存中的一个简单的相对于PE文件装入地址的偏移位置。它是一个“相对”地址,或称为“偏移量”。

  例如,假设一个EXE文件从地址400000h处装入,并且它的代码区块开始于401000h,代码区块的RVA将是401000h-400000h=RVA1000h。

  PE装载器将从IMAGE_DOS_HEADER结构中的e_lfanew字段里找到PE Header的起始偏移量,加上基址得到PE头的指针。

  PE相关结构NT映像头(IMAGE_NT_HEADER)由三个字段字组成:

  1. typedef struct _IMAGE_NT_HEADERS {
  2. DWORD Signature;
  3. IMAGE_FILE_HEADER FileHeader;
  4. IMAGE_OPTIONAL_HEADER OptionalHeader;
  5. } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

其中,IMAGE_OPTIONAL_HEADER 结构如下:

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

最后的数据目录表的结构有很多,比较重要的有输入表、输出表、资源等。

区块映射到内存后,其偏移位置就发生变化了。文件偏移地址与虚拟地址关系如下:

File Offset = RVA - △k

在同一区块中,各地址的偏移量是相等的,但不同区块在磁盘和内存中的差值不一样。

PE文件格式的更多相关文章

  1. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  2. PE文件格式 持续更新ing

    PE文件就是exe文件和dll文件,前者是可执行文件,后者是动态连接库文件.两者的区别仅仅是字面上的,唯一的区别就是内部的一个字段标识这个文件是exe文件还是dll文件. 对于PE文件格式,举一个例子 ...

  3. 深入理解 Win32 PE 文件格式

    深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...

  4. PE文件格式详解(下)

    作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...

  5. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  6. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  7. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  8. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  9. PE文件格式分析

    PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...

  10. PE文件格式对定位病毒特征码的作用

    本文主要从杀毒软件查杀病毒的原理出发,分析PE文件格式在杀毒软件定位病毒特征码中的作用.杀毒软件通过快速准确定位病毒特征码,对伪装,隐藏,变种病毒进行查杀. 一.杀毒软件查杀病毒的原理概述 对于操作系 ...

随机推荐

  1. 为大家分享一个 Ajax Loading —— spin.js(转)

    原文地址:http://www.cnblogs.com/lxblog/p/3425599.html 我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Load ...

  2. poj2284 That Nice Euler Circuit(欧拉公式)

    题目链接:poj2284 That Nice Euler Circuit 欧拉公式:如果G是一个阶为n,边数为m且含有r个区域的连通平面图,则有恒等式:n-m+r=2. 欧拉公式的推广: 对于具有k( ...

  3. Objective-C:Foundation框架-常用类-NSMutableString

    NSString是不可变的,不能删除字符或修改字符,它有一个子类NSMutableString,为可变字符串. NSMutableString的两种创建方法: - (id) initWithCapac ...

  4. jQuery Easing动画效果扩展(转)

    jQuery API提供了简单的动画效果如淡入淡出以及自定义动画效果,而今天我给大家分享的是一款jQuery动画效果扩展增强插件jquery.easing.js,使用该插件可以实现直线匀速运功.变加速 ...

  5. JavaScript EventLoop

    转自:http://cek.io/blog/2015/12/03/event-loop/ What is JavaScript What is JavaScript anyway? Some word ...

  6. 如何解决linQ“序列不包含任何元素”的问题?

    描述:该问题出现在校对BT种子数据的时候遇到的bug,原因是使用linq查找元素的时候 B是A的一个子集, B在A中一定存在,这种情况下就不会抛出异常情况,反之B的一部分不属于A就会异常应为B中的一个 ...

  7. myeclipse设置编码格式的4种情况

    (1).设置myeclipse工作空间的编码格式,作用范围最大 window-->preference-->general-->workspace-->text file en ...

  8. 如何在datagridview 的head上绘制一个全选按钮

    winform的项目中,经常要用到datagridview控件,但是为控件添加DataGridViewCheckBoxColumn来实现数据行选择这个功能的时候,经常需要提供全选反选功能,如果不重绘控 ...

  9. c++ 普通高精除高精

    //codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...

  10. WCF如何通过契约加编码方式调用

    WCF采用基于契约的服务调用方法,通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象. 创建服务代理 public stati ...