如何使我的程序不能在其他计算机上运行?

6

我有一个任务,其中包括以下两个要求:

  • 制作安装程序
  • 确保如果在一台计算机上安装了该程序,任何试图在另一台计算机上运行相同文件的用户都将失败。

我正在使用VS9(2008)Express,我认为我可以完成安装程序部分,但我不确定如何实现“安全”部分。我不需要什么难以破解的安全性,只需要一个简单的条件即可阻止大多数用户将文件复制到另一台计算机上。(比如检查MAC地址)。

有什么想法吗?

编辑:
我想检查MAC地址,但我希望在安装期间完成程序的最终化。也就是说,安装后我不能将程序移动到另一台计算机上。它也不必是非常智能或困难的条件,只需要最基本的即可。我只是不知道如何在安装过程中实现它。

编辑:
很遗憾我没有完整的VS,否则我就能轻松完成了。


1
检查MAC地址听起来像是一个不错的开始。 - Andy Webb
2
你是想防止xcopy复制你程序的安装文件夹,还是想防止别人在新机器上运行安装程序? - NotMe
1
什么是条件?如果安装程序运行两次,第二次安装会以某种方式失败吗?如果复制已安装的文件,第二个系统将无法运行它们吗?这两种情况的答案显然不同。 - David Thornley
安装程序只能运行一次。条件是,如果我将安装的文件移动到其他计算机上,它们将无法运行。 - Nefzen
实现有意的糟糕安全措施是一项奇怪的家庭作业任务。这是为了什么? - quillbreaker
显示剩余2条评论
9个回答

9
如果你正在寻找一种方法将第一台计算机标记为“授权”计算机,那么你需要一些外部服务来请求启动许可。第一个请求许可的人将被允许,其余的人将被阻止。你还需要想出一种为每个安装程序不同的应用程序实例进行标识的方法。如果你的应用程序需要为机器授权,则需要计算出机器的某些指纹,每次都可以使用(例如在安装过程中)。[编辑]当你担心安装程序的副本被分发时,这种方法是有用的。你确实指定了可以在多台机器上安装,因此MasterMind的方法更优越。它可以工作,并且不需要第三方服务器。[编辑2]如果你正在寻找有关如何构建自定义安装程序的信息,请尝试here

6
首先,设计一些函数来生成唯一的PC签名,就像Windows用于激活一样。
您的安装程序将创建此签名并将其写入本地文件(最好加密)。您可以创建一个简单的控制台可执行文件来生成此文件,并将该可执行文件包含在您的安装程序包中,在成功安装后设置它在静默运行。
您的程序在启动时将再次使用相同的算法创建签名,并将其与安装期间创建的签名进行比较。如果新签名与原始签名不同或签名文件丢失,则退出而不加载UI。
补充:如果不需要非常复杂,可以选择一些唯一的值,例如您建议的MAC地址、硬盘序列号、主板序列号,将它们连接成一个字符串并从中生成哈希值。
这种方法将允许无限数量的副本运行(但每个安装只能在安装它的单个机器上运行)。如果坚持通过硬件识别(或产品密钥)来标识,则可以在同一台机器上运行各种操作系统安装的应用程序。
然而,这种策略意味着您控制所有安装(或自己执行安装),或者完全信任您的客户不会在其他地方安装其他副本或分发您的安装程序。如果您也需要那种保护,那么您应该考虑产品激活。如果自己做会很复杂,但有第三方产品可以帮助您。一些公司提供产品激活服务:Google: activation service

他们不能只复制文件吗? - Nefzen
2
@Nefzen 如果该文件是唯一的计算机文件(即通过使用硬件数据生成),那么它将无法匹配复制到的计算机。 - Serhat Ozgel
1
签名必须对于每台电脑都不同(唯一)。如果复制,检查将失败,因为生成的签名与文件中的签名不同。棘手的部分是生成唯一的签名。 - Burkhard
他们可以这样做,但是每个硬件设置的文件都将是独特的。而且该文件只能由安装程序生成。因此,如果他们无法复制硬件并且没有安装程序,它将无法工作。那么唯一剩下的选择就是对您的可执行文件进行反汇编/破解。 - User
你可以像BlodBath建议的那样,使用Windows产品密钥。 - Burkhard

