第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 消息:
或者在计数次数到达后不跳转: