第三讲扩展,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 (虚拟地址位置)
第三讲扩展,VA,RVA,FA(RAW),模块地址的概念的更多相关文章
- PE格式第三讲扩展,VA,RVA,FA(RAW),模块地址的概念
PE格式第三讲扩展,VA,RVA,FA的概念 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (vi ...
- VA&RVA 和 RVA to RAW
VA&RVA VA指的是进程虚拟内存的绝对地址,RVA(Relative Virtual Address,相对虚拟地址)指从某个基准位置(ImageBase)开始的相对地址.VA与RVA满足下 ...
- 关于ansbile工具的shell、command、script、raw模块的区别和使用场景
command模块 [执行远程命令] [root@node1 ansible]# ansible testservers -m command -a 'uname -n' script模块 [在远程主 ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- python之模块copy,了解概念即可
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块copy,了解概念即可 import copy #浅拷贝 #copy拷贝一个对象,但是对象 ...
- c# 外挂操作(内存操作)(内存读写取窗口句柄移动窗口取模块地址)工具类
来源于网上 参考 https://www.cnblogs.com/fuhua/p/5877781.html 等众多文章 详情取看我第二个例子封装功能较多 https://www.cnblogs.co ...
- yum安装memcache,mongo扩展以及python的mysql模块安装
//启动memcached/usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -p 11211 -u root/usr/local/memca ...
- Java进阶知识点8:高可扩展架构的利器 - 动态模块加载核心技术(ClassLoader、反射、依赖隔离)
一.背景 功能模块化是实现系统能力高可扩展性的常见思路.而模块化又可分为静态模块化和动态模块化两类: 1. 静态模块化:指在编译期可以通过引入新的模块扩展系统能力.比如:通过maven/gradle引 ...
- 转: PE rva to raw 虚拟偏移地址和文件物理偏移地址
+---------+---------+---------+---------+---------+---------+| 段名称 虚拟地址 虚拟大小 物理地址 物理大小 标志 |+-------- ...
随机推荐
- oracle查询表指定字段类型
查询表某字段类型,如下: SELECT data_type FROM all_tab_cols WHERE table_name = UPPER('SRIS_P_BaseInfo') and colu ...
- JavaScript DOM的一些扩展
对DOM的扩展主要是:Selectors API和HTML5. Selectors API Selectors API是由W3C发起指定的一个标准,致力于让浏览器原生支持CSS查询.Selectors ...
- RDD java API使用
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- Android架构(一)MVP架构在Android中的实践
Android架构(一)MVP架构在Android中的实践 https://www.300168.com/yidong/show-2790.html 核心提示:为什么要重视程序的架构设计 对程序进 ...
- ISO/IEC 9899:2011 条款6.4.4——常量
6.4.4 常量 语法 1.constant: integer-constant floating-constant enumeration-constant character-constant 约 ...
- JVM参数详细说明
JVM参数详细说明 答: 下面红色部分是常用参数 -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收-XX:CMSInit ...
- 源码搭建LAMP环境
需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Apache http://httpd.apache.org/ httpd主程序包(http server) MySQ ...
- ubuntu 18.04安装mysql 8
wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb sudo dpkg -i mysql-apt-config_0. ...
- pycharm操作Django基础部分
原文地址:https://www.cnblogs.com/feixuelove1009/p/5823135.html
- Docker容器中用户权限管理
在Linux系统中有一部分知识非常重要,就是关于权限的管理控制:Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通 ...