如何保护.NET代码免受逆向工程?
如何保护.NET代码免受逆向工程?
混淆是一种方法,但不能保护应用程序的防盗版保护安全不被破解。我如何确保应用程序不被篡改,以及如何确保注册机制不能被反向工程?
此外,将C#应用程序转换为本机代码是可能的,而 Xenocode 太昂贵了。
C#提供了许多功能,是我的代码的理想语言,因此再次在C ++中编写整个代码库是不可行的。
在.NET中,签名程序集中的安全证书可以轻松删除。
你无法完全保障任何应用程序(无论是经过管理的还是不经过管理的)。即使像PlayStation和iPad这样由供应商控制硬件的系统也可能被破解,你的应用程序有什么希望呢?幸运的是,你也不真的需要这样。在我看来,你只需要保障应用程序足够安全,使别人不能意外盗版你的产品,而且不需要更多的保护。
例如,如果你使用每台机器授权,那它就不会在你将它安装到第二台机器上时自动生效。你需要一个很好的错误信息来避免额外的支持呼叫,但不要花费额外的时间来使它难以避免,并且不要用力敲打用户。
另一个例子是有时间限制的试用版。不要担心用户可以随意回溯系统时间这样简单的事情。那些这样做的人知道他们正在破坏你的许可证,只要用户知道他们触犯了规定,你做得已经足够了。
你需要这么做是因为用户并不关心你的许可证。许可证是虚构的东西,除非必须要遵守,否则没人关心它们。没有人会去读它们,实际上也不应该读。因此,告诉用户界限的最好方法是如果应用程序的开箱即用行为符合许可证。在第一种情况下,这意味着要么安装失败,要么第二次安装以试用版本模式安装。对于后者,可能只是检查配置文件中的纯文本日期。无论哪种方法,一定要以优雅、有用和尊重的方式处理它。
所以这解释了只保障这么多意味着什么。但为什么不再做更多?为什么不塞住每一个小漏洞?答案有两个部分。首先,如果有人越过道德门槛有意打破你的许可证条款 - 即使只是简单的方式,他们也会愿意做更困难或更危险的事情,比如从torrent站点下载你的应用程序 - 并且从不受信任的来源下载应用程序存在一定的风险。让它更难对这些用户只是小小的烦恼,并可能会引起付费客户的问题。保持简单可能会防止某个人深入研究你的应用程序并发布更全面的破解。其次,你需要寻找缺陷的眼睛很少,黑客们有更多的眼睛,并且有更多的练习寻找它们。你只需错过一个小小的缺陷,你的应用程序就像一无所作为一样在盗版网站上传播。你必须一直正确;他们只需要一次运气。因此,所需的努力非常高,任何成功的可能性都非常低。
最终,如果有人想盗版你的应用程序(而不只是使用它),那就是他们的主要目标。你无法阻止他们。这是软件的本质,一旦构成你的产品的文件在用户的计算机上,他们就能随心所欲。这在像Java或.NET这样的可管理环境中尤其相关,但也适用于本地代码。时间在他们这边,只要给足够的时间,任何数字安全措施都可以被破解。
因为你无法阻止用户盗版你的产品,所以你最好的行动方针是以一种能够利用这类用户的方法与他们合作。通常可以让他们为你工作而不是反对你。考虑到这一点,无论你的应用程序是什么,保留一个几乎完整且不到期的免费版本都是值得的。即使只有一个美元的价格标签和免费之间的区别也很大,因为顾客不必信任你的信用卡信息。你的产品的免费版本不仅可以有效地消除盗版分发(为什么要冒着风险使用盗版版本,而不是花同样的价格合法地使用呢?),而且还有可能显著扩大你的受众数量。
结果是,你可能需要提高付费版的价格,这样最终可以得到100,000个免费用户中的500个愿意支付99美元购买“专业”版的用户,而不是每个付费用户20美元的2,000个用户。这比花很多时间锁定你的产品赚的钱更多。更重要的是,你可以与这些免费用户接触并在几个重要方面利用这种关系。
其中之一就是支持。一个悲观主义者会抓住这个机会抱怨支持100,000个免费用户的成本增加,但是令人惊讶的事情发生了:你的产品变得基本上是自我支持的。你会发现大型开源项目没有钱支付支持成本。用户会挺身而出来让它变成现实。
免费用户的支持期望通常较低,有很好的理由。你只需要将免费版标记为仅限于社区支持,为此放置一个用户主持的在线论坛。你的支持知识库将自我生产,并且高级用户将代表你为那些需要额外的帮助的用户提供支持。更重要的是,这将使你更快地识别和纠正错误,最终提高产品的质量并降低总体支持成本。这些都是以前无法实现的,因为你的用户群不够大,但是当你将免费用户视为客户时,它可以非常成功。
另一个方面是反馈。通过观察你的论坛,你可以学习到重要的改进想法,否则你可能永远不会考虑。这可以让更多的免费用户最终成为付费用户,并创建一个更加引人注目的产品,吸引更多的受众。
最后,你需要考虑营销。所有这些免费用户现在都是支持者而不是对手,他们会相应地行事。不仅如此,当发布你的下一个版本时,这些用户会通过你的官方发布渠道,而不是其他不知名的渠道。这意味着在你的下一个版本中,你开始与一个更大、高度感兴趣和支持的受众群连接。保留专业版的最佳功能是针对企业部署和管理的工具。破解者不会将其视为自己使用的充分理由,但对于想购买300个许可证并将其推广到整个公司的企业而言,这是必不可少的。当然,专业版仍然会被盗版,但再次强调:不要担心,因为无论您做什么,您可能都无法将产品出售给这些盗版者,因此这不会给您造成任何收入损失。
尽管心理上可能很难免费提供您的产品,但希望您能理解这确实是最好的方式。不仅如此,长期来看这是唯一的方式。我知道有人想着不想这样做。毕竟,他们多年来一直以售价20美元的锁定产品为生存之道。但这太糟糕了,因为如果您不这样做,最终会有其他人这样做。而且他们的产品将与您的一样好,或足够接近以便他们可以声称是这样的。然后突然间,您的定价看起来很荒谬,销售急剧下降,而您再也无能为力。如果必须,您可以选择额外的中间层,但不太可能对您有帮助。
你做不到。
有一些步骤可以做到让破解变得更加困难,但是任何一个本地机器上的可执行文件都是可以被破解的。最终,那些代码必须转换成本地机器代码,而任何可运行的应用程序都是脆弱的。
你要做的就是让破解变得足够困难,让人们不想再浪费时间去尝试。
以下是我为您建议的一些帮助保护应用程序的方法:
- 混淆您的代码。 Dotfuscator有一个免费版并且随附在Visual Studio中。
- 使用 公钥/私钥或 非对称加密 来生成您的产品许可证。这确保只有您可以生成您的许可证代码。即使您的应用程序被破解了,您可以确保他们不会发布针对您应用程序的密钥生成器,因为不可能反向生成密钥生成算法。
- 使用 第三方打包程序 将.NET可执行文件打包到加密的Win32封装应用程序中。 Themida是其中较好的一个。这可以阻止人们在.NET Reflector中反射您的应用程序,并且使得反向工程变得更加困难。
- 编写自己的 定制打包程序。如果第三方打包程序太昂贵,考虑编写自己的打包程序。有时,定制打包程序可以非常有效,因为没有公开的方法来解包它们。教程 如何编写自己的打包程序 给出了很多关于编写Win32打包程序的好信息。
然而,如果人们想要破解您的应用程序,他们总会想办法。看看所有商业软件,它们拥有大量资源来保护自己的应用程序,但是它们甚至在应用程序发布之前就已被破解了。
一个熟练的逆向工程师可以启动IDA-Pro并轻松地解析您的应用程序。即使应用程序被打包,也可以被解包,混淆也只是让解包过程更加困难。您所有使用复杂许可证代码的辛苦工作都可以通过一个字节补丁来撤销。
你只需要接受,有很大的可能人们会盗版你的软件。有些人无论如何都不会为应用程序付费,这些人您不需要担心。但是,还有许多企业绝不会冒问题并高兴地购买软件许可证,还有许多电脑用户不愿冒险,认为盗版是错误的,或者不够精通去盗版。这些人是您真正的客户,您应该把精力集中在为他们提供良好的用户体验上,而忽略盗版者。
我曾经有一款应用程序被盗版,我认为这是一件人身攻击。我作为一个小型开发者,将自己的心血倾注在一款应用程序中,这些人居然有胆量从我这里盗版?他们直接从我的口袋里拿走了钱!
我立即添加了一堆严格的DRM代码,试图破坏任何使用不正当或破解版的人。我当然应该致力于让我的应用程序变得更好,而不是试图阻止不可避免的事情发生。而且,我在添加这些额外保护的同时,也在伤害我的真正客户。
经过漫长的斗争,我意识到我在与潮流作斗争,所有这些浪费时间都是徒劳的。我删除了所有的联网代码,除了基本的许可证功能,从此不再回头。