C# 反编译程序?

C# 反编译程序?,c#,.net,C#,.net,这是真的吗? 有人能从MSIL反编译我用C#编写的代码吗? 从.exe文件中?正如@Anthony Pegram和@Saif al-Harthi所指出的,reflector就是这样一个例子。它不会产生与您编写的代码完全相同的代码(主要是因为您编写的代码在成为IL之前经过了优化),但会产生类似的代码 使用一类称为代码混淆器的产品,有很多方法可以解决这个问题。我不知道如何比较这些产品,但是一个简单的网络搜索“C#Obfuscator”会带来大量的免费和商业工具 正如@Marc Gravell所指出的

这是真的吗? 有人能从MSIL反编译我用C#编写的代码吗?
从.exe文件中?

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

使用一类称为代码混淆器的产品,有很多方法可以解决这个问题。我不知道如何比较这些产品,但是一个简单的网络搜索“C#Obfuscator”会带来大量的免费和商业工具


正如@Marc Gravell所指出的,混淆不会发生在源代码上。根据我的理解,模糊处理通常是构建过程的一部分,因此产生的IL就是模糊处理的。

基本上是正确的。一个非常聪明的程序员Lutz Roeder编写了一个非常优秀的反编译器,名为(现在为)。它非常擅长将IL翻译回C#或VB.NET代码。它不是完全的魔法,它不能

  • 将常量转换回其常量标识符
  • 恢复局部变量的名称
  • 反编译匿名方法,中间形式除外
  • 反编译迭代器,如上所述
  • 反编译lambdas,如上所述
  • 反编译使用承诺的C#5 async和Wait关键字的代码,如上所述
  • 恢复代码中的注释
并且有一些bug使得它求助于goto语句或摔倒。另外,它作为调试辅助工具非常有用,可以帮助您发现和诊断未编写代码中的错误。没有记录在案的案例表明,有人使用它从反编译获得的盗版源代码中成功创业。这样做效果太好了

另外,它还为“模糊处理器”开辟了一个活跃的市场,这些工具重写程序集的内容,使其难以反编译。典型的策略是重写标识符,使其很难解释和/或修补程序集的结构,使反编译器崩溃,但CLR不会崩溃。雷德盖特,反射器的当前所有者,也出售模糊器。VisualStudio付费许可证中包含一个名为“Dotfuscator社区版”。不知道它有多好,它永远不会被测试


在代码中使用大量lambda和迭代器已经是混淆代码的一种很好的方法。将其反向工程到原始代码是非常困难的。Lutz在他放弃Reflector的同时也放弃了Reflector,这不是巧合,因为C#变得太难进行可靠的反编译。

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

这里有一个全面的反编译器列表:

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

是的。看看红门的.NET反射器-该死!这不违法吗?我可以保护我的软件吗?先发制人地回答你的下一个问题:100%免费吗?是的,这很有帮助,但我在一个开源项目中工作,所以让他们看看源代码:PMinor澄清:这不是代码混淆,或者确实是C#混淆-C#/代码保持不变-混淆的是二进制/IL。您忘记了限制列表中的局部变量名。。。Reflector无法恢复这些名称,但它能很好地创建有意义的名称(在大多数情况下无论如何),从技术上讲,我相信Reflector将从.pdb中提取本地名称(如果可用)。不过,它通常会传播回作为参数传递给其他方法的局部变量的相应参数名,从而产生好的名称。