.NET混淆工具/策略

165

我的产品有几个组件:ASP.NET、Windows Forms App和Windows Service。约95%的代码都是用VB.NET编写的。

出于知识产权方面的原因,我需要混淆代码,直到现在我一直在使用一个5年以上的dotfuscator版本。我认为现在是时候转向新一代工具了。我正在寻找一个需求列表,在搜索新的混淆器时应该考虑哪些要素。

到目前为止,我知道我应该寻找以下内容:

  • 序列化/反序列化。在我的当前解决方案中,我只需告诉工具混淆任何类数据成员,因为无法加载以前序列化的数据所带来的痛苦太大了。
  • 与构建过程的集成
  • 处理ASP.NET。过去,由于更改.dll名称(您通常有每个页面一个),我发现这很棘手,不是所有工具都能很好地处理。

请参见:http://msdn.microsoft.com/zh-cn/vcsharp/aa336818.aspx#obfuscators - Michał Ziober
请参见Agile.net .NET混淆器,以获得混淆代码的另一种替代方案。特别要检查其代码虚拟化功能。 - sutton bernard
在 StackOverflow 上可以找到一份好的混淆器列表,从 ArmDot 到 Xenocode:https://dev59.com/questions/ynVD5IYBdhLWcg3wL4cA#60054 - Artem Razin
对于我们庞大而复杂的.NET应用程序,大多数.NET混淆器都失败了并引入了错误。.NET Reactor是唯一满足我们所有需求的混淆器。我花费了大量时间尝试了几十个混淆器,并在这里总结了我的发现https://blog.ndepend.com/in-the-jungle-of-net-obfuscator-tools/。 - Patrick from NDepend team
30个回答

5
在过去的两天里,我一直在尝试使用Dotfuscator Community Edition advanced(一个免费下载的工具,需要先注册基础版CE,它与Visual Studio捆绑在一起)进行实验。
我认为更多人不将混淆作为默认选项的原因是,相对于风险而言,它太麻烦了。在较小的测试项目中,我可以通过大量努力运行混淆代码。通过ClickOnce部署一个简单的项目很麻烦,但是在用mage手动签名清单后仍然可行。唯一的问题是,在错误发生时,堆栈跟踪会被混淆,而CE没有打包反混淆器或澄清器。
我试图混淆一个真实的基于Excel的VSTO项目,其中包括Virtual Earth集成、大量的Web服务调用和IOC容器以及大量的反射。这是不可能的。
如果混淆确实是一个关键的要求,那么你应该从一开始就考虑到这一点来设计你的应用程序,并随着进展测试混淆版本。否则,如果它是一个相当复杂的项目,你最终会遇到严重的困难。

4
我最近尝试将一个免费的混淆器的输出管道传递到另一个免费的混淆器中 - 即Dotfuscator CE和CodePlex上的新Babel混淆器。更多细节请参见我的博客
至于序列化,我已经将该代码移动到不同的DLL中并包含在项目中。我认为在XML中没有任何秘密,因此它不需要混淆。如果这些类中有任何严肃的代码,使用主程序集中的部分类应该可以解决问题。

-1,因为“yo dawg,我听说你喜欢混淆器,所以我在混淆器的输出上运行了一个混淆器……想知道更多吗?给我页面点击量。”但我认为第二段是一个非常好的建议。 - ANeves

3
避免使用Reactor。它完全没有用处(是的,我为许可证付费了)。Xenocode是我遇到的最好的一个,并且也购买了许可证。支持非常好,但我并不需要太多,因为它只是能够工作。我测试了每一个我能找到的混淆器,我的结论是Xenocode远远是最强大的,做得最好(还有可能将您的.NET exe后处理为本地exe,这是我在其他任何地方都没有看到的)。
Reactor和Xenocode之间有两个主要区别。 第一个是Xenocode真正起作用。 第二个是您的程序集执行速度没有任何区别。使用Reactor会慢约600万倍。我也有印象Reactor是一个单人操作。

1
.NET Reactor有很多选项。其中一些涉及运行时保护,会稍微减慢应用程序的速度,但这是您获得额外安全性的代价。然而,如果您只使用.NET Reactor混淆而没有选择其他选项,我严重怀疑是否会有任何减速。 - avitenberg

3
你可以使用“Dotfuscator社区版” - 它是Visual Studio 2008专业版的默认选项。你可以在以下网址了解更多信息:

http://msdn.microsoft.com/en-us/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

该产品的“专业版”需要付费,但更好。

你真的需要对你的代码进行混淆吗?通常情况下,除非用于安全目的,否则应用程序被反编译很少出现问题。如果你担心别人“窃取”你的代码,不要担心;查看你的代码的绝大多数人都是为了学习目的。无论如何,在.NET中没有完全有效的混淆策略 - 有足够技能的人总是能够反编译/修改你的应用程序。


我为这个点赞。我尝试了几乎所有免费的.NET混淆器,而Dotfuscator是唯一一个实际混淆了我的ASP.NET应用程序中MSIL相当比例的混淆器。 - saille
@Saille,你用过免费的Dotfuscator - Community Edition吗?我刚刚进行了一次销售聊天,他们说专业版的价格是2000欧元。:( - Houman
Dotfuscator毫无价值。 - user626528

3

3
Eazfuscator表示为什么不使用MSIL加密:请参阅http://www.gapotchenko.com/eazfuscator.net/kb/100028 - QMaster

3
你应该选择在你的平台上最便宜和最知名的工具,并开始使用。高级语言的混淆是一个难题,因为虚拟机操作码流不会遭受本机操作码流的两个最大问题:函数/方法识别和寄存器别名。关于字节码反编译,你需要知道的是,安全测试人员已经将其作为标准实践来审查直接的X86代码并找到其中的漏洞。在原始的X86中,你甚至不能找到有效的函数,更不用说在函数调用期间跟踪本地变量了。在几乎没有情况下,本机代码反转器可以访问函数和变量名称——除非他们正在审查微软代码,因为微软很好心地向公众提供了这些信息。
“Dotfuscation”主要通过混淆函数和变量名称来工作。这样做可能比发布带有调试级别信息的代码更好,因为反编译器会直接暴露你的源代码。但是,任何超出此范围的操作都可能会导致收益递减。

3

我使用Smartassembly没有遇到任何问题。


2

2
自从.Net 1以来,我一直在同一个应用程序中混淆代码,从维护的角度来看,这是一个主要的头痛问题。正如你所提到的,序列化问题可以避免,但很容易犯错并混淆不想混淆的内容。很容易破坏构建,或更改混淆模式而无法打开旧文件。此外,很难找出出了什么问题以及问题出在哪里。
我们的选择是Xenocode,如果今天我再次做出选择,我会更愿意不混淆代码或使用Dotfuscator。

1

我最近的项目中需要使用混淆/资源保护,发现Crypto Obfuscator是一个不错且易于使用的工具。在这个工具中,序列化问题只是设置的问题。


@logicnp,这是您在此帖中对该产品的第二次推荐。请披露您是否与该产品的开发者有关系。 - H2ONaCl
抱歉,但是de4dot可以去混淆。我建议使用ConfuserEx - newbieguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接