这类软件一般都有时间段的限制,例如试用30天等。当过了共享软件的试用期后,就不予运行。只有向软件作者付费注册之后才能得到一个无时间限制的注册版本。这种保护的实现方式大致如下。
首先在安装软件的时候由安装程序取得当前系统日期,或者主程序在第一次运行的时候获得系统日期,并且将其记录在系统中的某个地方;可能记录在注册表的某个不显眼的位置,也可能记录在某个文件或扇区中。这个时间统称为软件的安装日期。
程序在每次运行的时候都要取得当前系统日期,且将其与记录下来的那个安装日期进行比较,当其差值超过允许的天数(比如30天)时就停止运行。
可见,这种日期限制的机理很简单。但是在实现的时候,如果对各种情况处理得不够周全,就很容易被绕过,比如在过期之后简单地把机器时间调回去,软件又可以正常使用了。
如果考虑得比较周全,软件最少要保存两个时间值,一个就是上面所说的安装时间,这个时间可由安装程序在安装软件的时候记录,也可以在软件第一次运行的时候记录(即软件发现该值不存在时就将当前日期作为其值记录下来)。为了增加解密难度,最好把这个时间在不同的地方多存放几份,否则解密者可以通过RegMon、FileMon等监视工具轻易地找到存放该值的地方,然后删除该键值,这样又可以正常使用软件了。
另外一个时间值就是软件最近一次运行的日期,这是防止用户将机器日期改回去而设的。软件每次退出的时候都要将该日期取出来与当前日期相比较,如果当前日期大于该日期,则用当前日期替换掉该值,否则保持该值不变。同时,软件每次启动的时候要把该值读出来与当前日期进行比较,如果该值大于当前系统日期,则说明用户把机器时间改回去了,可以拒绝运行。
取得时间的API函数一般有GetSystemTime、GetLocalTime和GetFileTime。软件作者可能不直接使用上面的函数来获得系统时间,比如采用高级语言中封装好的类来操作系统时间等。这些封装好的类实际上也是调用上面的函数。解密者在采用动态跟踪方法破解这种日期限制时,最常用的断点也是这个。
还用一种比较方便地获得当前系统日期的方法,就是读取需要频繁修改的系统文件(比如Windows注册表文件user.dat、system.dat等)的最后修改日期,利用FileTimeToSystemTime()将其转换为系统日期格式,从而得到当前系统日期。
需要指出的是,采用日期限制的软件必须能防RegMon、FileMon之类的监视软件,否则很容易被找到日期的存放位置。
最新评论