如何让一个DLL在某一段时间内有效? 自己有个微代码库...公司要用到...不过不想永久给公司用..想弄个使用期限...怎么做???是一个DLL类库. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看雪学院中如是说: 3、时间限制 (1) 定时器 有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就停止工作,必须重新运行该程序才能正常工作。这些程序里面自然有个定时器来统计程序运行的时间。 1)使用Settimer() 常用的计数器是函数Settimer(),调用这个函数创建的定时器可以发出消息VM_TIMER,或者在定时期满时调用一个回调函数。 使用这个函数会使时间延时,精度不高。 2)使用timeSetEvent() 给Windows驱动程序最精确的周期性通知是由Windows的多媒体服务timeSetEvent()提供的。它的时间可以精确到1毫秒。 3)使用VXD 可以使用VMM的Set_Global_time_Out()服务来迫使回调函数的几个毫秒再执行,这就创造了一个“只有一次”的定时器。VXD可以在回调中再次调用Set_Global_time_Out()来开始下一个定时器,这样提供了一个连续运行的定时器了。 4)其它 GetTickCount():精度不高; timeGetTime(): 可以以毫秒级返回windows开始后的时间。 (2)时间限制 一般这类保护的软件都有时间上的限制,如试用30天等,当过了共享软件的试用期后,就不予运行,只有向软件作者付费注册之后才能得到一个无时间限制的注册版本。 这种类型程序很多,让你有10天、20天、30天等,它们在安装时,在你的系统某处做上时间标记,每次运行时用当前系统时间和安装时的时间比较,判断你还否能使用。 如最典型的30天限制的一种情况: mov ecx,1E ; 把1E (30天 十进制) 放入 ecx mov eax,[esp+10] ; 把用过天数放到eax cmp eax,ecx ; 在此比较 jl ... 如碰到这种情况,只需把"mov eax,[esp+10]"改成"mov eax,1" 。 要记住当前年份、月份的十六进制的一些表示方法,如:2000年的十六进制是07D0,然后用W32DASM反汇编你的程序,用查找字符串的方法找 D007(在机器码中位置颠倒了一下)或其它类似时间的数字,有可能会找到有价值的线索。你别小看这种方法,对那些没怎么防范的程序,此招很有效。 如:一程序限定在2000年使用,可能有如下一代码: :00037805 817C2404D0070000 cmp dword ptr [esp+04], 000007D0 比较是否在2000年。 (3)与时间相关函数 1、GetSystemTime 得当前系统时间 说明: 在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式。 VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // SYSTEMTIME,随同当前时间载入的结构 ); 2、GetLocalTime 得当前本地时间 VOID GetLocalTime( LPSYSTEMTIME lpSystemTime // SYSTEMTIME,用于装载本地时间的结构 ); 3、SystemTimeToFileTime 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构 BOOL SystemTimeToFileTime( CONST SYSTEMTIME * lpst, // SYSTEMTIME,包含了系统时间信息的一个结构 LPFILETIME lpft // FILETIME,用于装载文件时间的一个结构 ); 返回值 :非零表示成功,零表示失败。 4、SetTimer 创建一定时器,在指定时间内暂停 UINT SetTimer( HWND hwnd, // 时间信息句柄 UINT idtimer, // 定时器ID 标识符 UINT uTimeout, // 暂停时间 TIMERPROC tmprc // 处理定时过程的程序入口地址 ); UpdateLayeredWindow贴图效率问题(局部刷新) 新手求指导,有个错误解决不了,求帮忙 C# 用户名和密码的判断! datagrid中如何实现翻页,或滚条呀 ======> 急急急! 300元现金,求验证码识别程序,有现成案例,可供参考. c#中怎么用反射实现根据需求返回的类名来动态创建对像? FileInfo[]中的元素排序问题 想实现顺序比较的功能 SQL乱码,咋搞定..急死了~!~!~!~!~! log4net 代码配置时重复写入,怎么解决 急求.net 并口操作类,谢谢! 头疼 各位大侠 做前台做的好的帮忙整个吧。。
3、时间限制
(1) 定时器
有些程序的试用版每次运行都有时间限制,例如运行10分钟或20分钟就停止工作,必须重新运行该程序才能正常工作。这些程序里面自然有个定时器来统计程序运行的时间。
1)使用Settimer()
常用的计数器是函数Settimer(),调用这个函数创建的定时器可以发出消息VM_TIMER,或者在定时期满时调用一个回调函数。 使用这个函数会使时间延时,精度不高。
2)使用timeSetEvent()
给Windows驱动程序最精确的周期性通知是由Windows的多媒体服务timeSetEvent()提供的。它的时间可以精确到1毫秒。
3)使用VXD
可以使用VMM的Set_Global_time_Out()服务来迫使回调函数的几个毫秒再执行,这就创造了一个“只有一次”的定时器。VXD可以在回调中再次调用Set_Global_time_Out()来开始下一个定时器,这样提供了一个连续运行的定时器了。
4)其它
GetTickCount():精度不高;
timeGetTime(): 可以以毫秒级返回windows开始后的时间。
(2)时间限制
一般这类保护的软件都有时间上的限制,如试用30天等,当过了共享软件的试用期后,就不予运行,只有向软件作者付费注册之后才能得到一个无时间限制的注册版本。
这种类型程序很多,让你有10天、20天、30天等,它们在安装时,在你的系统某处做上时间标记,每次运行时用当前系统时间和安装时的时间比较,判断你还否能使用。
如最典型的30天限制的一种情况:
mov ecx,1E ; 把1E (30天 十进制) 放入 ecx
mov eax,[esp+10] ; 把用过天数放到eax
cmp eax,ecx ; 在此比较
jl ...
如碰到这种情况,只需把"mov eax,[esp+10]"改成"mov eax,1" 。
要记住当前年份、月份的十六进制的一些表示方法,如:2000年的十六进制是07D0,然后用W32DASM反汇编你的程序,用查找字符串的方法找 D007(在机器码中位置颠倒了一下)或其它类似时间的数字,有可能会找到有价值的线索。你别小看这种方法,对那些没怎么防范的程序,此招很有效。
如:一程序限定在2000年使用,可能有如下一代码:
:00037805 817C2404D0070000 cmp dword ptr [esp+04], 000007D0 比较是否在2000年。
(3)与时间相关函数
1、GetSystemTime 得当前系统时间
说明:
在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式。
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // SYSTEMTIME,随同当前时间载入的结构
);
2、GetLocalTime 得当前本地时间
VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime // SYSTEMTIME,用于装载本地时间的结构
);
3、SystemTimeToFileTime 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构
BOOL SystemTimeToFileTime(
CONST SYSTEMTIME * lpst, // SYSTEMTIME,包含了系统时间信息的一个结构
LPFILETIME lpft // FILETIME,用于装载文件时间的一个结构
);
返回值 :非零表示成功,零表示失败。
4、SetTimer 创建一定时器,在指定时间内暂停
UINT SetTimer(
HWND hwnd, // 时间信息句柄
UINT idtimer, // 定时器ID 标识符
UINT uTimeout, // 暂停时间
TIMERPROC tmprc // 处理定时过程的程序入口地址
);