我正在开发一个Windows应用程序。它需要用户注册才能使用... 现在,我将许可证信息存储为APpData中的文件。但删除该文件会重置试用版本日期。因此,我现在计划将其保存在注册表中。但是,大多数用户在Windows中没有管理权限(受限用户)以访问注册表。我该怎么办?在哪里可以保存我的序列号和日期?
我正在开发一个Windows应用程序。它需要用户注册才能使用... 现在,我将许可证信息存储为APpData中的文件。但删除该文件会重置试用版本日期。因此,我现在计划将其保存在注册表中。但是,大多数用户在Windows中没有管理权限(受限用户)以访问注册表。我该怎么办?在哪里可以保存我的序列号和日期?
如果他们删除了许可证数据文件,那么试用版会重新开始吗? 如果文件不存在,则不要启动应用程序,并在第一次安装时使用安装操作创建它。
现在你面临第二个问题:如果他们卸载并重新安装应用程序怎么办? 第二步是将此文件移动到应用程序数据文件夹中(例如Environment.SpecialFolder.CommonApplicationData)。 这仅稍微安全一些(因为卸载时不会删除应用程序数据),但他们仍然有可能手动找到并删除它。 如果低权限用户安装应用程序,则无多少可做的(您无法尝试在注册表中隐藏许可证)。
现在这是你和破解者之间的游戏。 他们总是会获胜。 您只会增加合法用户的生活难度,因此请慎重考虑。 存储许可证数据的位置:
\0
在其名称中,则可以隐藏。 请参见此帖子。如何在文件中隐藏许可证?
如果使用文件(无论其位于何处),则可以考虑使破解者的生活变得(略微)困难一些。 现在我想到了两种解决方案:
备用数据流。文件附加到另一个文件上,他们不会在Windows Explorer中仅通过搜索看到它。 当然有一些工具可以管理它们,但至少他们必须明确地搜索它。
将其隐藏在应用程序数据中(例如,使用隐写术的位图)。他们不知道这是许可证数据,更安全的是什么?问题是他们可以轻松反编译你的C#程序以查看你的操作(请参阅代码混淆一节)。
可能还有其他方式(幻想是我们的主人),但别忘了……黑客会找到它(如果他们真的想要),所以你必须平衡自己的努力。
保持你的许可架构,你现在走上了一条死路。你需要决定的是,如果他们使用试用期比允许的时间更长的风险高于因乏味的保护而停止使用你的应用程序的风险。
验证
如果你可以假设用户拥有网络连接,那么你可以使用一些 唯一标识符 在线验证许可证(仅在用户首次运行应用程序时)。即使是针对Windows 8的应用程序,你也可以参考这篇SO帖子。服务器端的验证可能会非常棘手(如果你想以正确的方式来做),在这篇帖子中,解释了如何在适当的方式下管理程序流程。
数据混淆/加密
您的许可文件/数据现在已经安全存放。黑客几乎无法找到它。现在您需要进行另一个步骤:混淆。如果您的许可数据以纯文本形式存在,一旦他们找到您的文件就太容易更改了。您有几个选项(按安全性和复杂性顺序排列):
请注意,数据混淆/加密可以与上述隐写术相结合使用(例如将加密的许可文件隐藏在图像中)。
代码混淆
如果你没有使用非对称加密的许可证签名,那么最后一步是混淆你的代码。无论你做什么,他们都能看到你的代码,检查你的算法并绕过它。很遗憾,你正在部署说明手册。如果你想要混淆,请使用混淆器,但我强烈建议将许可证检查移动到不太明显的地方。
我喜欢这种方法,因为他们会看到有许可证检查,但是...他们找不到许可证代码。当然,任何好的破解者都可以在10分钟内解决此问题,但你将比较(稍微)安全,免受随机攻击。
简要总结一下,这是一个提供更强的许可证检查的方法列表(当然可以跳过一个或多个步骤,但这会降低安全性):
补充说明:软件保护狗
关于硬件密钥(软件保护狗)的一个小补充。它们是保护您的软件的宝贵工具,但是您必须更仔细地设计您的保护。您可以假设硬件本身非常安全,但其与计算机的连接和与您的软件通信的弱点。
如果你要写入 HKEY_CURRENT_USER,你不需要管理员权限。 另一方面,写入 HKEY_LOCAL_MACHINE 需要管理员权限。
当你打开用于写入的键时,请确保像这样调用它
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\YourAppPath", true);
如果那对你不起作用,还有一个技巧是将内容写入可执行文件的末尾,但那是另一回事。