首页 / 知识

关于c#:您应该混淆商业.Net应用程序吗?

2023-04-15 20:44:00

关于c#:您应该混淆商业.Net应用程序吗?

Should you obfuscate a commercial .Net application?

我当时正在考虑混淆商业.Net应用程序。 但是,选择,购买和使用这样的工具真的值得吗? 被混淆的二进制文件真的可以进行逆向工程吗?


您可能不必购买工具-Visual Studio.NET带有Dotfuscator社区版本。其他免费的混淆工具在此处列出,它们可能满足您的需求。

混淆的二进制文件可能无法逆向工程,因此就像您的自行车锁可能会断裂/可撬一样。但是,通常情况下,一些小麻烦足以阻止代码/自行车小偷。

另外,如果是时候在法庭上主张您对某段代码的权利,则被视作努力保护该代码(通过混淆)可能会给您带来额外的好处。 :-)

不过,您确实必须考虑不利方面-使用混淆代码进行反射可能会更加困难,并且如果您正在使用log4net之类的东西根据所涉及的类的名称生成部分日志行,这些消息可能会变成很难解释。


请记住,混淆只是临时检查代码的一个障碍。如果有人真的想弄清楚你写的是什么,那么将很难阻止他们。

如果您的代码中有秘密(例如密码),则说明您做错了。

如果您担心有人会用您的想法来生产自己的软件,则可以通过提供客户所需的新版本,技术支持以及成为他们的合作伙伴来在市场上取得更大的运气。好生意赢了。


在我们公司,我们评估了几种不同的混淆技术,但是它们都有问题。最大的问题是我们非常依赖反射,例如根据属性名称动态创建网格。

因此,所有混淆器都将其重命名,您当然可以将其禁用,但是这样会失去很多混淆的好处。

另外,在我们的代码中,我们有大量的NUnit测试,它们依赖于许多公开的方法和属性,这使某些混淆器无法混淆那些类。

最后,我们选择了一种名为.NET Reactor的产品

它工作得很好,并且我们没有与其他产品相关的任何问题。

"与混淆器相比,.NET Reactor通过将任何纯.NET程序集(用C#,VB.NET,Delphi.NET,J#,MSIL ...编写)与本地机器代码混合来完全停止任何反编译。具体而言,.NET Reactor在潜在的黑客和您的.NET代码之间建立本机墙,结果是基于Windows的标准文件(与MSIL不兼容)。原始.NET代码保持完整,受到本机代码的良好保护,并且不被窥视。任何时候都不会将代码复制到硬盘上。没有工具可以反编译.NET Reactor保护的程序集。"


您实际上可以对其进行反向工程的事实并不会使混淆变得毫无用处。它确实大大提高了标准。

一个清晰的.NET程序集将通过下载.NET Reflector向您显示所有源代码,突出显示的内容。对此添加混淆,将显着减少能够修改代码的人员数量。

这取决于您是否保护自己免受侵害。如果您将其顺利发布,则最好将应用程序开源并从营销中受益。对其进行混淆处理后,将只能使人们相对容易地通过补丁程序生成经过修改的二进制文件,而不是能够窃取您的代码并创建直接竞争对手。当然,从混淆代码中获取实际源代码非常困难,这取决于混淆器。


我认为这取决于您产品的类型。如果将其定向给开发人员使用,那么混淆会伤害您的客户。我们一直在使用ArcGIS产品,并且所有DLL都被混淆了。这使我们的工作更加困难,因为我们无法使用Reflector来破译怪异的行为。而且,我们购买的客户花了数千美元购买了该产品。

因此,请不要混淆,除非您确实需要。


您应考虑的事项:

  • 混淆不会保护您的代码或逻辑。这只会增加阅读和理解的难度。
  • 混淆并不能阻止逆向工程。这只会减慢该过程。
  • 您的知识产权在大多数国家/地区都受到法律保护。因此,如果竞争对手使用您的代码或特定的实现,则可以起诉他。

模糊处理可以解决的唯一也是唯一的问题是,有人为您的特定实现创建了1:1(或接近1:1)的副本。

同样在理想的世界中,混淆应用程序的反向工程在经济上没有吸引力。

