我正在考虑混淆商业 .Net 应用程序。但真的值得花功夫去选择、购买和使用这样的工具吗?混淆的二进制文件真的不会受到逆向工程的影响吗?

有帮助吗?

解决方案

您可能不必购买工具 - Visual Studio.NET 附带了 Dotfuscator 的社区版本。其他免费混淆工具 列在这里, ,他们可能会满足您的需求。

混淆的二进制文件可能无法安全地进行逆向工程,就像您的自行车锁可能是易碎/可撬的一样。然而,通常情况下,一个小小的不便就足以阻止密码/自行车窃贼。

此外,如果需要在法庭上维护您对一段代码的权利,那么如果您被认为努力保护它(通过混淆它),可能会给您加分。:-)

不过,您确实必须考虑缺点 - 在混淆的代码中使用反射可能会更困难,并且如果您使用 log4net 之类的东西根据所涉及的类的名称生成部分日志行,这些消息可能会变成解释起来要困难得多。

其他提示

请记住,混淆只是对代码的临时检查者的障碍。如果有人认真地想弄清楚你写的内容,你将很难阻止他们。

如果您的代码中有秘密(例如密码),那么您就做错了。

如果您担心有人可能会用您的想法生产您自己的软件,那么通过提供客户想要的新版本、提供技术支持以及成为他们的合作伙伴,您将在市场上获得更多运气。好生意获胜。

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

因此,所有混淆器都会重命名事物,您当然可以禁用它,但这样您就失去了混淆的很多好处。

此外,在我们的代码中,我们有很多 NUnit 测试,这些测试依赖于更多公开的方法和属性,这阻止了一些混淆器混淆这些类。

最终我们选择了一款产品,叫做 .NET反应堆

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

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

事实上,你实际上可以对它进行逆向工程,但这并不意味着混淆毫无用处。它确实显着提高了标准。

未混淆的 .NET 程序集将向您显示所有突出显示的源代码,只需下载 .NET反射器. 。添加混淆,您将大大减少能够修改代码的人数。

这取决于你是否保护自己免受伤害。如果您将不加混淆地交付它,您也可以开源该应用程序并从营销中受益。对其进行混淆处理只会让人们相对容易地通过补丁生成修改后的二进制文件,而不是能够窃取您的代码并创建直接竞争对手。当然,从混淆代码中获取实际源代码非常困难,这取决于混淆器。

我认为这取决于你的产品类型。如果它是直接由开发人员使用的,那么混淆将会伤害您的客户。我们在工作中一直使用ArcGIS产品,所有的DLL都被混淆了。这让我们的工作变得更加困难,因为我们无法使用 Reflector 来破译奇怪的行为。我们正在购买为该产品支付数千美元的客户。

所以请不要混淆,除非确实有必要。

您应该考虑的事项:

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

混淆可以解决的唯一问题是有人创建您的特定实现的 1:1(或接近 1:1)副本。

此外,在理想的世界中,对模糊应用程序进行逆向工程在经济上没有吸引力。

但回到现实:

  • 这个星球上不存在任何工具可以阻止某人复制任何应用程序提供或产生的用户界面、行为或结果。 在这种情况下混淆是 100% 无用的
  • 市场上最好的混淆器无法阻止人们使用某种反汇编程序或十六进制编辑器 对于一些极客来说,这是了解应用程序核心的好方法。它只是比未混淆的代码更难。

因此,现实情况是,您可以使检查应用程序变得更加困难和耗时,但您不会真正获得任何可靠的保护。无论您使用免费产品还是商业产品。

控制流混淆或代码虚拟化等先进技术有时可能有助于使逻辑理解变得非常困难,但它们也可能导致许多有趣且难以调试或解决的问题。因此,它们有时更像是一个额外的问题,而不是解决方案。

从我的角度来看,混淆不值得一些公司为其产品收取费用。 如果您想困扰临时开发人员,开源混淆器就足够了。如果您想让尽可能难以研究应用程序的核心,您需要将加密容器与虚拟执行环境和虚拟文件系统结合使用,但它们也提供了攻击向量,也可能成为充满问题的根源。

您的知识产权和您的产品在大多数国家都受到法律保护。 因此,如果有竞争对手分析和复制您的代码,您可以起诉他。如果坏人或黑客或破解者拿走了您的应用程序,您就会被恶作剧 - 但混淆器不会产生任何影响。

因此,您应该首先考虑您的目标、您的市场以及您希望通过混淆器实现什么目标。 正如您可以在此处(以及其他地方)阅读的那样,混淆并不能真正解决逆向工程的问题。这只会让事情变得更困难、更耗时。 但如果这是您想要的,您可以看看开源混淆器,例如SharpObfuscator 或 obfuscar 可能足以让业余程序员烦恼(可以在此处找到列表: 维基百科上的 .NET 混淆器列表).

如果您的情况可行,您可能也会对 SaaS 概念感兴趣。 这意味着您可以访问您的软件,但不能访问软件本身。因此客户通常无法访问您的组件。 但根据服务水平、安全性和用户基础,实现可靠、自信和高性能的 SaaS 服务可能会昂贵、复杂且困难。

不,混淆已被证明不会阻止某人破译编译后的代码。这使得这样做变得更加困难,但并非不可能。

我阅读 x86 汇编代码非常舒服,那么那些使用汇编工作了 20 多年的人呢?

你总会找到只需要一分钟就能看到你的 c# 或 c 代码在做什么的人...

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

...剪断...这些消息可能会变得更加难以解释

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

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

使用以下命令对 .net 应用程序进行逆向工程非常简单 .net反射器 - 由于该应用程序将直接从 MSIL 生成 VB、VC 和 C# 代码,因此可以提取各种有用的宝石。

代码混淆器可以很好地隐藏代码,防止大多数逆向工程黑客攻击,并且在专有和竞争性代码上使用它是一个好主意,可以为您的应用程序增加价值。

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

这个帖子 和周围的问题进行了一些可能有价值的讨论。这不是一个是或否的问题。

是的,你绝对应该这样做。不是为了保护它免受有决心的人的侵害,而是为了获得一些利润并拥有客户。顺便说一句,如果您到达这里有人试图破解您的软件,则意味着您销售了流行的软件。

问题是为这项工作选择什么工具。看看我使用商业混淆器的经验: https://stackoverflow.com/questions/337134/what-is-the-best-net-obfuscator-on-the-market/2356575#2356575

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

但真的值得花功夫去选择、购买和使用这样的工具吗?

我发现 Eazfuscator 便宜(免费)并且易于使用:花了大约一天的时间。我已经进行了广泛的自动化测试(良好的覆盖范围),所以我认为我可以找到由混淆引入的任何错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top