我正在考虑对一款商业 .Net 应用程序进行混淆。但是选择、购买和使用这样的工具真的值得吗?混淆后的二进制文件真的能够免受逆向工程吗?
我正在考虑对一款商业 .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代码从未在硬盘上复制。没有任何工具能够反编译.NET Reactor受保护的程序集。"
需要考虑的事情:
混淆唯一能够解决的问题就是有人创建了一个与你的特定实现相同或接近相同的副本。
在理想的世界里,混淆应用程序的反向工程不经济实惠。
但回到现实:
因此,现实情况是,你可以使窥探你的应用程序变得更加困难和耗时,但你不会真正获得可靠的保护。无论你使用免费还是商业产品。
像控制流混淆或代码虚拟化这样的高级技术可能有助于使逻辑理解变得非常困难,但它们也可能导致许多有趣且难以调试或解决的问题。因此,它们有时更像是一个额外的问题而不是解决方案。
在我看来,混淆不值得一些公司收取的费用。如果你想要纠缠休闲开发者,开源混淆器已经足够好了。如果你想尽可能地防止人们窥探你的应用程序,你需要使用带有虚拟执行环境和虚拟文件系统的加密容器,但它们也提供攻击向量,并可能成为一个充满问题的来源。
在大多数国家,你的知识产权和产品都受到法律保护。因此,如果有竞争对手分析和复制你的代码,你可以起诉他。如果一个坏人、黑客或破解者拿走了你的应用程序,你就受骗了——但混淆器并没有什么区别。
因此,您应该首先考虑您的目标、市场以及您想通过混淆器实现什么。正如您可以在这里(以及其他地方)阅读到的那样,混淆并不能真正解决反向工程的问题。它只会使其更加困难和耗时。但如果这是您想要的,您可以查看开源混淆器,例如sharpObfuscator或obfuscar,它们可能足以卡住休闲的编码人员(列表可在此处找到:维基百科上的.NET混淆器列表)。 如果在您的情况下有可能,您也可能对SaaS概念感兴趣。这意味着您提供对软件的访问权限,而不是软件本身。因此,客户通常无法访问您的程序集。但是,根据服务级别、安全性和用户基础,实现可靠、自信和高效的SaaS服务可能会很昂贵、复杂和困难。我认为这取决于您的产品类型。如果它是面向开发人员使用的,则混淆将对您的客户造成伤害。我们在工作中一直在使用ArcGIS产品,而所有的DLL都被混淆了。这使得我们的工作变得更加困难,因为我们无法使用Reflector来解密奇怪的行为。而且我们正在购买那些为该产品支付数千美元的客户。
所以,除非确实必须,否则请不要进行混淆。
对于其他在未来几年阅读此文的人,我要提醒一句话——我几个小时前仅大致浏览了附带VS2008的Dotfuscator社区版许可证,我认为你不能使用该版本发布商业产品或混淆涉及除你之外的任何开发人员参与的项目的代码。因此,对于商业应用程序开发人员来说,这实际上只是一个试用版。
不,混淆已被证明不能防止某人能够解密编译后的代码。它使这样做更加困难,但并非不可能。
我曾成功地将一个免费的混淆器的输出放入另一个混淆器中。在 Dotfuscator CE 中,只包含了部分混淆技巧,因此使用另一个具有不同技巧的混淆器可以使它更加混淆。
我非常擅长阅读x86汇编代码,那么对于从事汇编工作超过20年的人来说呢?
你总能找到一些人只需要一分钟就能看出你的c#或c代码在做什么...