0

我想防止可执行文件被复制到另一台 PC,因此我需要以某种方式将信息保存在我的 EXE 文件中,说明它已经在另一台 PC 的其他地方使用过。

我可以在我的 EXE 文件中嵌入一小段信息,例如用户的硬盘驱动器号,以便在将此 EXE 复制到另一台 PC 时可以使用这些信息吗?

我想也许有一种方法可以读取和写入嵌入在 EXE 文件中的某些资源文件,但我认为资源文件是只读的,如果是这样,EXE 文件中有一个地方可以保存我需要的信息吗?

4

2 回答 2

3

你正在以这种方式打一场艰苦的战斗。创建一个本土的许可计划是可能的,但要准备好做很多工作(我做到了,所以我从第一手经验谈起)。只是一些需要解决的问题:

  • 如果硬盘驱动器出现故障并需要更换,您的用户将无法使用该程序。每次发生这种情况时,您都会接到一个愤怒的用户的支持电话。
  • 如果用户在虚拟机中运行您的程序,则硬盘序列号将不是唯一的 - 任何人都可以克隆虚拟机,现在您的程序可以在另一台机器上运行。
  • 可以更改硬盘驱动器序列号 - 它们并非直接来自硬件。
  • 如果硬盘驱动器是可移动驱动器怎么办?您的用户可以从可移动驱动器运行您的程序,然后继续将其移动到不同的机器上。
  • 即使你完成了,你如何保护许可证信息不被修改?

如果您真的想为您的产品授权,请查看现有的授权产品 - 它们并不便宜,但它们已经完成了(相当多的)工作,这些工作对于任何类型的可靠性都是必要的。

即使您只想获得最低限度的保护,请考虑这一点:您必须做很多工作才能使您的秘密令牌(无论是什么)获得最低限度的安全性。如果它的安全性最低,那么你做所有这些工作又有什么意义呢?如果你所做的只是强迫人们输入一个毫无意义的序列号,你只会惹恼你的诚实客户。如果有人想偷一些没有得到很好保护的东西,他们就会偷。一个“简单”的保护方案所做的只是让您的用户感到厌烦,并给您一种错误的保护感

我最终使用了Reprise RLM——我与这家公司无关,但我对他们的销售和支持人员有很好的体验,他们的产品在测试场景中运行良好。

于 2013-08-25T16:29:20.130 回答
2

好的,我分析了所有提出的变体,并决定在我的情况下开发自己的复制保护系统会更好,因为我是独立开发人员并且不会使用超大型应用程序。

以防万一,有人面临同样的问题 - 这是算法(嗯,其中之一):

  1. 用户启动APP1.EXE
  2. APP1.EXE 将自身读取到某个变量并在其末尾添加 HDD 序列号,例如 HDD 序列号 - 当您在末尾添加某些内容时,它不会破坏 EXE 文件,您不必担心 PE 头
  3. 不幸的是,EXE 无法在运行时保存自己,因此它保存了名为 APP2.EXE 的副本,其中包含有关 HDD 的信息
  4. 保存 APP2.EXE 后,APP1.EXE 通过 Process.Start() 将其作为单独的进程启动并自行终止
  5. 现在 APP2.EXE 正在运行并且与 APP1.EXE + 硬盘序列号具有相同的内容,所以我们只需将 APP2.EXE 中的所有字节写回 APP1.EXE,关闭当前进程并重新启动 APP1.EXE
  6. 从现在开始,APP1.EXE 正在运行并且拥有有关当前硬盘的所有所需信息,因此每次用户启动 APP1.EXE 时,它都会将其内容末尾的硬盘编号与用户 PC 上的实际编号进行比较,如果它们不同 - 终止进程
  7. 删除 APP2.EXE,这样用户就不会意识到这些文件如何交换有关他的 HDD 的信息。

可以在这里找到有关自删除 EXE 的有用信息:

PS 我知道这就像一个巨大的安全漏洞(我不会全部提及),但是这个算法的实现只需要 20 行 C# 代码,并被移动到一个单独的 DLL 中,我可以在任何地方使用它并且它可以工作。上面的算法中没有任何注册,用户可以简单地拿走这个应用程序并使用它,我相信大约 80% 的人不会意识到这个应用程序是如何防止复制的。

实施链接:https ://bitbucket.org/artemiusgreat/examples/src/ef7b60142277?at=master

于 2013-08-28T20:17:05.460 回答