我有一块视窗/ C ++应用程序,它包括一个硬编码有效期限,使得释放期满并停止在某个日期运行2009年8月30等的。
显然,用户可以收回系统时间来解决此限制。
有没有好的办法阻止我的应用程序,如果该日期已过,即使用户已经将系统日期向后运行?
PS我不能使用用于此目的的互联网连接。 我相信写的最后执行时间到文件/注册表也将是太容易折断。
谢谢。
保罗
我有一块视窗/ C ++应用程序,它包括一个硬编码有效期限,使得释放期满并停止在某个日期运行2009年8月30等的。
显然,用户可以收回系统时间来解决此限制。
有没有好的办法阻止我的应用程序,如果该日期已过,即使用户已经将系统日期向后运行?
PS我不能使用用于此目的的互联网连接。 我相信写的最后执行时间到文件/注册表也将是太容易折断。
谢谢。
保罗
不管你做什么都会被破解,所以你最好专注于您的软件,而不是保护。 把事情简单化。 如果人们决心摆脱你保护他们的意志。 他们甚至可以虚拟机,所以当天的审判是不是真的可以强制执行的限制。
为了让过期日期比较难一点,以避免,你可以存储最近执行的地方“隐藏”的时间并确保用户不能及时返回。 任何像样的“黑客”会解决这个问题,但对于乔普通用户就太麻烦了。
使用依赖于正确的日期/时间等程序时使用错误的日期工作有一些不好的副作用。 因此,当用户足够绝望的他每次启动软件的时间来改变他的日期/时间,他不会买它呢?
改善到期机制进一步就像是在这一点上的游戏拷贝保护。 好游戏反正卖,不好的不要。
您可以将存储的第一和最后执行日期在文件中还存储它的盐渍校验。 作为@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文件,只是为了避免“更改日期”的把戏。
在这种情况下,申请到期时你可以在系统中的一些变化。 换句话说获取所有正在运行的系统日期,而不是系统的变化应该有应用。
当它被过期,您可以添加注册表项。 或者可以是文件的删除。
这是我一个解决问题呈三角发起的previoud讨论。 这将是可能有用的..
许可