PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)

一丶VA概念

VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址

这边都是.

二丶模块地址(image Base)

模块地址,就是exe加载到内存的时候,所在的地址,

比如MZ位置,在那个位置,那么对应模块地址就是这个位置

在OD中的内存中查看就是PE头

三丶RVA(relative Virtual Address) 相对虚拟地址偏移

假设我们找一个虚拟地址

VA = 0X4001200   (虚拟地址)

那么算出他的相对偏移

那么我们就要看他属于内存中那个节区了

可以看出,是在401000 ~ 41500之间,那么我们就用401000即可.

RVA = VA - 401000  得出的就是相对于虚拟地址的偏移

简化

RVA = 401200 - 401000 = 200(RVA)  那么偏移就是200了

四丶FA(RAW)(File Address) 或者叫做  FOA (File Ofseet Address)

FA就是文件中的地址.

那么这个要看我们的节表了

节表(就是那个区)上面我们看了是.text 也就是代码区,正好是属于第一个节表,那么看第一个节表中的PointerToRawData成员即可.

五丶VAtoRaw(虚拟地址,转化为文件偏移位置,就是虚拟地址的代码,在文件那个偏移位置存储)

首先你要明白 RVA 怎么计算,FA怎么看.

我们随便找一个PE文件(我用最小的标准PE)

我要找40101A虚拟地址,在文件中的位置.

思路:

1.获得虚拟地址(VA)  现在是40101A

2.查看属于哪个节区表(点击内存查看,OllyDbg)

大于401000,小于402000,所以节区属于代码区,也就是.text这个区域

3.算出RVA(相对虚拟地址偏移)

RVA = VA - 内存中节区地址

代入得到:

RVA = 40101A - 401000

RVA = 1A   (相对虚拟地址偏移是1A)

4.RVA + 文件中的(相同节表,比如上面是.text,那么文件中看的节表就是.text这个节表)节表中的PointerToRawData成员记录的大小 得出虚拟地址在文件中的偏移

1A + (文件中节表的偏移) = 实际虚拟地址在文件偏移记录的代码地址.

1A + 200 = 21A  (虚拟地址在文件中的偏移)

200要查看节表,还记得上面我们算RVA的时候吗,找的是内存中节区的地址,而这个地址正好是.text代码区

那么在文件中我们也要找到这个位置.,节表是第一个,第一个就是,而表中存放的文件偏移就是200

那么现在去文件中的21A位置查看一下,看看是否是我们虚拟地址的代码.

正是我们要找的地址,那么由此可以得出物理地址的代码位置,在文件中存放的偏移在哪里.

总结:

  其实很简单,首先看属于哪个节表的,  那么先算出RVA的值,然后让RVA + 文件中相同节表中的成员(PointRawData)  那么最终就是虚拟地址代码,在文件偏移的位置.

举个例子

VA = 401456

RVA = 401456 - (.text的位置当然这个你得自己看,可能不是,这里默认是了)401000 = 456

FA = 456 + (文件中节表中的PointRawData,我假设是200,这里具体看PE中怎么存储的)200 = 656(十六进制)

那么这个656文件偏移处,记录的就是 虚拟地址(VA)401456的二进制代码.

没优化过的公式

VA = 401234

Image Bae = 400000

RVA = 401234 - 400000 = 1234

VPK  = (内存中节区首地址 - image base) - 文件中节区的偏移地址(PointerToRawData 字段)

(401000 - 400000 ) - 400(这个值自己看文件,不一定是400)= 1000 - 400 = C00(vpk);

FA = RVA - VPK  = 1234 - C00 = 634

例子:

已经知道VA = 401456

计算FA位置

RVA = 401456 - 00400000 = 1456

VPK = (401000 - 400000) - 文件中PointerToRawData 字段

  =  1000 - 400 = C00

FA = RVA - VPK

  = 1456- C00 = 856

优化的公式

 FA =  VA - 内存中节区地址 + 文件PointerToRawData 字段

列如VA = 401596

当然,节区你要看内存,上面已经说了怎么看.(怎么看节区表)

401596 - 401000 + 400

  = 596 + 400

  = 996  (FA)

