C#反编译器?

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

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

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

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

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

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

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

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

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

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

这里有一个全面的反编译列表: 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解决方案。 [专有] [免费]