给定一个程序集对象,我可以将它分解为文本吗?
Given an assembly object can I disassemble it to text?
我现在的情况是,我只有对内存中托管程序集引用对象的引用,即我没有 dll 或实际代码。整个问题是关于我有 System.Reflection.Assembly.
的内存表示这一事实
我希望能够将其反汇编为文本,或者至少还可以获取元数据,比如函数体。
这可能吗?
我已经尝试了对象的所有 public 表面积,但没有任何结果。
我不知道有什么东西可以将整个内存中的程序集分解为文本。而且我不知道如何将内存中的程序集保存到磁盘以使用基于文件的反汇编程序(如 ildasm)。
但如果您只想找出方法使用了哪些常量字符串,则不需要所有这些。
要访问方法的 IL(您拥有 MethodInfo
),您可以使用 method.GetMethodBody().GetILAsByteArray()
。正如方法名称所暗示的那样,这会为您提供一个 byte[]
,这并不容易使用。但是您可以使用 Jb Evain 的 Mono.Reflection 来为您完成这些艰苦的工作(尽管名称如此,它与 Mono 并没有真正的关系,也可以在普通的 .Net 中使用)。
剩下的唯一一步就是要意识到使用 ldstr
指令访问常量字符串,这就是我们需要查找的内容。
知道了所有这些,找到方法使用的常量字符串就很简单了:
method.GetInstructions().Where(i => i.OpCode == OpCodes.Ldstr).Select(i => (string)i.Operand)
我现在的情况是,我只有对内存中托管程序集引用对象的引用,即我没有 dll 或实际代码。整个问题是关于我有 System.Reflection.Assembly.
的内存表示这一事实我希望能够将其反汇编为文本,或者至少还可以获取元数据,比如函数体。
这可能吗?
我已经尝试了对象的所有 public 表面积,但没有任何结果。
我不知道有什么东西可以将整个内存中的程序集分解为文本。而且我不知道如何将内存中的程序集保存到磁盘以使用基于文件的反汇编程序(如 ildasm)。
但如果您只想找出方法使用了哪些常量字符串,则不需要所有这些。
要访问方法的 IL(您拥有 MethodInfo
),您可以使用 method.GetMethodBody().GetILAsByteArray()
。正如方法名称所暗示的那样,这会为您提供一个 byte[]
,这并不容易使用。但是您可以使用 Jb Evain 的 Mono.Reflection 来为您完成这些艰苦的工作(尽管名称如此,它与 Mono 并没有真正的关系,也可以在普通的 .Net 中使用)。
剩下的唯一一步就是要意识到使用 ldstr
指令访问常量字符串,这就是我们需要查找的内容。
知道了所有这些,找到方法使用的常量字符串就很简单了:
method.GetInstructions().Where(i => i.OpCode == OpCodes.Ldstr).Select(i => (string)i.Operand)