软件时间限制的原理[转]
這類軟件一般都有時間段的限制,例如試用30天等。當過了共享軟件的試用期后,就不予運行。只有向軟件作者付費注冊之后才能得到一個無時間限制的注冊版本。這種保護的實現方式大致如下。
首先在安裝軟件的時候由安裝程序取得當前系統日期,或者主程序在第一次運行的時候獲得系統日期,并且將其記錄在系統中的某個地方;可能記錄在注冊表的某個不顯眼的位置,也可能記錄在某個文件或扇區中。這個時間統稱為軟件的安裝日期。
程序在每次運行的時候都要取得當前系統日期,且將其與記錄下來的那個安裝日期進行比較,當其差值超過允許的天數(比如30天)時就停止運行。
可見,這種日期限制的機理很簡單。但是在實現的時候,如果對各種情況處理得不夠周全,就很容易被繞過,比如在過期之后簡單地把機器時間調回去,軟件又可以正常使用了。
如果考慮得比較周全,軟件最少要保存兩個時間值,一個就是上面所說的安裝時間,這個時間可由安裝程序在安裝軟件的時候記錄,也可以在軟件第一次運行的時候記錄(即軟件發現該值不存在時就將當前日期作為其值記錄下來)。為了增加解密難度,最好把這個時間在不同的地方多存放幾份,否則解密者可以通過RegMon、FileMon等監視工具輕易地找到存放該值的地方,然后刪除該鍵值,這樣又可以正常使用軟件了。
另外一個時間值就是軟件最近一次運行的日期,這是防止用戶將機器日期改回去而設的。軟件每次退出的時候都要將該日期取出來與當前日期相比較,如果當前日期大于該日期,則用當前日期替換掉該值,否則保持該值不變。同時,軟件每次啟動的時候要把該值讀出來與當前日期進行比較,如果該值大于當前系統日期,則說明用戶把機器時間改回去了,可以拒絕運行。
取得時間的API函數一般有GetSystemTime、GetLocalTime和GetFileTime。軟件作者可能不直接使用上面的函數來獲得系統時間,比如采用高級語言中封裝好的類來操作系統時間等。這些封裝好的類實際上也是調用上面的函數。解密者在采用動態跟蹤方法破解這種日期限制時,最常用的斷點也是這個。
還用一種比較方便地獲得當前系統日期的方法,就是讀取需要頻繁修改的系統文件(比如Windows注冊表文件user.dat、system.dat等)的最后修改日期,利用FileTimeToSystemTime()將其轉換為系統日期格式,從而得到當前系統日期。
需要指出的是,采用日期限制的軟件必須能防RegMon、FileMon之類的監視軟件,否則很容易被找到日期的存放位置。
總結
以上是生活随笔為你收集整理的软件时间限制的原理[转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《原神》波光粼粼的回忆任务触发完成攻略
- 下一篇: 第十八天