.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个回答

50

我们尝试了许多混淆器。但没有一个能够处理使用远程调用的大型客户端/服务器应用程序。问题在于客户端和服务器共享一些dll文件,我们没有找到任何可以处理的混淆器。

我们尝试了DotFuscator Pro、SmartAssembly、XenoCode、Salamander以及几个名字我已经记不起来的小型应用程序。

坦白说,我认为混淆是一种很大的hack。

即使它解决的问题也不完全是一个真正的问题。你真正需要保护的只是连接字符串、激活码、安全敏感的东西之类的东西。另一个公司会从头到尾地反编译你的整个代码库,并创建一个竞争产品,这种想法只存在于偏执的经理的噩梦中,而不是现实中。


14
好的,以下是翻译的结果:干得好,犹大!保持领先的唯一方法是开发新的、更好的代码,而不是坚持你已经编写的代码。最终你会把时间、精力甚至金钱投入到无关紧要的东西中。混淆并不值得。 - David Rutten
189
所以我不喜欢这个声誉系统,你有19个投票但没有提供答案。用户不是在询问你对混淆的看法,他想了解关于混淆技术的更多信息。 - backslash17
32
我提供了使用几种现有混淆器的经验信息。并根据那些经验得出了我的意见。 - Judah Gabriel Himango
6
“老实说,我相信混淆是一种很不好的技巧。”你的表述无可挑剔。 - Andrei Rînea
16
保护代码非常必要,尤其是将昂贵的专业应用程序销售给只有少数用户内部使用的公司。可能会出现的诱惑是反向编码以允许内部黑客攻击和修改以满足他们自己的目的,避免维护合同甚至黑客试用版以获取所需的好处。 - Brady Moritz
显示剩余8条评论

47

我目前正深入研究,尝试找到一个好的解决方案。以下是我目前的印象。

Xenocode - 我有一份旧版的Xenocode2005许可证,用于混淆我的 .net 2.0组件。在XP上工作良好,是个不错的解决方案。我的当前项目是 .net 3.5 并且我在Vista系统上,支持告诉我可以试试,但是2005版本甚至在Vista上都无法运行(崩溃),现在我不得不花费高达$1900购买'PostBuild2008'。这可能是一个很好的工具,但我不想去尝试。太贵了。

Reactor.Net - 这个价格点更加吸引人,并且在我的独立执行文件上也能正常工作。它的许可模块也很好,可以省去我很多麻烦。不幸的是,它缺少一个关键功能就是从混淆中排除某些部分。这使得我无法实现我需要的结果(将多个程序集合并在一起,混淆其中一些,不混淆其他部分)。

SmartAssembly - 我下载了评估版并且它完美地运行。我能够实现我想要的一切,界面也非常好。价格仍然有点高。

Dotfuscator Pro - 在网站上找不到价格。目前正在讨论如何获取报价。听起来有点不祥。

Confuser - 这是一个开源项目,工作得相当不错(就像名字所示,可以使人困惑)。

注意:根据他们在GitHub存储库上问题#498中的报道,ConfuserEx据称“已破解”。


8
你能否发布Dotfuscator的报价是多少? - Anthony Johnston
6
我在2011年初购买了一项许可证。 报价为2475美元,包括最少一个构建机和一个开发人员许可证。 包括12个月的升级和支持。 - Yoshi
2
在发布这篇文章时,我没有使用.NET Reactor,但现在你可以使用System.Reflection.Obfuscation属性从混淆中排除代码的部分。还有一些设置可以让你排除所有方法或所有可序列化类型等操作。 - benteight
6
DotFuscator 给我报价 4999 美元,因为有 10% 的折扣后降到了 4500 美元。这是一个开发人员许可证的价格!在讨论中这个价格被降低到了 2500 美元,但依然太贵了。 - Oliver
3
.NET Reactor现在有一个排除规则编辑器,可以排除某些类、方法或属性的混淆。此外,您可以使用复选框“仅合并”来排除特定的dll文件的混淆。 - avitenberg
显示剩余2条评论

44

在.Net 1.1时期,混淆是必需的:反编译代码很容易,你可以从程序集转到IL,再转到C#代码,并很轻松地重新编译它。

