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

Calculating file offset from RVA in .NET Assembly

我正在尝试使用可选 header 计算 CLI Header 文件偏移量,我手动检查了示例 .NET 程序集并注意到可选 header 给了我CLI Header 的 RVA 是 0x2008,CLI Header 的文件偏移量是 0x208。如何计算 RVA 的文件偏移量? 谢谢

PE 文件包含一堆部分,这些部分使用 table 部分(就在可选的 header 之后)映射到页面对齐的虚拟地址。

因此,要阅读 CLI Header,您可以:

  • 使用LoadLibrary or LoadLibraryEx之类的方法将其映射到内存中,然后将 RVA 添加到返回的模块基址,
  • 或者您可以阅读 table 部分并使用它将 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();
}

第 table 节在 ECMA-335 第二部分第 25.3 节中描述