我想保护我的软件不被未经许可使用。我将免费提供给我授权使用它的各方。
任何人都知道防止未经授权的各方复制和运行的良好保护计划吗?
到目前为止,我考虑过引入一个关键的验证机制:用户需要定期向我(网站查询)发送一个代码,我根据该代码生成一个新的代码,供应用程序验证。有一个初始代码,所以我可以跟踪用户......
想法?
稍后编辑:我更改了许可部分以避免没有重点的讨论。
我想保护我的软件不被未经许可使用。我将免费提供给我授权使用它的各方。
任何人都知道防止未经授权的各方复制和运行的良好保护计划吗?
到目前为止,我考虑过引入一个关键的验证机制:用户需要定期向我(网站查询)发送一个代码,我根据该代码生成一个新的代码,供应用程序验证。有一个初始代码,所以我可以跟踪用户......
想法?
稍后编辑:我更改了许可部分以避免没有重点的讨论。
我们正在使用PELock 许可系统,它具有扩展的 SDK API,允许我们自定义许可模型到最小的细节。
您基本上将部分代码包装在加密标记中,并且这些块被加密,没有有效的许可证密钥,这些块甚至不会执行,一旦用户提供许可证密钥,它们就会被解密、执行和重新加密。
#incude "pelock.h"
void FullVersionProc()
{
FEATURE_1_START
// this code runs only, if the license key has
// enabled FEATURE_1 section
FEATURE_1_END
}
为了将密钥锁定到特定计算机,我们使用硬件标识符和我们自己的自定义例程来读取特定的硬件组件。然后使用此硬件 ID 生成许可证密钥。
在任何情况下都注定要失败。如上所述,强制用户连接到网络会激怒用户;序列号等离线验证方案容易重复;限时副本容易重置时钟或时间戳等。
您考虑的保护方案根本不会保护您的软件免受未经授权的使用,因为它很容易对其进行逆向工程,并且只是强制保护永远不要要求您正在谈论的定期验证。
很难想出一个没有太多误报且不会惹恼用户的方案。有些人会将“打电话回家”视为“我正在跟踪你”。
另一种方法是以某种方式将用户的身份信息嵌入到软件中,然后如果您确实找到了泄露的副本,您将确切地知道该怪谁。让用户清楚地知道你已经这样做了,并依靠他们不想被抓到来减少副本。几个大玩家使用这个方案;我认为 O'Reilly 的书是其中之一?
至少有两种方法可以实现:要么使用离线密钥验证机制(请看这篇文章: http: //www.codeproject.com/Articles/764610/Licensing-systems-in-NET)或在线验证系统。
离线密钥验证有一个缺点 - 无法跟踪密钥是否已在任何其他机器上使用,也无法跟踪时间是否已重置。但是,它确实更容易,因为激活应用程序不需要互联网连接。
在线密钥验证为您提供了更多控制权。在这里,您可以选择在每次应用程序启动时强制用户连接到互联网,或者只强制用户连接到互联网一次/定期。第一个选项为您提供更好的控制,因为您可以阻止串行密钥或更改密钥可以运行的机器数量,并且该更改将在下次启动软件时影响客户端用户。后一个选项使您的控制稍少,但它使客户端用户不必一直访问互联网。此外,您始终可以将本地时间与互联网时间进行比较,以确保用户没有操纵它。
(2) 的一个示例是 SKM 平台 ( https://serialkeymanager.com/ )。(1)中描述的应用程序/算法的示例可以在我在开头提到的文章中找到。