【问题标题】:Can IMetaDataImport resolve an RVA to a pointer?IMetaDataImport 可以将 RVA 解析为指针吗?
【发布时间】:2012-04-23 23:11:48
【问题描述】:

我正在使用非托管 .NET API,并且已经到了想要获取方法的 CIL 字节码的地步。 IMetaDataImport 接口可以为我提供方法实现的 RVA,但据我所知,它不能提供实际的内存位置。

有没有一种无需自己解析 PE 标头即可获取信息的方法?我知道这并不难,但 IMetaDataImport 已经完成了,所以这将是重复工作。

如果我确实必须自己解析 PE 标头,我是否可以获取 IMetaDataImport 实例使用的 HMODULE,还是必须自己对文件进行内存映射并调用 OpenScopeFromMemory 来创建我的 IMetaDataImport 实例?

【问题讨论】:

    标签: .net clr portable-executable


    【解决方案1】:

    我上次使用此 API 时,没有将 RVA 映射到实际地址的内置功能。所以是的,您必须自己将文件映射到内存中并解析节表以找到您的 RVA 所在的节并从中读取基本偏移量。然后可以将该值添加到映射的图像指针,以获取代码在内存映射中的位置。

    【讨论】:

      【解决方案2】:

      不知道你提到的API,但是如果你有方法体的RVA,从文件或内存中读取它很容易。

      如果您知道文件或内存中的元数据头地址、它的 RVA(来自 CLR 头的字段)和方法的 RVA(来自 #~ 流中的 MethodDef 表),则可以计算文件中的位置。

      offsetFromMetadataHeader = RVAofMethod - MetadataRVA
      positionInFile = offsetFromMetadataHeader - positionOfMetaDataHeader
      

      这个在我的实现中有效。

      默认情况下,元数据和字节码位于同一部分 - .data。

      对于字节码读取的实现您可能希望在 github 上查看 Project Cecil(请记住,您必须首先处理方法头)。

      【讨论】:

      • 我已经手动实现了一些 PE 解析,但我可以完全转移到使用 IMetaDataImport。我最终自己解决了 RVA。不过,您确定方法 RVA 与元数据标头相关吗?我正在使用常规的 PE 图像部分标题来解决它们,并且效果很好。
      • 编辑得更精确。我假设您已经在内存中有文件并且已经在读取元数据。就像我说的,我没有使用过那个 API。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2021-09-25
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多