我将创建一个将在客户端计算机上运行的应用程序。该程序将允许客户端使用该软件N次,然后为了使客户能够再次使用该软件,他/她将需要购买X次以使用该软件。这就像购买许可证或令牌(我不知道他们是否相同,因为我的英语不是那么好)。
我正在考虑创建一个.lic或.txt或其他任何可以加密的东西,当用新的.lic或.txt等更新时,它会改变客户端能够的次数。使用该软件。
问题是我不认为该方法非常可靠,因为即使加密,客户端也能够以某种方式破解和理解该文件。
有人可以帮我解决这个问题吗?
PS:该软件无法通过互联网验证,客户必须能够脱机使用该软件,如果我没有通过互联网验证该软件的使用情况并且不会遇到这个问题。
答案 0 :(得分:1)
首先,我必须同意简单地说,这不会是安全的评论。即使它们是正确的,开发人员也很容易解决,仍然可能有必要/希望阻止其他99%的人口。这与DRM面临的战斗是一样的,总有那些1%的人愿意花时间来破译你正在做的事情并解决它。但让我们继续讨论如何实现这一目标......
第1步 - 您需要一个“计数器”才能知道您的应用程序运行了多少次。遗憾的是,这只会被用户混淆,因为您的应用程序必须能够读取此值。通常,通过在注册表和文件系统中的几个位置隐藏值来实现这种混淆。有时您会发现这些信息是“加密的”(实际上它是由加密算法混淆的),使用主机上可用的信息,bios,cpu类型,hdd id等。
最终,执行计数器的存储和混淆是你的'秘密酱',唯一让它难以逆转的是通过保持你正在做的一个严密保密的秘密(因为大多数形式的混淆依赖于保密) 。因此,在为您提供解决方案时,我无法提供真正的价值,一旦发布在此处,它已不再是秘密:)
第2步 - 一旦您使用此计数器,您将需要向用户提供“许可证”。这实际上是一个简单的部分,PKI cryptography可以很好地为您服务。你想要的只是你控制的私钥,而你的客户端软件的公钥在某处是硬编码的。然后,您使用私钥作为客户端的“digitally sign”许可文件。当您的客户端加载许可证文件时,它会验证签名以确保此许可证文件是由相关私钥签名的,理论上只有您可以访问此密钥,这意味着您已授权此许可证。
第3步 - 现在您需要提供一种方法来验证此计数器是否未超过许可使用次数。这应该是直截了当的。
问题和解决方案
对这种解决方案最明显的攻击是对代码进行逆向工程。您需要使用.NET obfuscation库或编写非托管代码来解决此问题。
下一个最可能的攻击是使用调试程序跳过此验证。那里有很多反调试文章。我发现的最完整的标题是“An Anti-Reverse Engineering Guide”。
应该考虑的另一个攻击是修改你的可执行文件。签署您的可执行文件并验证其签名,就像您将获得许可证一样,以防止直接编辑代码。
执行计数器的存储将是一个明显的目标,请确保将其存储在多个地方,如果其中任何一个被篡改,您可以采取适当的措施。
最后,所有这些都不足以阻止确定的个人成功击败您的许可策略。现在就接受并根据您的普通用户的计算机能力水平和收入损失金额与实施成本的不同,实现您认为所需的数量。换句话说,你说实现了一些非常愚蠢和基本的东西,并期望20%的用户可以解决这个问题。根据您的客户,您认为20%的用户中不到四分之一的用户实际上会绕过您的DRM而不是支付许可费用。所以你希望你的可能收入减少5%,比如你每年赚100万,这意味着你的收入减少了5万。现在问问自己,我是否花费了X美元的时间让某人更难以规避,在什么时候它会成为负面回报呢?当然,预计会损失5万,你不会花费一年时间研究DRM。
老实说,我认为大多数使用DRM的应用程序都可以轻松完成。如果您的应用程序价格合适,那么人们将为此付费。对于那些将绕过您的DRM的人来说,他们可能不会购买您的应用程序,因此您并没有真正丢失任何东西。如果我在哪里,你会花费一定的时间来解决这个问题,(一周?)并且只在那段时间内做你能做的事。