IMetaDataImport可以将RVA解析为指针吗?

时间:2012-04-23 23:11:48

标签: .net clr portable-executable

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

有没有办法获取信息而无需自己解析PE头?我知道这并不难,但是IMetaDataImport已经完成了它,因此会重复工作。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

offsetFromMetadataHeader = RVAofMethod - MetadataRVA
positionInFile = offsetFromMetadataHeader - positionOfMetaDataHeader

这个适用于我的实施。

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

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