如何使软件在Windows上的某个特定日期到期?

时间:2009-07-31 10:29:42

标签: windows date licensing

我有一个Windows / C ++应用程序,其中包含一个硬编码的到期日期,因此该版本将在特定日期到期并停止运行,例如2009年8月30日。

显然,用户可以收回系统时间来解决此限制。

如果日期已经过去,即使用户已将系统日期恢复,有没有一种方法可以停止我的应用程序运行?

P.S。我不能为此目的使用互联网连接。我认为将最后一次执行时间写入文件/注册表也很容易破解。

感谢。

5 个答案:

答案 0 :(得分:9)

无论你做什么都会破解,所以你最好专注于你的软件而不是保护。把事情简单化。如果人们决心绕过你的保护,他们会。他们甚至可以虚拟机器,因此日间试验并不是一个可以强制执行的限制。

答案 1 :(得分:8)

为了使到期日期更难以避免,您可以将最近执行的时间存储在“隐藏”的某个位置,并确保用户无法及时返回。任何体面的“黑客”都会解决这个问题,但对于普通用户而言,这将是一件很麻烦的事情。

使用其他依赖正确日期/时间的程序时,使用错误的日期会产生一些不良副作用。因此,当用户每次启动软件时都非常渴望改变他的日期/时间时,他也不会购买它......

进一步改善过期机制就像游戏的复制保护一样。好的游戏无论如何都会出售,坏的游戏则不然。

答案 2 :(得分:7)

您可以将第一个和最后一个执行日期存储在一个文件中,并存储一个盐渍校验和。正如@Timbo所说,任何体面的黑客都会解决这个问题(正如他几乎任何其他方法一样)。

像这样,你可以在任何地方(可能在寄存器中)存储这样的东西

20090801:20090815:20090901
ca5579e3bacb7557b6ed22b5f553f9d5

成为:

20090801 - the start date
20090815 - the last execution date
20090901 - the final date
ca5579e3bacb7557b6ed22b5f553f9d5 - the salted MD5 checksum

这样你可以使用像这样的算法检查校验和的有效性

bool CheckExpiry()
{
    string SecretSalt = "Y*##d3F!@g^hk";
    string InitialDate = FetchInitialDate();
    string LastExecutionDate = FetchLastExecutionDate();
    string FinalDate = FetchFinalDate();
    int Checksum = FetchChecksum();

    string FinalString = InitialDate + ":" + SecretSalt + ":" + LastExecutionDate + ":"  + FinalDate;
    int InternalCheckSum = md5sum( FinalString );

    return InternalCheckSum == CheckSum;
}

当然您可以使用SHA-1或您喜欢的任何其他摘要算法。请确保使用不易猜测的SecretSalt

您可以针对当前日期检查LastExecutionDate以检查日期是否已向后更改。

答案 3 :(得分:2)

在这种情况下,您可以在应用程序到期时对系统进行一些更改。换句话说,为了使应用程序运行系统日期而不是系统更改应该在那里。

您可以在过期时添加注册表项。或者可能是删除文件。

这是我提出的解决simillar问题的预先讨论。它可能会有用..

Licensing

答案 4 :(得分:2)

您可以尝试存储(在代码内,而不是在文件中)到期日期md5summed,这可能会为反汇编程序添加更多“保护”。 在其他一些关键函数中隐藏日期检查代码,不要写一个特定的函数来做它。 您也可以在到期时编辑exe文件,以避免“更改日期”技巧。