2010-10-17 61 views
0

有没有办法将msil代码的一部分保存为字节流,并将其逆向工程到一些更高级的代码(例如C#)?对msil代码的字节数组进行逆向工程

编辑:MSIL指令不是整个装配

感谢,

乔恩

+0

你的意思只是一堆不属于程序集的'msil'指令吗? – Oded 2010-10-17 19:46:57

+2

使用反射器拆解反射器,并看它是如何做到的。 – 2010-10-17 19:54:54

回答

0

反射就是这样做的...所以是的,这是可能的,假设你有正确的上下文(解析类型令牌等)。

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

+0

反射器在_assemblies_上工作。我不确定这是OP所要求的。 – Oded 2010-10-17 19:47:35

+0

问题是如果“有办法” - 我的回答是肯定的,如果你有额外的信息需要从MSIL流中的所有数据中做出有意义的事情(操作码是没有问题的,但是类型和方法标记等等是一个问题)。 – Lucero 2010-10-17 19:50:07

+0

Oded,是的。这不是一个可以接受的事情,反射器不知道如何处理它。 – Jon 2010-10-17 19:50:07

0

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

+0

来自该网站:“简单的英语,与塞西尔,你可以加载现有的管理组件”。所以,需要一个组件。 – Oded 2010-10-17 19:53:01

0

不知道它这会工作,但ILDASM听起来是正确的:

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

请注意文件是一个PE文件的要求,所以对于任何实际操作,这仍然基本上是一个托管程序集。


由于这些指令的低水平,他们不一定会直接对应于高层次的代码 - 甚至反射器不会给你确切的原代码。

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

+1

与管理组件不同,PE不是一回事吗? – 2010-10-17 19:56:13

+0

这将怎么只给我的MSIL命令不是一个高级语法,是正确的? – Jon 2010-10-17 19:56:19

+0

@jon - 正确。 – Oded 2010-10-17 19:56:44

1

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