【问题标题】:Partially disassembling .net executable部分反汇编 .net 可执行文件
【发布时间】:2009-10-15 20:26:48
【问题描述】:

我需要编写一个相对较小的程序来解析 .net 可执行文件并生成对外部方法的调用列表。例如,如果在文件中调用了System.Console.WriteLine,则该工具应打印出在某处调用了System.Console.WriteLine。我不能(有限的大脑和时间)也不需要(我只需要一个调用列表)实现真正的反汇编。我想要一个 grep 友好 perl 友好 相对简短的解决方案,它写入调用的函数的名称和调用发生的偏移量。

我已经尝试过的事情:

  1. 从 MSDN 下载规范。 现在我知道静态调用被翻译成字节码中的0x28。 :) 后面是方法描述符,但理解方法描述符的含义可能需要阅读整个规范。

  2. 在 Reflector 中打开简单的 exe。 Reflector 精确地复制了我原始应用程序的代码,但我看不到调用的字节码。

是否有可能在有限的时间和知识的情况下实现所需的有限功能?

如果是这样,我知道如何实施它?有没有“CIL 傻瓜组装”指南?

【问题讨论】:

  • 在反射器中,您可以对一个方法进行“分析”,并从其他加载的程序集中找出它在哪里使用(调用)。走向另一个我不确定的方向......
  • 谢谢,Agent_9191,我错过了。
  • Analyze 实际上并没有显示使用它的字节码。它显示了所有使用过的调用的依赖关系列表,但依赖关系列表没有说明调用相对于 exe 文件开头的位置,也没有说明负责实际调用的字节码片段。

标签: .net reflector disassembly cil


【解决方案1】:

Cecil 项目是一个完全可以满足您需求的库。

【讨论】:

    【解决方案2】:

    如果您想要对 grep/perl 友好的东西,请使用 ildasm(在其命令行模式下,即使用 /out 或 /text)将字节码反汇编为文本 IL。然后,您可以使用 grep、perl 或您选择的语言来查找调用说明。 (grep 可能不足以识别调用指令所在的方法,但 perl 应该能够。)

    【讨论】:

    • 谢谢,ildasm 生成的 CIL 有助于定位和识别所有有趣的调用。有什么方法可以轻松检测 try-catch 块?
    • Try 块以 .try { 开头并以 } 结尾。 Catch 块以 catch [mscorlib]System.Exception(或任何异常)开头,然后是 {,并以 } 结尾。 (查看这一点的最佳方法是用 C# 编写一个测试程序集并对其进行 ildasm。另请参阅 Jason 对处理程序/标签表单的评论。)因此,定位这些块应该不会太难。然而,使用像 perl 这样的面向行的处理器来识别给定的行是否是 try-catch 块的一部分可能会很痛苦:您可能想要研究 VirtualBlackFox 和 Jason 提到的 Cecil 和 CCI 项目。
    【解决方案3】:

    通用编译器基础架构也可能对您有所帮助:http://ccimetadata.codeplex.com/

    我会支持 itowlson 的建议,即只需将程序集反汇编成一个 .il 文件并使用 grep 解析它,如果这是您正在寻找的。由于 ILDasm 将为所有类型显示完整的命名空间,因此您应该能够很快找出它是您的类型还是引用的类型。

    【讨论】:

    • 忘记给你提命令行了。像下面这样的东西会给你一个文本文件,然后你可以 grep:ildasm /out:.il
    • 我相信随着 vs2008 附带的 ildasm,如果你不在命令行上使用 /raweh,你的 try/catch/finally 将在代码中(扩展)为 .try/catch /最后。如果您使用 /raweh,则异常处理块位于方法的末尾(就像它存储在字节码中一样)。您必须使用标签将它们破译成它们在代码中的位置。
    猜你喜欢
    • 2014-08-05
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2014-03-06
    相关资源
    最近更新 更多