我有一个Windows / C ++应用程序,其中包含一个硬编码的到期日期,因此该版本将在特定日期到期并停止运行,例如2009年8月30日。
显然,用户可以收回系统时间来解决此限制。
如果日期已经过去,即使用户已将系统日期恢复,有没有一种方法可以停止我的应用程序运行?
P.S。我不能为此目的使用互联网连接。我认为将最后一次执行时间写入文件/注册表也很容易破解。
感谢。
保
答案 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问题的预先讨论。它可能会有用..
答案 4 :(得分:2)
您可以尝试存储(在代码内,而不是在文件中)到期日期md5summed,这可能会为反汇编程序添加更多“保护”。 在其他一些关键函数中隐藏日期检查代码,不要写一个特定的函数来做它。 您也可以在到期时编辑exe文件,以避免“更改日期”技巧。