這類軟件通常都有時間段的限制,例如試用30天等。當過了共享軟件的試用期後,就不予運行。只有向軟件做者付費註冊以後才能獲得一個無時間限制的註冊版本。這種保護的實現方式大體以下。函數
首先在安裝軟件的時候由安裝程序取得當前系統日期,或者主程序在第一次運行的時候得到系統日期,而且將其記錄在系統中的某個地方;可能記錄在註冊表的某個不顯眼的位置,也可能記錄在某個文件或扇區中。這個時間統稱爲軟件的安裝日期。工具
程序在每次運行的時候都要取得當前系統日期,且將其與記錄下來的那個安裝日期進行比較,當其差值超過容許的天數(好比30天)時就中止運行。操作系統
可見,這種日期限制的機理很簡單。可是在實現的時候,若是對各類狀況處理得不夠周全,就很容易被繞過,好比在過時以後簡單地把機器時間調回去,軟件又能夠正常使用了。軟件
若是考慮得比較周全,軟件最少要保存兩個時間值,一個就是上面所說的安裝時間,這個時間可由安裝程序在安裝軟件的時候記錄,也能夠在軟件第一次運行的時候記錄(即軟件發現該值不存在時就將當前日期做爲其值記錄下來)。爲了增長解密難度,最好把這個時間在不一樣的地方多存放幾份,不然解密者能夠經過RegMon、FileMon等監視工具輕易地找到存放該值的地方,而後刪除該鍵值,這樣又能夠正常使用軟件了。程序
另一個時間值就是軟件最近一次運行的日期,這是防止用戶將機器日期改回去而設的。軟件每次退出的時候都要將該日期取出來與當前日期相比較,若是當前日期大於該日期,則用當前日期替換掉該值,不然保持該值不變。同時,軟件每次啓動的時候要把該值讀出來與當前日期進行比較,若是該值大於當前系統日期,則說明用戶把機器時間改回去了,能夠拒絕運行。方法
取得時間的API函數通常有GetSystemTime、GetLocalTime和GetFileTime。軟件做者可能不直接使用上面的函數來得到系統時間,好比採用高級語言中封裝好的類來操做系統時間等。這些封裝好的類實際上也是調用上面的函數。解密者在採用動態跟蹤方法破解這種日期限制時,最經常使用的斷點也是這個。im
還用一種比較方便地得到當前系統日期的方法,就是讀取須要頻繁修改的系統文件(好比Windows註冊表文件user.dat、system.dat等)的最後修改日期,利用FileTimeToSystemTime()將其轉換爲系統日期格式,從而獲得當前系統日期。語言
須要指出的是,採用日期限制的軟件必須能防RegMon、FileMon之類的監視軟件,不然很容易被找到日期的存放位置。文件