如何使软件在Windows上的某个date过期?

我有一个Windows / C ++应用程序,其中包括一个硬编码失效date,以便释放过期,并停止运行在某个date,如2009年8月30日。

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

如果date已经过去,即使用户已将系统date还过来,是否有一种很好的方法可以阻止我的应用程序的运行?

PS我不能为此使用互联网连接。 而且我相信把最后的执行时间写入文件/registry也是太容易打破了。

谢谢。

保罗

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

为了使截止日期更加难以避免,可以将最近执行的时间存储在“隐藏”的位置,并确保用户不能及时返回。 任何体面的“黑客”都会绕过这个,但是对于普通用户来说,这太麻烦了。

使用错误的日期在使用依赖于正确的日期/时间的其他程序时有一些不好的副作用。 所以,当用户急于每次启动软件时都要改变他的日期/时间,他就不会购买它了。

进一步完善到期机制就像游戏的复制保护一样。 好的游戏销售,坏的不是。

您可以将第一个和最后一个执行日期存储在一个文件中,并存储它的盐腌校验和。 正如@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 ,以检查日期是否向后改变。

你可以尝试存储(在代码中,而不是在文件中)到期日期md5summed,这可能会增加一些反汇编“保护”。 隐藏日期检查代码里面的其他一些关键功能,不要写一个特定的功能来做到这一点。 你也可以在到期时编辑exe文件,只是为了避免“更改日期”的伎俩。

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

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

这是我提出的一个类似问题的讨论。 这将是可能有用的..

许可