zoukankan      html  css  js  c++  java
  • 第三讲扩展,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 (虚拟地址位置)

  • 相关阅读:
    DOM
    js中字符串常规操作
    placeholer改变默认灰色
    css重置reset.css
    倒计时跳转
    手机中间四位用*代替
    animation
    过渡
    flex布局
    css3几个新属性
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/11306166.html
Copyright © 2011-2022 走看看