C#反编译器?

时间:2010-12-18 20:49:01

标签: c# .net

这是真的吗? 有人可以反编译我在CIL中用MSIL编写的代码吗? 从.exe文件?

4 个答案:

答案 0 :(得分:28)

这大部分都是真的。一位名叫Lutz Roeder的聪明的程序员写了一个名为Reflector的优秀反编译器(现在由redgate拥有)。将IL转换回C#或VB.NET代码非常擅长。它不是完整的魔术,它不能

  • 将常量转换回常量标识符
  • 恢复局部变量的名称
  • 反编译除中间形式之外的匿名方法
  • 反编译迭代器,如上所述
  • 反编译lambda,如上所述
  • 反编译使用承诺的C#5异步和等待关键字的代码,如上所述
  • 恢复代码中的评论。

并且有一些错误使它诉诸goto语句或摔倒。否则非常可用作调试辅助工具,帮助您发现和诊断未编写的代码中的错误。没有任何记录在案的案例表明任何人使用它从通过反编译获得的盗版源代码开始成功的业务。它的效果太好了。

否则,“混淆器”开始了一个生动的细分市场,这些工具重写了程序集的内容,使其难以反编译。典型的策略是重写标识符,因此它们变得非常难以解释和/或修改程序集的结构,因此反编译器将崩溃但CLR不会崩溃。 Redgate,Reflector的现任所有者,也出售混淆器。 Visual Studio付费许可证中包含一个名为“Dotfuscator Community Edition”的许可证。不知道它有多好,它永远不会受到考验。

在代码中使用大量lambda和迭代器已经是一种优秀的方式来混淆代码。将其反向设计为原始代码非常困难。那个Lutz在他做的同时放弃了Reflector并不是巧合,那就是当C#变得难以可靠地反编译时。

答案 1 :(得分:8)

开源替代方案:ILSpy。我已经尝试过,我自己封装了大约99%的反射器功能。

答案 2 :(得分:3)

正如@Anthony Pegram和@Saif al Harthi所指出的那样,反射器就是这样一个例子。它不会产生与您编写的完全相同的代码(主要是因为您编写的代码在成为IL之前已经过优化),但代码类似。

有一些方法可以使用一类名为Code Obfuscators的产品来对抗它。我不太了解产品的比较,但是对“C#Obfuscator”进行简单的网络搜索会带来大量的免费和商业工具。

正如@Marc Gravell所指出的那样,在你的源上不会发生混淆。根据我的理解,混淆通常是构建过程的一部分,因此产生的IL是被混淆的。

答案 3 :(得分:0)

这里有一个全面的反编译列表:https://github.com/quozd/awesome-dotnet/blob/master/README.md#decompilation

  • dnSpy - 开源.NET程序集浏览器,编辑器,反编译器和调试器
  • ILSpy - ILSpy是开源.NET程序集浏览器和反编译器
  • JustDecompile Engine - JustDecompile
  • 的反编译引擎
  • dotPeek - 基于ReSharper捆绑式反编译器的免费独立工具。它可以可靠地将任何.NET程序集反编译为等效的C#或IL代码。它可以直接创建基于原始二进制文件的Visual Studio解决方案。 [专有] [免费]