如果按照上面的公式,我们再来计算一遍

VA = 401596

IMAGEbase = 400000

RVA = (虚拟地址 - 模块地址)

  =401596 - 400000

  = 1596

VPK = (节区表首地址- 模块地址)  - 节表中的文件PointerToRawData 字段

  = 401000 - 40000 - 400

  = 1000 - 400

  = C00 (vpk)

FA = RVA - VPK

  = 1596 - C00

  =  996

四丶文件偏移,转为虚拟地址

首先计算文件偏移,我们需要知道文件的位置

比如

1.你要知道一个文件位置, (随便哪个都行,把它转换为内存虚拟地址)

2.我们要知道 文件偏移位置的大小,(也就是上面说的节表中的  PointerToRawData 字段)

3.我们要知道你给的文件位置属于哪个区,这个是根据 上面计算出来FA的首地址的出来的

已经知道FA = 996

计算公式为

VA = FA +imagebase(模块首地址) + VPK

VPK的值就是你要计算的

VPK = (内存中的节区表 - 模块地址) - PointerToRawData字段

代入公式得

VA = 996 + 40000 + (401000 - 400000 - 400)

  =   40996 + C00

  =   41596 (虚拟地址位置)

如果不懂请下方评论.

作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)

PE格式第三讲扩展,VA,RVA,FA(RAW),模块地址的概念的更多相关文章

  1. 第三讲扩展,VA,RVA,FA(RAW),模块地址的概念

    一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边都是. 二丶模块地址(image Base) 模块地址,就是exe加载到内存的时候 ...

  2. PE格式第四讲,数据目录表之导入表,以及IAT表

    PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 他会Call 下边的Jm ...

  3. WinHex分析PE格式(1)

    最近在一直努力学习破解,但是发现我的基础太差了,就想学习一下PE结构.可是PE结构里的结构关系太复杂,看这老罗的WiN32汇编最后一章 翻两页又合上了..把自己的信心都搞没了.感觉自己的理解能力不行, ...

  4. PE格式第六讲,导出表

    PE格式第六讲,导出表 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步, 各种表中之间的关系. 作者: ...

  5. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...

  6. PE格式第八讲,TLS表(线程局部存储)

    PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...

  7. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

  8. 【黑客免杀攻防】读书笔记5 - PE格式讲解

    0x01 MS-DOS头 MS-DOS头部的字段重点关注e_magic与最后一个e_lfanew是需要关注的. 第一个e_magic字段的值为4D5A,作用是可以作为判断这个文件是否是PE文件. 最后 ...

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

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

随机推荐

  1. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  2. [最短路][部分转]P1027 Car的旅行路线

    题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位 ...

  3. 在ERP中定义用户时报错:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间

    在ERP中定义用户时.   报错: SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间. 原因分析: ①没有正确初 ...

  4. websocket(三) 进阶!netty框架实现websocket达到高并发

    引言: 在前面两篇文章中,我们对原生websocket进行了了解,且用demo来简单的讲解了其用法.但是在实际项目中,那样的用法是不可取的,理由是tomcat对高并发的支持不怎么好,特别是tomcat ...

  5. PHP命令空间namespace及use的用法实践总结

    以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...

  6. WCF、WebAPI、WCFREST、WebService之间的区别和选择

    转载翻译,原文:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-a ...

  7. 关路灯,洛谷dp

    题目传送门https://www.luogu.org/problem/show?pid=1220 我们假设 dpij0 为目前最优值是在 i 位置,dpij1 为目前最优值是在 j 位置则 i 到 j ...

  8. [Docker基础]Docker安装教程

    Install Docker Docker支持几乎所有的Linux发行版,也支持Mac和Windows. 各操作系统的安装方法可参考Docker官网. 安装环境 ubuntu 16.04 Docker ...

  9. Android开发之漫漫长途 ⅥI——Android消息机制(Looper Handler MessageQueue Message)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  10. 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查

    在某项目上,使用SQL Server数据库,现场反馈每天定时备份数据库文件,每天的数据量是400多个申请单的量.之前每天增长量是50M,但是后来两天增长量是80M,每天的数据量差不多. 到底从什么地方 ...