【问题标题】:How to understand the PE header in this graph?如何理解此图中的 PE 标头?
【发布时间】:2010-09-19 22:04:50
【问题描述】:

IMO,这应该成立:

rva = raw - imagebase

图中不是这样,为什么?

【问题讨论】:

    标签: portable-executable


    【解决方案1】:

    入口点RVA、入口点原始地址和图像基地址没有这种关系。

    图像基址是“图像在内存中加载时第一个字节的首选地址”。换句话说,假设没有冲突,它是加载图像时的虚拟地址。如果加载图像时发生地址冲突(例如,另一个图像已经加载到重叠范围内),则会为该图像选择一个新的基地址。

    RVA 是相对虚拟地址。它是“相对的”,因为它在实际加载图像时发生了变化。它是基地址未知时的地址(例如,未加载图像时)。加载映像后,RVA 将成为虚拟地址 (VA),即虚拟内存中的实际地址。

    原始与 RVA 的区别在于对齐。有节对齐(节加载到内存时的对齐)以及文件对齐(节中原始数据的对齐)。这里的节对齐是0x1000,而文件对齐是0x200。

    入口点RVA用于确定加载图像时入口点的VA(即入口点将位于虚拟地址EntryPoint (rva) + ImageBase)。入口点原始地址是入口点所在文件的偏移量。

    This document 对对齐有很好的解释。

    【讨论】:

    • 我不太明白你说的offset into the file where the entry point is located是什么意思,你能详细说明一下吗?
    • 我可能不正确,但我的理解是入口点在加载时在内存中有一个地址(RVA + 图像库),在未加载图像时在磁盘上有一个“地址”。磁盘上的“地址”实际上只是文件的偏移量。因此,如果您想在不必先加载图像的情况下开始反汇编入口点,您将寻找文件中的原始入口点地址。
    • 图片加载时EntryPoint (rva)应该是根据EntryPoint (raw)计算的,对吗?
    • 运行时的入口点将在Entry Point (rva) + ImageBase(如果由于另一个DLL已经在该地址加载而导致加载冲突,则图像基址可以从DLL中指定的默认值更改) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2012-02-05
    • 2021-07-12
    • 2016-12-25
    • 2010-09-20
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多