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

Pau*_*aul 5 windows licensing date

我有一个Windows/C++应用程序,其中包含一个硬编码的到期日期,以便发布到期并停止在特定日期运行,如2009年8月30日.

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

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

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

谢谢.

保罗

Dan*_*Dan 9

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


Tim*_*mbo 8

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

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

进一步改善到期机制就像此时游戏的复制保护一样.好的游戏无论如何都会出售,有些则不然.


Var*_*gas 7

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

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

20090801:20090815:20090901
ca5579e3bacb7557b6ed22b5f553f9d5
Run Code Online (Sandbox Code Playgroud)

存在:

20090801 - the start date
20090815 - the last execution date
20090901 - the final date
ca5579e3bacb7557b6ed22b5f553f9d5 - the salted MD5 checksum
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用SHA-1或您喜欢的任何其他摘要算法.只要确保你使用一个不容易猜到的SecretSalt.

您可以检查LastExecutionDate当前日期以检查日期是否向后更改.