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