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

一丶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 (虚拟地址位置)

原文地址:https://www.cnblogs.com/gd-luojialin/p/11306166.html

时间: 2024-08-04 19:21:43

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

VA&RVA 和 RVA to RAW

VA&RVA VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准位置(ImageBase)开始的相对地址.VA与RVA满足下面的换算关系. RVA + ImageBase = VA PE(Portable Executable)头部信息大多以RVA形式存在.原因在于,PE文件(主要是DLL)加载到进程虚拟内存的特定位置时,该位置可能已经加载了其它PE文件(DLL,Dynamic Linked Library).此时必须通过重定位

关于ansbile工具的shell、command、script、raw模块的区别和使用场景

之前一直误解为shell和command一样是执行远程命令的,最近看了一下官方帮助文档才发现,犯了低级错误,其实每个模块都有自己的应用常用:简单说明一下ansible几个常用模块的区别,以便自己总结. 1.模块命令详细信息查询 ansible-doc 模块名称 2.command模块 [执行远程命令] ansible client -m command -a "uname -n" -s 3.script模块 [在远程主机执行主控端的shell/python脚本] ansible cli

RVA to RAW

相对虚拟地址和文件偏移间的转换 RVA是相对虚拟地址(Relative Virtual Address)的缩写.RVA是当PE 文件被装载到内存中后,某个数据位置相对于文件头的偏移量. 例如:导入表的位置和大小可以从PE文件头中IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,对应的项目是DataDirectory字段的第2个IMAGE_DATA_DIRECTORY结构.从IMAGE_DATA_DIRECTORY结构的VirtualAddress字段得到的是导入表的RVA值

python2.7中可以使用到的一些模块地址

1.reportlab:由很多部分组成且允许用户使用多种方法创建输出,地址: 下载ReportLab https://pypi.python.org/simple/reportlab/ http://www.reportlab.com/software/opensource/rl-toolkit/download/ 安装后释放文件会在Lib\site-packages\下面,程序能够自己找到 2.py2exe:用来将.py的python文件创建成windows下通用的exe文件,地址: 下载地址

yum安装memcache,mongo扩展以及python的mysql模块安装

//启动memcached/usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -p 11211 -u root/usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -p 11212 -u root 1.安装mongodb mongodb安装在/usr/local/mongod 目录下mkdir /usr/local/mongod/data //存放数据, touch /usr/loc

ansible之command和raw模块

command模块 command模块为ansible默认模块,不指定-m参数时,使用的就是command模块: comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,运行中的命令不支持变量使用以及不支持管道: 示例:显示当前用户 [[email protected] ~]# ansible all -

php动态扩展bcmath与sockets库模块

在学习安装zabbix的时候,前提需要搭建使用到LNMP框架,而在编译php时忘记添加bcmath与sockets 扩展包,发现当初安装时没有--enable-bcmath.--enable-sockets,自己又不想删除重装php,幸好php支 持单独添加某个extension,重要的就是要生成这个扩展对应的.so文件. 具体做法如下,要有与你已安装的php相同版本的php源代码安装包.我用的是php-7.0.5.tar.gz. [[email protected] ~]# tar -zxf

转: PE rva to raw 虚拟偏移地址和文件物理偏移地址

+---------+---------+---------+---------+---------+---------+| 段名称 虚拟地址 虚拟大小 物理地址 物理大小 标志 |+---------+---------+---------+---------+---------+---------+| Name VOffset VSize ROffset RSize Flags |+---------+---------+---------+---------+---------+-----

软件模块和领域概念

技术上我们经常强调模块化.组件化,但是能真正实现软件模块化,需要通过对业务领域有一定程度的理解才能达到. 我们可能有专业培训组件和模块技术的课程(OSGi等),但这类课程并不会告诉我们所在的领域上具体情况应该如何划分模块,大概辨别和划分模块的能力是理所当然.但事实上并非如此. 用一个例子说明:假如一个网站需要添加一个广告功能.大概有以下可能性: 如果该网站本来是没有模块化的,直接就往代码里做修改.而后果会是代码越来越庞大 如果该网站已经划分了不同的模块,我们会看看新的功能是否属于哪个曾经定义过的