第5章:演示版保护技术——时间限制

SetTimer() 函数

向系统申请一个计时器并指定计时器的时间间隔,同时获得一个处理器超时的回调函数,超时时系统会向申请计时器的目标窗口发送消息 WM_TIMER 

 

timeSetEvent() 函数

多媒体计时器,精度可以达到 1ms 

 

GetTickCount() 函数

返回从系统成功启动以来所经历的时间(ms),两次返回值相减即得程序运行时长

 

timeGetTime() 函数

多媒体计时器函数,同上

 

常用的获取时间的 API 函数有:GetSystemTime() , GetLocalTime() , GetFileTime() 

 

软件时间检测:

①安装软件时记录安装日期(存储在注册表、文件、扇区中),将当前时间与安装日期对比

②安装软件时记录安装日期,或第一次运行时记录日期,并将时间存储在多个地方;记录程序最近一次运行时的日期,与当前时间进行对比,并更新

③读取需要频繁修改的系统文件(比如,user.dat 、system.dat )的最后修改日期,利用 FileTimeToSystemTime() 函数将其转换为系统日期格式

 

在程序中看一下:

可以发现这个程序只调用了 DialogBoxParamA() 这个一个 API,重点关注第四个参数。和上个程序类似,直接转到该回调函数:

收到 WM_TIMER 消息,将数据

可以看到,它需要先执行 SetTimer() 函数,然后继续对时间进行检测,根据传入参数的值(EAX),判断要执行什么操作:

因此,这个程序存在漏洞,即程序处于调试状态时,只要没有处理到 WM_TIMER (0x 113)消息,则程序不会计时。

 

因此可以在 C6 直接跳转到 D6,跳过 SetTimer() ,如此不会收到 WM_TIMER 消息:

或者在计数次数到达后不跳转:

 

posted @ 2020-09-29 12:20  Rev_omi  阅读(159)  评论(0编辑  收藏  举报