PE文件格式详解(四)

PE文件格式详解(四)

0x00 前言

上一篇介绍了区块表的信息,以及如何在hexwrokshop找到区块表。接下来,我们继续深入了解区块,并且学会文件偏移和虚拟地址转换的知识。

0x01 区块对齐值

首先我们要知道啥事区块对齐?为啥要区块对齐?这个问题其实困扰了我很久,只能怪我操作系统没学好。。。我现在的理解是由于内存和磁盘存在分页的问题所以使得不同区块一般要放到不同的分页中,当然也可以多个区块合并以节省空间,但是对于不能合并的区块如代码和数据块就不得不放在不同分页上了。学过操作系统的都知道不管是磁盘和内存分页都是一个大学问。由于不同块放在不同分页,其实这个对齐值就是分页的整数的值。至于为啥要区块对齐,这也是有分页导致的。下图为PE文件加载映射示意图:

根据上图我们知道PE文件有两个对齐值,一个是磁盘的对齐值,一个是内存中的对齐值。

1)磁盘中对齐值是定义在PE文件头中的FileAligament中。每一块区块从对齐值倍数位置开始存放,对于没有填满的部分会用0填充。这些0构成了区块间隙。例如:对齐值为200h,一个区块大小位50h,它从400h开始存放,直到450h结束,其后的450h到600h就用0填充。

2)内存的对齐值和磁盘差不多。它是定义在PE文件头的SectionAligaments中。它也是从一个对齐值整数倍开始存放,未填满的用0填充。

0x01 文件地址和虚拟地址转换

首先为啥要转换?由上图可知,其实主要是是因为PE文件加载后它在磁盘和内存中的地址是不一样的。我们一般都能抓取他在内存中的值,然后根据内存中的值(叫虚拟地址)来逆推出它在磁盘中的位置。这样我们也能判断PE加载后到底调用了系统中哪些函数。下图展示了各个地址间的关系:

这里的FileOffset就是我们要找的各个区块在磁盘中的位置。

由于同一区块内FileOffset和相对地址RAV之间的值是一定的。比如.text区块中的FileOffset和RVA之间都是0c00h,用k表示他们之间的差值。就有公式FileOffset=RAV-K,一般情况下都是由RVA求FileOffset。

举个例子:某个PE文件载入后读出的虚拟地址VA值为401112h,ImageBase值为400000h,k的值为0c00h,求它的文件的FileOffset值。

RAV=VA-ImageBse=401112h-400000h=11112h

FileOffset=RVA-k=11112h-0c00h=512h。

原文地址:https://www.cnblogs.com/2f28/p/9818333.html

时间: 2024-10-09 21:27:42

PE文件格式详解(四)的相关文章

PE文件格式详解(上)

作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩.  然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式.本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述

PE文件格式详解(下)

作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata和.debug.一些应用程序不需要所有的这些段,同样还有一些应用程序为了自己特殊的需要而定义了更多的段.这种做法与MS-DOS和Windows 3.1中的代码段和数据段相似.事实上,应用程序定义一个独特的段的方法是使用标准编译器来指示对代码段和数据段的命名,或者使用名称段编译器选项-NT——就和Wi

PE文件格式详解(六)

0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以为找到输入DLL就完了,其实这一流程的最终功能是通过输入DLL找到输入DLL调用的函数,这一步骤是通过输出表结构中的OriginalFristThunk或者OriginalFristThunk所指向的INT或者IAT结构来找到的.这里要说明的是,虽然一般情况通过OriginalFristThunk也

PE 文件格式 详解 二

内容引用自:看雪<逆向工程原理>,http://www.blogfshare.com/pe-header-one.html .如有错误,欢迎留言. 1. 区块表(节表) 区块表紧跟在PE头后面,所有区块的属性都被定义在区块表中.区块表中的数据仅仅是因为属性相同被放到一起,对程序的各种方法.数据的追溯还是要用到DataDirectory. 区块表是由一组IMAGE_SETION_HEADER结构组成,每个结构描述一个区块,各结构的排列顺序与其所描述的区块在文件中的排列顺序是一致的. 区块表最后以

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

PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPORT,即导入表. 也许大家注意到过,在IMAGE_DATA_DIRECTORY中,有几项的名字都和导入表有关系,其中包括:IMAGE_DIRECTORY_ENTRY_IMPORT,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,IMAGE_DIRECTORY_ENTRY_IAT

Android逆向之旅---SO(ELF)文件格式详解

第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的.但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解.所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容.今天我们先来介绍一下elf文件的

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

在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格式,重要的信息都包含在头部,顺着头部的信息,可以引导系统解析整个文件.所以,我们先来认识一下PE文件的头部格式.还记得上篇里的那个图吗? DOS头和NT头就是PE文件中两个重要的文件头. 一.DOS头 DOS头的作用是兼容MS-DOS 操作系统中的可执行文件,对于32位PE文件来说,DOS所起的作用

LinuxELF文件格式详解--Linux进程的管理与调度(十二)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 对象文件格式 对象文件 首先,你需要知道的是所谓对象文件(Object files)有三个种类: 可重定位的对象文件(Relocatable file) 可执行的对象文件(Executable file) 可被共享的对象文件(Shared object file) 可重定位的对象文件(Re

PE文件结构详解(五)延迟导入表

PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因为有些导入函数可能使用的频率比较低,或者在某些特定的场 合才会用到,而有些函数可能要在程序运行一段时间后才会用到,这些函数可以等到他实际使用的时候再去加载对应的DLL,而没必要再程序一装载就初始化好. 这个机制听起来很诱人,因为他可以加快启动速度,我们应该如何利用这项机制呢?VC有一个选项,可以让我