我有一个正在销售的应用程序,我想对其进行扩展。
然而,我不希望人们只能复制 EXE 文件并将其提供给他们的 friend 等。我知道这几乎是不可能完成的任务,但我想让非技术人员尽可能难以完成。
显然,每次他们启动应用程序时,我都可以通过互联网对数据库进行 key 查找,但这意味着:
- 我的服务器有大量互联网流量,我愿意为此付费。
- 如果无法验证 key ,无法访问互联网的人(或我的服务器出现故障/或某个地方的路由器)可能会阻止该应用程序运行。
- 使用 Wireshark/流量嗅探器的聪明人可以解码我发回的任何 key 以激活应用程序,然后编写一些东西来绕过它。
因此我在考虑一些简单的东西,例如与计算机名称/MAC 地址/IP(购买时)相关的校验和,然后将其存储在计算机注册表中(1 个许可证 = 1 个 key )。
然后,当应用程序打开时,它会检查正确的注册表项,并将其与应用程序内的设置变量进行比较,以确保它在应用程序启动之前匹配。
如果有人将该应用程序提供给另一台计算机,则该 key 将不存在(如果他们购买了它,我可以给他们一个特殊的一次性 key ,该 key 将在注册表中重新设置他们的 key 等)。没有原始付款详细信息的人无法获得此信息。
有没有人有任何不围绕互联网查询等的更好的想法,或者看到我提出的想法有任何问题?
该应用程序是用 C# 编写的,作为 .NET 4.5 中的 Windows 窗体应用程序
如有任何帮助,我们将不胜感激。
最佳答案
好的,在这种情况下,我会建议对产品 ID 做一些事情 - 这样可以在程序启动时检查 ID。但是,请记住,必须将“允许的 key ”在线或在应用程序本身后面输入到某个数据库中。
然后,当程序启动时,它会检查用户的产品 ID,并将其与已放在“允许列表”中的 ID 进行检查。
这取决于“允许的 ID”的存储方式。如果您只是在代码中存储用户的单一 ID 然后对其进行编译 - 不。如果您在与应用程序分开的某种数据库中有大量允许的 ID 列表 - 是的。这取决于黑客的技能水平,大多数优秀的黑客将能够完成他们设定的目标 - 无论他们如何去做 - 甚至达到破解核心代码开发系统的地步.
如果您不考虑后者,您可以简单地将允许的 ID 存储在一个变量中:
string AllowedID = "1234-ABCD-5678-EFGH";
然后,要根据用户的 Windows 操作系统产品 ID 检查它,您可能需要查询注册表(当我说产品 ID 时,我不是指用于安装操作系统的序列号,因为存储它可能有一些道德问题影响)。
您可以这样做来检索产品 ID(在 Win7 Ultimate x64 上测试):
private void Form1_Load(object sender, EventArgs e)
{
string value64=null;
RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null)
{
value64 = localKey.GetValue("ProductID").ToString();
}
if (value64 == AllowedID)
{
MessageBox.Show("Successfully Authenticated");
//run the application functions etc
}
else
{
MessageBox.Show("Error Authenticting");
}
}
希望对你有帮助
关于c# - 无需互联网查询即可确保付费应用程序安全的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795521/