5
一旦你拥有了一个不错的指纹,其余的就很容易了。个人建议使用类似MAC地址和Windows产品ID(位于HKLM\Software\Microsoft\Windows\CurrentVersion\ProductId)这样的信息,并使用哈希算法得到一些相对难以猜测的东西。
编辑:
下面是一个问题,展示了如何将MAC地址作为字符串获取: 在.NET中从网络适配器读取MAC地址 然后从上述注册表键中获取Windows产品ID(以防他们没有网络适配器)。将两个字符串连接起来并对结果进行GetHashCode()(或使用您喜欢的哈希算法)。这是获取计算机UID的简单方法。
在安装程序执行时将哈希写入文件或注册表项,并在程序启动时进行检查。

2
考虑使用两个或多个值来识别计算机,例如:
  • Windows产品代码
  • C:驱动器的卷序列号
  • 以太网接口的MAC地址
如果其中一个值发生更改但其他值匹配,请在注册表中更新该值并继续正常运行。硬盘被替换(定期),Windows升级(偶尔),以太网适配器被替换(很少但确实会发生)。当旧软件因此停止工作时,这可能会非常令人沮丧。

+1 考虑软件的维护和长期使用。 - Nader Shirazie
2
好的建议,但请不要将任何内容硬编码到C盘。并不是所有的系统都有C盘。我的当前计算机从H盘开始。大型软件包可以很好地处理它,但通常小众软件程序在无法在C盘上执行它们所试图做的任何操作时会崩溃。 - Wouter van Nifterick

2
最基本的答案是,只要求软件安装程序安装后能运行,而在复制到其他计算机上时不能运行:
可以写一个简单的键值到注册表中,最好使用你产品的版本号。这样,如果他们将新版本复制到计算机上,就有不同的编号进行检查。
在软件中,确保该注册表键值存在即可。
在打包安装时,可以使用 NSIS,它具有向注册表写入简单方法。

0

这不是最安全的选项,但你说它不必聪明...

在安装时,您可以将程序变量设置为机器名称(或其哈希值,如果您喜欢)。

例如:

myProgram.Properties.Settings.Default.Machine = System.Environment.MachineName;
myProgram.Properties.Settings.Default.Save();

然后在启动时检查:

if (System.Environment.MachineName != myProgram.Properties.Settings.Default.Machine)
{
    MessageBox.Show("Can't run on this computer");
    this.Close();
}

0

我喜欢检查MAC地址的想法。

我也见过产品密钥/在线激活组合,您输入产品密钥,软件会联系一个Web服务记录产品密钥和安装数量。


-1
要让安装程序只适用于一台机器,你基本上必须为目标机器构建它。我认为不可能制作一个安装程序,假设它看到的第一台机器就是它的母亲,并永远附着在上面。

-2

您们公司坚持过时的许可限制政策是一种普遍不良的做法,因此我给出-1的评价。硬件加密锁和“设备检测”早在1990年代就已经落后了。

人们拥有多台计算机。他们购买新的计算机。他们升级他们的计算机。计算机出现故障,导致更换主板或网络卡。

在您们的设计下,所有这些都意味着诚实且付费的客户将无法使用他们所支付的软件,并且必须致电您们以“重置”激活。

每次这样做,您的开销都会增加,很可能远高于许可证的实际成本。

我并不建议您放弃,并直接将应用程序发送到 torrentverse,但您应该思考更具创造性的方式,以允许客户自由使用其所支付的软件,同时保持支持成本低,并防止盗版。

一个创造性的解决方案是,在您的服务器上缓存用户的设置,并按照其序列号进行键控,每次应用程序启动并连接到网络时进行同步。

这将允许用户在笔记本电脑和台式机上安装应用程序,并且对客户来说实际上是一种增值的服务,因为他们的设置在设备之间进行同步。

但它积极地阻止用户分享他们的许可证密钥,因为这样做意味着他们将与每个盗版用户共享他们的设置,或者他们必须记住在打开或关闭应用程序时保持断开与互联网的连接。


@richard:从实际角度来看,即使不是出于许可证原因,允许某些类型的程序在移动后运行也是一个坏主意。当它们的配置信息丢失时,它们通常会崩溃或以其他方式失败,但实际上检测到并提供错误消息是理想的。@SnOrfus:-1,同上。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接