在.NET程序集中计算RVA中的文件偏移量

时间:2016-02-04 18:39:17

标签: clr

我尝试使用可选标头计算CLI标头文件偏移量,我手动检查了一个示例.NET程序集,并注意到可选标头为我提供了CLI标头的RVA 0x2008 CLI标头的文件偏移量为0x208。如何计算RVA的文件偏移量? 感谢。

1 个答案:

答案 0 :(得分:2)

PE文件包含一系列部分,这些部分使用部分表(在可选标头之后)映射到页面对齐的虚拟地址。

因此,要阅读CLI标题,您可以:

  • 使用LoadLibraryLoadLibraryEx之类的内容将其映射到内存中,然后将RVA添加到返回的模块基地址
  • 或者您可以阅读部分表并使用它将RVA映射到文件位置。
/* pseudo code */
int GetFilePosition(int rva)
{
    foreach (var section in Sections)
    {
        var pos = rva - section.VirtualAddress;

        if (pos >= 0 && pos < section.VirtualSize)
        {
            return pos + section.PointerToRawData;
        }
    }

    Explode();
}

Section表在ECMA-335 Partition II Section 25.3

中描述