1

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

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

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

4

2 回答 2

1

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

于 2012-04-23T23:54:41.953 回答
0

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

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

offsetFromMetadataHeader = RVAofMethod - MetadataRVA
positionInFile = offsetFromMetadataHeader - positionOfMetaDataHeader

这在我的实现中有效。

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

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

于 2012-04-26T18:02:12.947 回答