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