【问题标题】:How to programatically find the bytecode (CIL) in a .Net executable/dll?如何以编程方式在 .Net 可执行文件/dll 中查找字节码(CIL)?
【发布时间】:2010-09-14 08:44:16
【问题描述】:
我想打开一个 PE 文件(我知道它是一个 .Net 程序集)并找到 .Net 字节码的位置(最好从入口点开始)。我知道 PE 标头数据(入口点 RVA)将我 带到一个从 mscoree.dll 调用 CorExeMain 的存根。
这不是我想要的。我想找到由 mscorlib 运行的字节码。我如何使用 C++ 和没有像 ildasm、dumpbin 等外部工具来做到这一点?我已经可以解析 PE 标头并知道图像库/RVA 的含义。我只是不知道在哪里可以找到有关 IL 字节码位置的足够信息。
【问题讨论】:
标签:
.net
assemblies
bytecode
portable-executable
【解决方案1】:
查看ECMA-335 - 文件格式的详细信息在其中,在分区 II 部分 22-25 中。好像记得前段时间写解析器的时候发现了一些bug,但只要有一点毅力,一切都是可行的。
【解决方案2】:
我可能会从mono (cil_coff.h, pedump.c) 中获取代码,而不是从头开始编写。
【解决方案3】:
在 Windows 上,它有一个 COM API,IMetaDataImport(由 IMetaDataImport2 扩展,支持泛型)。但是,它的使用示例相当缺乏。看似不那么维护但开源的 IL 调试器/编辑器 dile(仅在每周构建中支持 .NET 4 马马虎虎)使用它,因此您可以查看它的代码。 Dile 的作者也写了一篇关于使用该 API 的博客文章,但它相当啰嗦。由于垃圾邮件规则,未提供链接。谷歌“从程序集中读取类型”。
.NET SDK 附带的微软 mdbg 也使用它。不幸的是,mdbg 源代码仅针对 .NET 2.0 版本发布。谷歌搜索 mdbgSample21.EXE。