博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PE文件RVA-VA-Offset
阅读量:6041 次
发布时间:2019-06-20

本文共 2678 字,大约阅读时间需要 8 分钟。

VA | Memory | Offset | Disk Files |

|             |                   |             |

00400000 +-------------+<---------00000000 +-------------+

| DOS Header | | DOS Header |
+-------------+ +-------------+
| DOS stub | | DOS stub |
+-------------+ +-------------+
| PE header | | PE header |
+-------------+ +-------------+
|Section Table| |Section Table|
+-------------+ /-------00000600 +-------------+
|000 Full 0000| | | .text |
|000 Zero 0000| | /----0000D400 +-------------+
00401000 +-------------+<-/ | | .data -A-| 0000D450
| .text | | /-00010000 +-------------+
+-------------+ | | | .rsrc |
|000 Full 0000| | | +-------------+
|000 Zero 0000| | |
0040E000 +-------------+<----/ |
0040E050 |-A .data | |
+-------------+ |
|000 Full 0000| |
|000 Zero 0000| |
00413000 +-------------+<-------/
| .rsrc |
+-------------+

Name Virt Size RVA Phys Size Phys Off Flags


01 .text 0000CCC0 00001000 0000CE00 00000600 60000020 []

02 .data 00004628 0000E000 00002C00 0000D400 C0000040 []
03 .rsrc 000003C8 00013000 00000400 00010000 40000040 []

对于变量A来说:

File_Offset 就是磁盘文件中A的位置。

File_Offset = VA - ImageBase - VRk = RVA - VRk

ImageBase 就是文件加载到内存的起始位置。

ImageBase = VA - RVA
多为:0x00400000,0x01000000

EntryPoint 就是.text的VA地址。

VA 就是内存映像中A的位置,即A的地址。

VA = ImageBase + FileOffset + VRk = ImageBase + RVA

RVA 就是内存映像中A的位置与文件映射基址的差。

RVA = VA - ImageBase = File_Offset + VRk

PS: VA 就好比是“某一时刻”,例如:九点到校上课。

RVA 就好比是“某一时间段”,例如:七点起床后,过两个小时到校上课。
VA 是绝对的,一旦确定便不可更改。九点到校迟一秒钟也不行。
RVA 是系相对的,虽然说过两个小时到校上课,但是如果我七点起床,便是九点上课。
而如果我八点起床,便是十点上课了。

VRk 就是文件映射到内存后,每一节之间填充的00的个数。

由于要进行对齐,所以文件加载到内存后每一节之间要填充大量00
因此文件中A的位置会变化。由于各个文件头与各个节大小不变,所以:
VRk = RVA - File_Offset = <填充的00的个数>

最终,我们计算:

由FileOffset到RVA/VA:

ImageBase    = 00400000 A FileOffset = 0000D450 RVA = FileOffset(A) + ( RVA(.data) - FileOffset(.data) )     = FileOffset(A) +  VRk     = 0000D450 + ( 0000E000 - 0000D400 )     = 0000D450 + C00     = 0000E050 VA  = RVA + ImageBase = 0000E050 + 00400000 = 0040E050

由RVA/VA到FileOffset:

RVA = 0000E050   /   VA = 0040E050   /   ImageBase = 00400000 FileOffset = RVA(A) - RVk            = RVA(A) - ( RVA(.data) - FileOffset(.data) )            = 0000E050 - ( 0000E000 - 0000D400 )            = 0000E050 - C00            = 0000D450

==========================================================================

(表一)中列出的文件偏移地址和RVA之间的对应关系可以让大家更直接地理解这种“细微的差异”。

由于内存中数据节相对于装载基址的偏移量和文件中数据节的偏移量有上述差异,所以进行文件偏移到虚拟内存地址之间的换算时,还要看所转换的地址位于第几个节内。

我们把这种由存储单位差异引起的节基址差称作节偏移,在上例中:

.text节偏移=0x1000-0x400=0xc00

.rdata节偏移=0x7000-0x6200=0xE00

.data节偏移=0x9000-0x7400=0x1C00

.rsrc节偏移=0x2D000-0x7800=0x25800

文件偏移地址与虚拟内存地址之间的换算关系可以用下面的公式来计算。

文件偏移地址=虚拟内存地址(VA)-装载基址(Image Base)-节偏移=RVA-节偏移

转载于:https://blog.51cto.com/haidragon/2104129

你可能感兴趣的文章
软件版本代号
查看>>
linux查看内核版本、系统版本、系统位数(32or64)
查看>>
无线路由器基础
查看>>
如何搭建一个网站
查看>>
关于IP地址
查看>>
OGEngine开源引擎环境搭建
查看>>
IDS 开源
查看>>
每天laravel-20160629|RedisTaggedCache
查看>>
Java关键字final、static使用总结
查看>>
Ubuntu 安装 MYSQL
查看>>
理解Dijkstra算法
查看>>
社会工程学+Web hacked***某游戏公司
查看>>
分布式存储预览
查看>>
WebLogic11g-常用运维操作
查看>>
关于flex的三属性2--flex-basis
查看>>
江南Style是怎么把youtobe的计数器弄坏的
查看>>
如何用C#开发的计算器小软件
查看>>
[unity3d]汽车的开关门动画播放
查看>>
网页前端开发的现状
查看>>
Test
查看>>