(1) 定時(shí)器 有些程序的試用版每次運(yùn)行都有時(shí)間限制,例如運(yùn)行10分鐘或20分鐘就停止工作,必須重新運(yùn)行該程序才能正常工作。這些程序里面自然有個(gè)定時(shí)器來(lái)統(tǒng)計(jì)程序運(yùn)行的時(shí)間。
1)使用Settimer()
常用的計(jì)數(shù)器是函數(shù)Settimer(),調(diào)用這個(gè)函數(shù)創(chuàng)建的定時(shí)器可以發(fā)出消息VM_TIMER,或者在定時(shí)期滿時(shí)調(diào)用一個(gè)回調(diào)函數(shù)。 使用這個(gè)函數(shù)會(huì)使時(shí)間延時(shí),精度不高。
2)使用timeSetEvent()
給Windows驅(qū)動(dòng)程序最精確的周期性通知是由Windows的多媒體服務(wù)timeSetEvent()提供的。它的時(shí)間可以精確到1毫秒。
3)使用VXD
可以使用VMM的Set_Global_time_Out()服務(wù)來(lái)迫使回調(diào)函數(shù)的幾個(gè)毫秒再執(zhí)行,這就創(chuàng)造了一個(gè)“只有一次”的定時(shí)器。VXD可以在回調(diào)中再次調(diào)用Set_Global_time_Out()來(lái)開(kāi)始下一個(gè)定時(shí)器,這樣提供了一個(gè)連續(xù)運(yùn)行的定時(shí)器了。
4)其它
GetTickCount():精度不高;
timeGetTime(): 可以以毫秒級(jí)返回windows開(kāi)始后的時(shí)間。
(2)時(shí)間限制
一般這類保護(hù)的軟件都有時(shí)間上的限制,如試用30天等,當(dāng)過(guò)了共享軟件的試用期后,就不予運(yùn)行,只有向軟件作者付費(fèi)注冊(cè)之后才能得到一個(gè)無(wú)時(shí)間限制的注冊(cè)版本。
這種類型程序很多,讓你有10天、20天、30天等,它們?cè)诎惭b時(shí),在你的系統(tǒng)某處做上時(shí)間標(biāo)記,每次運(yùn)行時(shí)用當(dāng)前系統(tǒng)時(shí)間和安裝時(shí)的時(shí)間比較,判斷你還否能使用。
如最典型的30天限制的一種情況:
mov ecx,1E ; 把1E (30天 十進(jìn)制) 放入 ecx
mov eax,[esp+10] ; 把用過(guò)天數(shù)放到eax
cmp eax,ecx ; 在此比較
jl ...
如碰到這種情況,只需把"mov eax,[esp+10]"改成"mov eax,1" 。
要記住當(dāng)前年份、月份的十六進(jìn)制的一些表示方法,如:2000年的十六進(jìn)制是07D0,然后用W32DASM反匯編你的程序,用查找字符串的方法找D007(在機(jī)器碼中位置顛倒了一下)或其它類似時(shí)間的數(shù)字,有可能會(huì)找到有價(jià)值的線索。你別小看這種方法,對(duì)那些沒(méi)怎么防范的程序,此招很有效。
如:一程序限定在2000年使用,可能有如下一代碼:
:00037805 817C2404D0070000 cmp dword ptr [esp+04], 000007D0 比較是否在2000年。
(3)與時(shí)間相關(guān)函數(shù)
1、GetSystemTime 得當(dāng)前系統(tǒng)時(shí)間
說(shuō)明:
在一個(gè)SYSTEMTIME中載入當(dāng)前系統(tǒng)時(shí)間,這個(gè)時(shí)間采用的是“協(xié)同世界時(shí)間”(即UTC,也叫做GMT)格式。
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // SYSTEMTIME,隨同當(dāng)前時(shí)間載入的結(jié)構(gòu)
);
2、GetLocalTime 得當(dāng)前本地時(shí)間
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime // SYSTEMTIME,用于裝載本地時(shí)間的結(jié)構(gòu)
);
3、SystemTimeToFileTime 根據(jù)一個(gè)FILETIME結(jié)構(gòu)的內(nèi)容,載入一個(gè)SYSTEMTIME結(jié)構(gòu)
BOOL SystemTimeToFileTime(
CONST SYSTEMTIME * lpst, // SYSTEMTIME,包含了系統(tǒng)時(shí)間信息的一個(gè)結(jié)構(gòu)
LPFILETIME lpft // FILETIME,用于裝載文件時(shí)間的一個(gè)結(jié)構(gòu)
);
返回值 :非零表示成功,零表示失敗。
4、SetTimer 創(chuàng)建一定時(shí)器,在指定時(shí)間內(nèi)暫停
UINT SetTimer(
HWND hwnd, // 時(shí)間信息句柄
UINT idtimer, // 定時(shí)器ID 標(biāo)識(shí)符
UINT uTimeout, // 暫停時(shí)間
TIMERPROC tmprc // 處理定時(shí)過(guò)程的程序入口地址
);
上一篇:軟件保護(hù)技術(shù)--警告(NAG)窗口
下一篇軟件保護(hù)技術(shù)--Key File保護(hù)
溫馨提示:
凡在本公司進(jìn)行電路板克隆業(yè)務(wù)的客戶,必須有合法的PCB設(shè)計(jì)版權(quán)來(lái)源聲明,以保護(hù)原創(chuàng)PCB設(shè)計(jì)版權(quán)所有者的合法權(quán)益;