在 .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 节中描述
我正在尝试使用可选 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 节中描述