而现在用.Net 3.5,我不再确定。尝试反编译一个3.5程序集,你得到的和编译后的差距很大。

加入了来自3.5的优化(比1.1好多了),以及使用反射处理匿名类型、委托等的方式(这些都很难重新编译)。加入Lambda表达式,像Linq语法和var这样的编译器“魔法”,还有类似yield的C#2功能(结果是新的类具有难以阅读的名称)。你的反编译代码最终会远离可编译状态。

一个专业团队如果有足够的时间仍然可以将其逆向工程回去,但同样适用于任何混淆代码。他们得到的代码将无法维护,很可能存在严重的错误。

我建议对程序集进行密钥签名(这意味着黑客如果要重新编译一个程序集,就必须重新编译所有程序集),但我认为混淆不值得。


134
完全不同意。签名无法取代混淆。签名针对的是防止你的代码被黑客攻击。但如果你想隐藏你的想法、算法等,混淆是唯一的方法。 - Shrike
25
我认为签名不能取代混淆,它只是使黑客更难攻击。混淆无法隐藏你的想法 - 如果他们想要复制它,无论如何都会复制,而混淆甚至不会使其更加困难。特别是对于算法这种操作员,混淆并没有太大的影响 - 它们通常是最容易提取的东西之一。 - Keith
6
如果你所讨论的团队拥有大量资源,那么混淆可能不值得,但混淆非常适合保护自己免受“普通”的开发者攻击,他们只想使用反编译工具打开你的程序集并将源代码保存为项目以进行修改。混淆有其应用场景,完全排除它是错误的态度。它是一层防御。 - Razor
5
当你反编译时,源代码会变得混乱不堪,但从逻辑上讲它仍然遵循相同的路径。没有任何编译器的“神奇”巫术。我知道这一点,因为最近我丢失了一个存储库并使用了反射器来恢复源代码。如果混淆不是你的构建过程的一部分,那么它只是“维护”的痛点。它确实增加了开销,但我们是否都在编写计算密集型应用程序呢?不是所有人都是。对于弱攻击者而言,它是一层薄弱的防御层。 - Razor
8
多么糟糕的回答。你最近有尝试反编译吗?反编译器变得越来越好,而不是变得更糟。Reflector可以提供几乎与原始源代码同等质量的反编译结果,当然没有注释。 - BlueRaja - Danny Pflughoeft
显示剩余11条评论

23

如果你正在寻找免费的版本,你可以尝试带有Visual Studio的DotObfuscator Community Edition或者Eazfuscator.NET


自2012年6月29日起,Eazfuscator.NET现在是商业软件。最后一个可用的免费版本是3.3。


18

我一直在使用smartassembly。基本上,您选择一个dll文件,它返回一个混淆的dll文件。它似乎工作得很好,到目前为止我还没有遇到任何问题。非常,非常容易使用。


6
SmartAssembly 相当无用。黑客将您的应用程序转换成 DumbAssembly,所有的“保护”都可以通过鼠标点击轻松移除。http://www.woodmann.com/collaborative/tools/index.php/Dumbassembly - Elmue
2
截至目前,Google安全浏览标记Woodmann的网站不安全。此外,Woodmann的网站有一篇关于他先前遭受恶意软件感染的完整文章,因此当Google不信任它时,我不想访问他的网站。 - Brian
SmartAssembly太烂了。有很多情况下,该工具会显示错误,而他们的支持团队却无法解释这个错误意味着什么以及如何克服它。实际上,他们的支持团队并不关心,我有一种感觉,这个产品只是为了赚钱而已,直到它完全死掉。 - Lan

10

我尝试了市场上几乎所有的混淆器,而在我看来SmartAssembly是最好的。


6
Smartassembly相当无用。黑客将您的应用程序放入DumbAssembly中,所有的“保护”都可以通过鼠标单击轻松移除: http://www.woodmann.com/collaborative/tools/index.php/Dumbassembly - Elmue
3
目前,Google安全浏览标记Woodmann的网站为不安全。此外,Woodmann的网站上有一篇整篇都是关于他之前遭受恶意软件感染的文章,因此当Google不信任该网站时,我不想浏览它。 - Brian

