3

逆向调试入门-PE中的VA与RVA换算04/07

 1 year ago
source link: https://blog.51cto.com/apple0/5429217
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

逆向调试入门-PE中的VA与RVA换算04/07

原创

最爱大苹果 2022-06-30 09:16:46 博主文章分类:逆向学习 ©著作权

文章标签 逆向调试入门 PE结构文件 文章分类 其它 网络/安全 yyds干货盘点 阅读数171

区块特点:

1、内存页的属性

2、节的偏移地址

3、节的尺寸

4、不进行映射的节

节事实上就是相同属性数据的组合。

逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门

文件与内存映射的关系

逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_02

RVA是相对虚拟地址(RelativeVirtualAddress)的缩写。RVA是当PE文件被装载到内存中后,某个数据位置相对于文件头的偏移量。

参考文章:

https://javajgs.com/archives/44114

在实际情况下,我们常常会遇到将代码段中访问的RVA转换成PA,在这种情况下需要读取⽂件头来做相应的转换。

逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_03

转换的⼀般步骤为:

1、将exe⽂件映射⼊内存中,读取Dos MZ Header,在这个结构中,我们能够通过e_lfanew来获取NT⽂件头相对于Dos⽂件头的偏移。

逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_04
逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_05

DOS头部相对于PE头部的偏移

2、获取到了NT⽂件头的地址,NT⽂件头中包含了两个⽂件头,⼀个是FILE⽂件头,⼀个是Optional可选⽂件头,在FILE⽂件头中我们可以读取到段的数量,在转换RVA地址的时候,我们只需要得到这个数量。

逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_06

段的数量为8

3、将NT⽂件头之后紧跟着的就是SECTION TABLE,这是段描述头,在这个段描述头中,我们⼏乎可以获取到全部的段的资料。

VritualAddress: 这个是⼀个RVA地址,代表的意义是告诉PE加载器该段存在于RVA地址为VritualAddress处

逆向调试入门-PE中的VA与RVA换算04/07_逆向调试入门_07

VA为1000H

PointerToRawData: 这是⼀个物理偏移地址,告诉PE加载器将物理⽂件偏移PointerToRawData处的数据映射⼊VritualAddress处

VirtualSize: 该段的⼤⼩

SizeOfRawData: 该段的物理⼤⼩。由于存在对齐问题,所以该⼤⼩为不⼩于VirtualSize⼤⼩的对齐⼤⼩的整数倍。

4.通过遍历SECTION TABLE,判断要转换的RVA地址是否处于所有段的RVA地址范围内。该段的RVA范围为: VritualAddress + SizeOfRawData,当然更精确点是VirtualAddress + VirtualSize。

5.假如存在于地址范围内,那么我们可以通过要转换的RVA地址减去该段的VirtualAddress算出相对于该段的偏移量

6.将偏移量加上PointerToRawData,即可算出物理地址。

算法比较复杂。

我们使用OD工具分析。

逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_08

我们看下地址00400200

逆向调试入门-PE中的VA与RVA换算04/07_PE结构文件_09

果然这地址为code的代码块。

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK