PE文件格式
以下内容摘录自《加密与解密》:
为了在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)由三个字段字组成:
- typedef struct _IMAGE_NT_HEADERS {
- DWORD Signature;
- IMAGE_FILE_HEADER FileHeader;
- IMAGE_OPTIONAL_HEADER OptionalHeader;
- } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
其中,IMAGE_OPTIONAL_HEADER 结构如下:
- 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;
最后的数据目录表的结构有很多,比较重要的有输入表、输出表、资源等。
区块映射到内存后,其偏移位置就发生变化了。文件偏移地址与虚拟地址关系如下:
File Offset = RVA - △k
在同一区块中,各地址的偏移量是相等的,但不同区块在磁盘和内存中的差值不一样。
PE文件格式的更多相关文章
- Reverse Core 第二部分 - 13章 - PE文件格式
@date: 2016/11/24 @author: dlive PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...
- PE文件格式 持续更新ing
PE文件就是exe文件和dll文件,前者是可执行文件,后者是动态连接库文件.两者的区别仅仅是字面上的,唯一的区别就是内部的一个字段标识这个文件是exe文件还是dll文件. 对于PE文件格式,举一个例子 ...
- 深入理解 Win32 PE 文件格式
深入理解 Win32 PE 文件格式 Matt Pietrek 这篇文章假定你熟悉C++和Win32. 概述 理解可移植可执行文件格式(PE)可以更好地了解操作系统.如果你知道DLL和EXE中都有些什 ...
- PE文件格式详解(下)
作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...
- PE文件格式详解(上)
作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- PE文件格式详解,第三讲,可选头文件格式,以及节表
PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...
- PE文件格式分析
PE文件格式分析 PE 的意思是 Portable Executable(可移植的执行体).它是 Win32环境自身所带的执行文件格式.它的一些特性继承自Unix的Coff(common object ...
- PE文件格式对定位病毒特征码的作用
本文主要从杀毒软件查杀病毒的原理出发,分析PE文件格式在杀毒软件定位病毒特征码中的作用.杀毒软件通过快速准确定位病毒特征码,对伪装,隐藏,变种病毒进行查杀. 一.杀毒软件查杀病毒的原理概述 对于操作系 ...
随机推荐
- 为大家分享一个 Ajax Loading —— spin.js(转)
原文地址:http://www.cnblogs.com/lxblog/p/3425599.html 我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Load ...
- poj2284 That Nice Euler Circuit(欧拉公式)
题目链接:poj2284 That Nice Euler Circuit 欧拉公式:如果G是一个阶为n,边数为m且含有r个区域的连通平面图,则有恒等式:n-m+r=2. 欧拉公式的推广: 对于具有k( ...
- Objective-C:Foundation框架-常用类-NSMutableString
NSString是不可变的,不能删除字符或修改字符,它有一个子类NSMutableString,为可变字符串. NSMutableString的两种创建方法: - (id) initWithCapac ...
- jQuery Easing动画效果扩展(转)
jQuery API提供了简单的动画效果如淡入淡出以及自定义动画效果,而今天我给大家分享的是一款jQuery动画效果扩展增强插件jquery.easing.js,使用该插件可以实现直线匀速运功.变加速 ...
- JavaScript EventLoop
转自:http://cek.io/blog/2015/12/03/event-loop/ What is JavaScript What is JavaScript anyway? Some word ...
- 如何解决linQ“序列不包含任何元素”的问题?
描述:该问题出现在校对BT种子数据的时候遇到的bug,原因是使用linq查找元素的时候 B是A的一个子集, B在A中一定存在,这种情况下就不会抛出异常情况,反之B的一部分不属于A就会异常应为B中的一个 ...
- myeclipse设置编码格式的4种情况
(1).设置myeclipse工作空间的编码格式,作用范围最大 window-->preference-->general-->workspace-->text file en ...
- 如何在datagridview 的head上绘制一个全选按钮
winform的项目中,经常要用到datagridview控件,但是为控件添加DataGridViewCheckBoxColumn来实现数据行选择这个功能的时候,经常需要提供全选反选功能,如果不重绘控 ...
- c++ 普通高精除高精
//codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...
- WCF如何通过契约加编码方式调用
WCF采用基于契约的服务调用方法,通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象. 创建服务代理 public stati ...