在试用期满后禁用申请

时间:2013-12-19 18:24:15

标签: c++ c windows security

我正在为半信任的客户编写一个简单的应用程序,并且对某些细节没有发言权。必须为客户端提供二进制文件myTestApp的副本,该副本使用外部库libsecrets中的专有代码。它是一个Windows应用程序,可以在几台独立的Windows 7笔记本电脑上运行。我被告知,在应用程序达到其目的后,它将被删除。我知道没有完美的解决方案,但是我希望在程序中实现一个到期日期,并阻碍对代码进行反向工程的努力,或者至少防止libsecrets的内容被暴露容易。

因此,我的第一步是将myTestApp静态链接到libsecrets,以便所有内容都包含在一个二进制文件中,因此只有最终二进制文件中包含libsecrets所需的部分,并且它的界面不再发布。

其次,我想实现一些不天真的getTime机制。 Windows中是否有任何“安全”getTime调用,因此不能通过更改系统托盘或BIOS中的时间来欺骗它?

第三,如果没有“安全”getTime调用,我也可以修改myTestApp以使用NTP查询受信任的时间服务器,如果无法从中获取时间则失败或试用期已过。但是,除非有某种证书机制来验证时间服务器,否则这可能会被网关上的DNS搞乱所愚弄。我对此并不了解,并且需要一些关于如何实现它的建议。

接下来,有没有办法改变二进制文件,以便个人尝试通过查看汇编代码对其进行逆向工程是不切实际的?也许是某种加密二进制文件并需要第三方认证工具的包装器?或者也许我创建的某种证书需要运行它并在以后过期?

最后,是否有任何软件(即:打包或发布软件)可以通过重新打包最终.exe或作为某种类型的Microsoft Visual Studio插件来为我做到这一点?

提前谢谢大家。


编辑:这不是一个防弹系统,如果失败,那是可以接受的。我只是想让一个非技术人员试图破解它不方便。使用它的人是技术Luddites,软件破解的唯一方法是他们雇用某人来做。由于名称和公司名称被加水印到应用程序中,并且只有一个人可以从其使用中受益,因此他们不太可能重新分发它。

3 个答案:

答案 0 :(得分:4)

你不能让事情变得安全,但你可以使事情变得困难(呃)。

使用UPX打包会增加黑客的某种程度的复杂性。

如果您在多个地方的调试器下运行,或者如果您在虚拟机下运行,则可以在运行时检查。

您可以加密正在使用的DLL并手动加载(复杂)。

您可以编写一个加载程序来检查应用程序的哈希值,并且您的应用程序可以检查加载程序的哈希值。

您可以获取系统时间并将其与您已写入磁盘的系统时间进行比较,并确定它是单调的。 一切都取决于你想要的保护水平。

如果你去PirateBay或任何其他种子网站,你会发现如果黑客感兴趣,一切都会被黑客入侵。

答案 1 :(得分:1)

有一种方法可以让它们在到期后很难使用它。这个技巧的主题是使你的失效日期与系统时间无关,并使其取决于通过的小时数,无论系统时间如何。

您必须创建一个单独的线程来执行此任务。

假设您希望应用程序在使用70小时后过期。

创建一个名为“record”的二进制文件,并在其中存储任何数字,这很难猜到(我会告诉你为什么必须将这个数字放在二进制文件中)。

当您的应用程序启动时,它会检查该号码是否存在,如果是,您的应用程序应获取当前时间,并将其与hour = 1(替换已存在的号码)一起存储在该文件中,并将该线程创建时应继续检查系统时间中的小时是否已更改,当它更改该文件中的存储当前时间以及小时= 2时。小时= 70时会到来。

在该线程内的两个位置以及应用程序的开头添加此代码

/*the purpose of storing current time is to find out later if hour has changed or not*/
/*read hour from file.*/
if(hour==70)
{
    cout<<"Your trial period has expired"<<endl;
    return EXIT_SUCESS;  
}  

现在,当小时= 70时,应用程序将无效。

之前我告诉过你要保留二进制文件中的任何数字,当他们运行你的应用程序时,将读取二进制文件,如果找到那个数字,你的应用程序将用当前时间和小时= 1替换它,现在假设他们使用你的应用程序5个小时并关闭它并在一段时间后运行它,现在当你的应用程序运行时它将检查该二进制文件,如果该数字已经被先前存储的时间替换而且小时= 5则意味着现在你将必须将当前时间与小时=存储小时存储在文件+1中; 。即使他们改变时间或做任何其他事情,它也不会影响你的有效期。因为现在您的到期检查不再基于系统时间,现在它基于通过的小时数,无论时间如何。

缺少该数字表示第一次没有访问文件,文件中当前存在的小时应该递增,并使用二进制文件,以便客户端看不到该号码。

最后一件事 你的二进制文件的格式应该是这样的

current time, hour="any number", another_secret_number

将放置another_secret_number,以便即使他们如何更改你的二进制文件,他们也无法将那个another_secret_number放在那里,因为他们不知道它。这意味着在读取二进制文件时,您必须确保二进制文件中任何条目的末尾都包含“another_secret_number”。

为了检查目的,隐藏的数字也将在你的代码中被硬编码,这肯定是他们看不到的,他们也无法读取二进制文件,所以他们无法知道它们。

我希望它会对你有所帮助。

答案 2 :(得分:0)

没有什么可以阻止黑客! 你的问题就像在干草上的搜索针。 大会是回应的大空间。 你可能只有工作,没有,永远不会阻止'坏'的人。

  • 对于UPX:众所周知,不要使用它!