9
我也一直在使用SmartAssembly,但对于我的.NET应用程序,我发现Ezirin .Net Reactor更好。它可以混淆、支持Mono、合并程序集,并且还有一个非常好的许可模块,可以创建试用版本或将许可证链接到特定机器(非常容易实现)。价格也非常有竞争力,当我需要支持时,他们的响应速度很快。Eziriz
只是为了明确,我只是一个喜欢该产品的客户,与公司没有任何关系。

我有很多朋友都对 .Net Reactor 赞不绝口 - 尽管该产品的官网上没有,但也有一个有用的谷歌用户组:http://groups.google.com/group/net-reactor-users?hl=en - Bittercoder
2
+1 for Eziriz。我用它得到了出色的结果。在我看来,它是目前最好的。 - Druid
4
.NET Reactor很糟糕。我换了电脑,两次发送邮件请求许可证文件,但没有得到回复。你知道,.NET Reactor的许可证是硬件锁定的。 - OrElse
2
这很正常。你怎么能指望他们相信你呢?他们怎么知道你真的更换了电脑,而不是试图在你的电脑上运行你朋友的许可证呢?因为这是一个硬件锁!如果它可以在多台计算机上使用,那么硬件锁就毫无用处了。 - Elmue
我已经使用 Reactor 很长一段时间了,但到目前为止,我仍然无法弄清楚如何使用他们的许可证系统!! - Ahmed Suror
显示剩余2条评论

7

简而言之,您是无法阻止别人阅读您的代码的。

有许多工具可以增加代码的阅读难度-一些已经在其他答案中提到过。

然而,所有这些都只是使阅读变得更困难-它们只增加了所需的努力量。通常这足以阻止普通读者,但是有决心深入研究您的代码的人总能够做到。


54
如果(efforts.Required > codeFromScratch.Costs) 则执行 DoNoReverseEngineer() 函数。 - Nicolas Dorier
44
@NicolasDorier,> 运算符无法应用于类型为 'System.TimeSpan' 和 'decimal' 的操作数。` - Saeb Amini
23
当然可以,将TimeSpan转换为货币(decimal)是大多数企业的基础。 - hultqvist

6
我们有一个多层应用程序,具有asp.net和winform界面,还支持远程操作。在使用混淆器方面,我没有遇到任何问题,除了加密类型,它生成的加载器可能会以各种意想不到的方式出现问题,并且在我看来不值得。实际上,我的建议更多是“像瘟疫一样避免加密加载器类型的混淆器”。 :)
根据我的经验,任何混淆器都可以与.NET的任何方面很好地配合使用,包括asp.net和远程操作,您只需要熟悉设置并学习如何在代码的哪些区域推动它。并花时间尝试对获得的内容进行反向工程,并查看它如何与各种设置一起使用。
多年来,我们在商业应用程序中使用了几个混淆器,并选择了9rays.net的Spices混淆器,因为价格合适,它可以完成工作,并且他们有良好的支持,尽管我们多年来真的不再需要支持,但老实说,我认为使用哪个混淆器并不重要,如果您想让它与远程操作和asp.net正常工作,则问题和学习曲线都是相同的。
正如其他人所提到的,你所做的只是相当于一个挂锁,防止诚实的人进入或者使重新编译应用程序变得更加困难。
许多人关注的是许可证问题,您应该为许可证使用某种数字签名证书系统。如果没有一个智能的系统,那么最大的损失将来自于许可证的非正式共享,而破解许可证系统的人本来就不会购买。
很容易过度追求这一点,并对您的客户和业务产生负面影响,请做简单和合理的事情,然后不要担心它。

6

Crypto Obfuscator 可以解决您所有的问题和场景。它具有以下特点:

  1. 基于规则自动排除需要混淆的类型/成员,其中包括序列化类型/字段。
  2. 可以使用 MSBUild 将其集成到构建过程中。
  3. 支持 ASP.Net 项目。

3
fyi @logicnp 写了Crypto。 - CAD bloke
加密似乎不再受支持。 - Carl
我尝试了几个工具,“Crypto”似乎非常强大和有用,但是当我在De4dot中运行混淆的DLL时,我得到了原始代码...很抱歉破坏了派对的气氛... - Dave Gahan

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