逆向工程msil代码的字节数组

时间:2010-10-17 19:44:57

标签: .net reverse-engineering cil

有没有办法将msil代码保存为字节流并将其反向工程为某些更高级别的代码(例如C#)?

编辑:不是整个程序集的MSIL指令

谢谢,

乔恩

5 个答案:

答案 0 :(得分:1)

简而言之,您不能将“一段CIL代码”转换为高级语言。除了高级语言,你甚至无法正确反编译它。因为,CIL并不仅仅意味着一堆指令,一些指令将metatokens作为操作数。 Metatokens只是某些对象(类型,方法,字符串等)的整数引用。这些信息存储在程序集中。即使我们忽略了这些信息,也存在另一个问题:异常处理。没有“尝试”和“捕获”指令(但有最终等)。要确定try-catch / finally块,您需要再次进行组装。因为,这些信息存储为偏移长度对(块存储边界)。

答案 1 :(得分:0)

Reflector就是这样......所以是的,假设您确实拥有正确的上下文(解析类型令牌等),这是可能的。

然而,就像使用Reflector一样,反向工程代码可能与原始代码完全不同,但它将具有相同的语义(如果代码生成器中没有错误)。

答案 2 :(得分:0)

是的,使用.NET Reflector。

http://www.red-gate.com/products/reflector/

答案 3 :(得分:0)

Mono.Cecil提供一些分析功能:
http://www.mono-project.com/Cecil
不确定它是否可以分析纯IL代码。

答案 4 :(得分:0)

不确定这会有效,但ILDASM听起来是对的:

  

MSIL反汇编程序是MSIL汇编程序(Ilasm.exe)的配套工具。 Ildasm.exe采用包含Microsoft中间语言(MSIL)代码的可移植可执行(PE)文件,并创建适合作为Ilasm.exe输入的文本文件。

请注意文件要求是PE文件,因此对于任何实际情况,这仍然是一个托管程序集。


由于这些指令属于低级别,因此它们不一定直接对应高级代码 - 即使反射器也不会为您提供准确的原始代码。

您可能需要编写自己的工具才能实现此目的,因为程序集将包含一些可能需要的信息(例如,引用的程序集)。