我想提供我的软件的试用版。此版本只应在特定时间段内进行评估。我们只说2011年1月。
由于该软件在处理过程中大量使用系统时钟,因此将时钟设置为较早的时间以便能够反复使用它会非常烦人。因此,我没有想到更复杂的保护机制。
所以我考虑过如下测试后退出:
if (DateTime.Now.Year != 2011 && DateTime.Now.Month != 1)
{
MessageBox.Show("expired!");
Application.Exit();
}
这有多容易破解:-)?
有没有“安全”的方法来做到这一点?
答案 0 :(得分:5)
基本上,你可以说,不可能可以确保试用软件免受破解。您在软件中所做的一切都可以被绕过(是的!甚至是Ring-0驱动程序)。
即使您有一个外接加密狗,您可以通过软件欺骗您开始进行身份验证。虽然这并不容易: - )
你只能让事情变得困难: - )
答案 1 :(得分:5)
这与破解它并不完全相关,但值得注意的是,如果这是一款可以在国际上使用的应用程序,那么在它们甚至有机会尝试之前,它会显示为许多用户“已过期”一点都不DateTime返回的值反映了本地用户文化,因此DateTime.Now.Year
为阿拉伯文化返回1431,为泰国文化返回2553。月份也可能有所不同,因此,如果不先检查文化,就不应对它们进行硬编码。
每次使用InvariantCulture都可以解决这个问题,例如。 DateTime.Now.Year.ToString(System.Globalization.CultureInfo.InvariantCulture);
答案 2 :(得分:1)
如果用户将其计算机设置为2009年,则此方法可能会被破解:您的软件将在其他两年内使用。
如果您想使用此方法,我认为最好的方法是检查互联网上的实际日期。 但是有些用户无法连接;在这种情况下,您可以使用类似倒计时的东西,使软件可执行n天。
显然,计数器将是另一个加密文件,而对于另一个文件,您必须检查其状态(损坏或删除)。
答案 3 :(得分:1)
这是我的意见。 任何时间限制或加密狗保护的弱点是最终必须用'if'语句检查所有内容。在旧的'x86天,有JNE,JE,JNZ系列指令。这种“if”语句必须在应用程序中存在数百个(如果不是数千个或更多)。因此,任何破解者必须找到从哪里开始寻找,例如,加密狗检查器几乎总是使用DeviceIoControl API,这可以快速精确定位。在发现对DeviceIoControl API的调用之后,破解者只是围绕API调用反向设计了例程,并尝试将JNE指令更改为JE或其他方式。 在您的情况下,DateTime的使用是告诉(但当然,有很多地方将DateTime用于其他事情,这使得它对于破解者来说更难)。为了使饼干变得困难,将当前日期复制到某个对象的值,并尝试制作20个存储DateTime的地方。或者甚至更好,从网络和当前计算机检索当前日期。不要直接检查DateTime,而是使用之前存储在某些对象中的值,以使黑客更难。使用一致性检查机制确保日期在容差范围内,如果发现日期时间中的2个与另一个存储日期时间不同,则终止应用程序(给予2天容差等)。 如果您发现CurrentDateTime<同时检查时钟是否未被用户转回。 StoredDateTimeInRegistry然后你应该在注册表中的某处存储一个kill标志。或者您可能还想使用除注册表之外的文件。 对于你做的各种检查,尝试在许多地方以不同的方式进行检查。 最后,我必须说Bigbohne所说的是真的(没有什么是不可能破解的) - 只是通过让破解者难以改变他/她的努力成果比率,并希望劝阻他从继续破裂过程。
答案 4 :(得分:0)
在C#代码中检查试用期到期很容易破解,即使您将代码混淆由于它被编译到CLR中也是如此。最好将此检查执行编译为字节代码的代码。您还可以阅读有关保护.NET代码免受逆向工程的主题Protect .NET code from reverse engineering?
答案 5 :(得分:0)
软件许可本身就是一个完整的主题,看起来您正在为您的试用软件寻找最简单的解决方案。
您可以做什么,在启动应用程序时,在注册表中记录当前日期/时间并使用它作为验证的参考点。因此,即使系统时间发生变化,也不会影响应用程序验证逻辑。
如果可能的话,用C ++编写注册表访问库,这是不可能破解的。祝你好运。