没有互联网查找以确保付费应用程序的最佳方式

时间:2013-05-28 15:11:30

标签: c# .net security

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

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

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

  1. 我要支付的服务器上有很多互联网流量。
  2. 如果无法验证密钥,无法访问互联网的人(或我的服务器停在某处或路由器某处)可能会阻止该应用运行。
  3. 聪明的人使用Wireshark /流量嗅探器可以解码我发回的任何密钥以激活应用程序,然后写一些东西来绕过它。
  4. 因此,我正在考虑一些简单的事情,例如与计算机名称/ MAC地址/ IP(购买时)相关的校验和,然后将其存储在计算机注册表中(1 license = 1 key)。

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

    如果有人将该应用程序交给另一台计算机,则该密钥将不存在(如果他们购买了该密钥,我可以给他们一个特殊的一次性重载密钥,这将在注册表中重新设置密钥等)。没有原始付款细节的人无法得到这个。

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

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

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

假设您正在为Windows操作系统设计此应用程序,您希望查找每个系统难以更改的独特内容。

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

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

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

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

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

如果您使用人工操作系统键,另一个奖励可能是在被黑客入侵后追踪罪魁祸首。

希望这有帮助。

答案 1 :(得分: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");
}
}

希望这有帮助

相关问题