但是回到现实:

  • 这个星球上没有任何工具可以阻止某人复制任何应用程序提供或产生的用户界面,行为或结果。在这种情况下,混淆是100%无用的
  • 市场上最好的混淆器无法阻止人们使用某种反汇编程序或十六进制编辑器,并且对于某些极客而言,这对于深入研究应用程序的核心而言是非常好的。这比在未混淆的代码上更难。

因此,现实情况是,您可以更费力地查看应用程序,但实际上并不会获得任何可靠的保护。无论您使用的是免费产品还是商业产品。

诸如控制流混淆或代码虚拟化之类的先进技术有时可能会使真正理解逻辑变得非常困难,但它们也可能引起很多麻烦,并且难以调试或解决问题。因此,有时它们更像是一个附加问题,而不是解决方案。

从我的角度来看,混淆不值得某些公司为其产品收取费用。如果您想na休闲开发人员,那么开源混淆器就足够了。如果您想尽可能地深入了解应用程序的核心,则需要将加密容器与虚拟执行环境和虚拟文件系统一起使用,但它们也提供了攻击载体,并且可能是充满问题的源头。

您的知识产权和产品在大多数国家/地区都受到法律保护。因此,如果有一个竞争对手分析和复制您的代码,则可以起诉他。如果一个坏人,黑客和破解者采用了您的应用程序,那么您会被恶作剧-但是混淆器并没有什么用。

因此,您首先应该考虑目标,市场以及要使用混淆器实现的目标。正如您在这里(和其他位置)所看到的那样,混淆并不能真正解决逆向工程的问题。这只会使它更加困难且耗时。但是,如果这是您想要的,您可以看看开源混淆器,例如sharpObfuscator或obfuscar可能足以使休闲编码员na(可在此处找到列表:Wikipedia上的.NET Obfuscators列表)。

如果您的方案可行,您可能也对SaaS概念感兴趣。这意味着您提供对软件的访问权,但不提供软件本身的访问权。因此,客户通常无法访问您的程序集。但是,取决于服务级别,安全性和用户群,实现可靠,自信和高效的SaaS服务可能很昂贵,复杂且困难。


我非常喜欢阅读x86汇编代码,而从事汇编工作已有20多年的人们呢?

您总会发现只需要一分钟就能看到您的C#或C代码正在做什么的人...


这是对几年后阅读的其他人的说明-几个小时前,我刚刚浏览了Dotfuscator社区版(VS2008附带)的许可证,我相信您不能使用此版本来分发商业产品或混淆代码来自涉及您以外的任何开发人员的项目。因此,对于商业应用程序开发人员来说,它实际上只是一个试用版。


不,混淆已被证明不能阻止某人解密已编译的代码。这样做更加困难,但并非没有可能。


我已经成功地将一个免费混淆器的输出放到了另一个混淆器中。在Dotfuscator CE中,仅包含一些混淆技巧,因此使用具有不同技巧的第二个混淆器会使它更加混淆。


...snip...
these messages can become much more
difficult to interpret

是的,但是Visual Studio随附的免费社区版具有地图功能。
这样,您就可以将混淆后的方法名称追溯到原始名称。


是的,您绝对应该。不是为了保护自己免受某个坚定的人的侵害,而是要获取一些利润并吸引客户。顺便说一句,如果您在此处达到某个目的,则有人会尝试破解您的软件,这意味着您出售了流行的软件。

问题是为工作选择哪种工具。看看我在商用混淆器上的经验:https://stackoverflow.com/questions/337134/what-is-the-best-net-obfuscator-on-the-market/2356575#2356575


使用.net反射器对.net应用程序进行反向工程非常简单-因为该应用程序将直接从MSIL生成VB,VC和C#代码,并且有可能提取各种有用的gem。

代码混淆器可以很好地将代码隐藏在大多数逆向工程黑客面前,并且在专有和具有竞争力的代码上使用是一个好主意,可以为您的应用增值。

有一篇很好的关于混淆的文章,它在这里起作用


这篇文章和周围的问题进行了一些有价值的讨论。这不是一个是或不是问题。


是的,我们愿意。我们使用BitHelmet混淆器。它是新的,但效果很好。


But is it really worth the effort to select, buy and use such a tool?

我发现Eazfuscator价格便宜(免费),并且易于使用:花了大约一天的时间。
我已经进行了广泛的自动化测试(覆盖面很广),所以我认为我可以找到混淆带来的所有错误。


应用程序购买选择工具

最新内容

相关内容

猜你喜欢