1

我想打开一个 PE 文件(我知道它是一个 .Net 程序集)并找到 .Net 字节码的位置(最好从入口点开始)。我知道 PE 标头数据(入口点 RVA)将我带到一个从 mscoree.dll 调用 CorExeMain 的存根

这不是我想要的。我想找到由 mscorlib 运行的字节码。我如何使用 C++而不使用 ildasm、dumpbin 等外部工具来做到这一点?我已经可以解析 PE 标头并知道图像库/RVA 的含义。我只是不知道在哪里可以找到有关 IL 字节码位置的足够信息。

4

3 回答 3

4

看看ECMA-335 - 文件格式的详细信息在那里,在分区 II 部分 22-25 中。我似乎记得不久前尝试编写解析器时发现了一些错误,但只要有一点毅力,这一切都是可行的。

于 2010-09-14T08:48:26.060 回答
3

我可能会从mono (cil_coff.h, pedump.c) 中获取代码,而不是从头开始编写代码。

于 2010-09-14T09:01:12.380 回答
0

在 Windows 上,它有一个 COM API,IMetaDataImport(由 IMetaDataImport2 扩展,支持泛型)。但是,它的使用示例相当缺乏。看似不那么维护但开源的 IL 调试器/编辑器Dile(仅在每周构建中支持 .NET 4 马马虎虎)使用它,因此您可以查看它的代码。Dile 的作者也写了一篇关于使用该 API 的博客文章,但它相当啰嗦。由于垃圾邮件规则,未提供链接。谷歌“从程序集中读取类型”。

.NET SDK 附带的 Microsoft 的 mdbg 也使用它。不幸的是,mdbg 源代码仅针对 .NET 2.0 版本发布。谷歌搜索 mdbgSample21.EXE。

于 2011-12-11T11:42:24.647 回答