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

2024-04-25

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


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

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

  • 使用类似的东西加载库 https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx or 加载库Ex https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx将其映射到内存中,然后将 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();
}

节表的描述见ECMA-335 http://www.ecma-international.org/publications/standards/Ecma-335.htm第二部分第 25.3 节

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 .NET 程序集中 RVA 的文件偏移量 的相关文章

  • 使您的 .NET 语言在调试器中正确运行

    首先 我对这个问题的长度表示歉意 我是作者钢铁计划 http ironscheme codeplex com 最近 我一直在努力发出合适的调试信息 以便我可以使用 本机 NET 调试器 虽然这取得了部分成功 但我遇到了一些初期问题 第一个问
  • asp.net 和 .net Framework 版本是否相同?或者asp.net或clr版本是否相同?

    这是我之前的问题你好 我是网络框架的新手 你能告诉我 net框架版本和asp net版本不同吗 clr版本和asp net版本有一定关系 我如何从注册表中获取 asp net 版本 谁能给我一份版本列表 但我对这个链接感到困惑 看看瓦伦的回
  • 所有 C# 转换都会导致装箱/拆箱吗

    我很想知道 C 中的所有强制转换是否都会导致装箱 如果不是 那么所有强制转换都是成 本高昂的操作吗 示例取自装箱和拆箱 C 编程指南 http msdn microsoft com en us library yz2be5wk aspx i
  • CLR 分析器和 0 堆统计信息

    为什么使用 CLR 探查器的 ASP NET MVC Web 应用程序的堆统计分配结果为 0 我得到了零 但我认为做这两件事解决了零的问题 确保您在 配置文件 部分中检查了 分配 并确保在尝试查看分析信息之前结束应用程序 通过 CLR Pr
  • CLR 可以支持“函数指针”值类型吗?

    前几天我问过为什么委托是引用类型 https stackoverflow com questions 7905962 why are delegates reference types 基于我的错误观念 即委托所需的只是两个引用 一个指向对
  • 无法在 SQL 中创建程序集“System.ServiceModel.Internals”

    我正在尝试在 SQL 中创建程序集 但无法加载以下 DLL System ServiceModel Internals create assembly system servicemodel internals from C Windows
  • CorFlags.exe /32BIT+ 如何工作?

    我想我的问题是关于CLR http en wikipedia org wiki Common Language Runtime装载机 我想了解背后的机制CorFlags exe http msdn microsoft com en us l
  • 在 Windows 事件查看器中诊断 CLR 错误

    我们有一个 NET 桌面应用程序在生产中崩溃了 我们如何诊断错误 我想知道发生的异常类型 错误消息和堆栈跟踪 因为我们的代码没有处理异常 所以我们收到了 此应用程序遇到问题 需要关闭 Windows 消息框 唯一的选择就是关闭 没有调试按钮
  • 在c#中将bool表达式转换为char

    当我遇到如下问题时 我通过了 NET 测验 Char ch Convert ToChar a e c a 在控制台中我们可以看到输出ch变量是g 有人可以描述发生了什么吗 谢谢 是二元或运算符 a binary representation
  • 无法获取价值,因为它已被优化掉

    我在调试时遇到问题 突然间 我在调试时看不到大多数变量的值 我设法在立即窗口中收到两条不同的消息 无法获取本地或参数 参数 的值 因为它在此指令指针处不可用 可能是因为它已被优化掉 and 表达式求值器中出现内部错误 我已经尝试并检查了以下
  • “内存压力”是什么意思?

    通读一遍苔丝 费兰德斯的博客 https blogs msdn microsoft com tess 2008 04 17 how does the gc work and what are the sizes of the differe
  • 在运行时获取当前 .NET CLR 版本?

    如何在正在运行的 NET 程序中获取当前的 CLR 运行时版本 查看System Environment Version财产 https learn microsoft com en us dotnet api system environ
  • catch 和finally 中抛出异常。 CLR 行为与 try-catch 块[重复]

    这个问题在这里已经有答案了 我编写了简单的 C 控制台应用程序 class Mystery static void Main string args MakeMess private static void MakeMess try Sys
  • 为什么 ToUpperInvariant() 比 ToLowerInvariant() 更快?

    我在 CLR via C 中读到 Jeffrey Richter 写的String ToUpperInvariant 比String ToLowerInvariant 他说这是因为 FCL 使用 ToUpperInvariant 来规范化字
  • #include 导致错误

    VS 2010 C CLR 库项目 添加 comutil h 库时出错 gt Error 20 error LNK2001 unresolved gt external symbol extern C long gt stdcall Var
  • CLR 如何加载 DLL?

    我的假设始终是 CLR 在应用程序域启动时加载了它所需的所有 DLL 然而 我写了一个例子 让我对这个假设提出质疑 我启动我的应用程序并检查加载了多少模块 Process ObjModulesList ProcessModuleCollec
  • 嵌入.Net运行时

    我是否可以嵌入 net 运行时 以便主机操作系统不需要 net 我正在考虑用 Mono 来做到这一点 如下所示 http mono project com Embedding Mono http mono project com Embed
  • 您如何使用(描述的)技术来处理 .Net 中的 C 结构和指针?

    你如何使用这里描述的技术 https stackoverflow com questions 3235916 a way how to compile c library into net dll 3236027 3236027使用 Net
  • 带有托管 C++ dll 的加载程序锁定(regsvr32 R6033 错误)

    我有一个 C dll 它实现了多个 COM 接口 我正在尝试将其迁移到托管 C 我设置了 clr 编译器标志并将运行时库属性从 MT 更改为 MD 以避免这两个标志之间的冲突 但这就是我所做的全部更改 当它尝试在构建过程中注册 dll 时
  • 将泛型类转换为接口

    我在将泛型类转换为它正在实现的接口时遇到问题 我的代码是这样的 interface foo void foobar class bar foo public void foobar throw new NotImplementedExcep

随机推荐