2

我有一个我目前正在销售的应用程序,我想扩展它。

但是,我不希望人们只能复制 EXE 并将其提供给他们的朋友等。我知道这几乎是不可能的任务,但我想让非技术人员尽可能地努力。

显然,每次他们启动应用程序时,我都可以通过 Internet 对数据库进行密钥查找,但这意味着:

  1. 我愿意支付大量互联网流量到我的服务器。
  2. 如果无法验证密钥,则无法访问 Internet(或我的服务器已关闭/或某处的路由器)的人可能会阻止该应用程序运行。
  3. 使用 Wireshark / 流量嗅探器的聪明人可以解码我发回的任何密钥以激活应用程序,然后编写一些东西来绕过它。

因此,我正在考虑一些简单的东西,例如与计算机名称/MAC 地址/IP(购买时)相关的校验和,然后将其存储在计算机注册表中(1 个许可证 = 1 个密钥)。

然后,当应用程序打开时,它会检查正确的注册表项并将其与应用程序内的设置变量进行比较,以确保它在应用程序启动之前匹配。

如果有人将该应用程序提供给另一台计算机,则该密钥将不存在(如果他们购买了它,我可以给他们一个特殊的一次覆盖密钥,该密钥将在注册表中重新设置他们的密钥等)。没有原始付款详细信息的人无法获得此信息。

有没有人有任何更好的想法,而不是围绕互联网查找等,或者看到我提出的想法有任何问题?

该应用程序是用 C# 编写的,作为 .NET 4.5 中的 Windows 窗体应用程序

任何帮助将非常感激。

4

2 回答 2

0

假设您正在为 Windows 操作系统设计此应用程序,您希望寻找每个系统独一无二且难以更改的东西。

MAC 地址可以被欺骗,IP 和名称也是如此。可以更改的一件事是 Windows 产品密钥/Windows ID。在注册时,获取用户操作系统的产品 ID,然后确保应用程序在启动时将其检查为正在验证。

如果没有互联网访问应用程序,这将成为一个更大的问题,因为您可能必须将其预编码到应用程序中,编译然后将唯一版本出售给唯一客户。

如前所述,阻止黑客对您的应用程序进行逆向工程非常困难,尤其是在未从在线资源提供盐或其他东西的情况下。正如所有黑客所做的那样,尝试编辑源代码以允许任何密钥或类似的东西。

有些公司可以让您以非常小的成本在他们的服务器上托管小型数据库,因此您可以考虑这样做,而不是 24/7 托管实时服务器。有关这方面的更多信息,请随时给我发送电子邮件/聊天消息。

我建议使用某种互联网/数据库查询来让黑客更难,然后确保这是完全加密的,特别是考虑到现在拥有 PC 的大多数人都有互联网连接。

如果您使用人们的操作系统密钥,另一个好处可能是一旦它被黑客入侵,就可以追踪罪魁祸首。

希望这可以帮助。

于 2013-06-04T19:35:27.477 回答
0

好的,在这种情况下,我建议使用产品 ID 做一些事情 - 这样可以在程序启动时检查 ID。但是,请记住,“允许的密钥”必须在线或在应用程序本身后面输入某个数据库。

然后,当程序启动时,它会检查用户的产品 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");
}
}

希望这可以帮助

于 2013-06-06T18:27:52.833 回答