【问题标题】: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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          • 2011-03-23
          • 2012-03-04
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多