时间限制 【习题】
1、习题一 chap6-1-3-01 153K 每次20秒使用时间 易
2、习题二 chap6-1-3-02 15K 时间限制 ( 需cw3220.dll ) 易
这程序用上了SetTimer函数,设置断点:bpx
setimer,将中断如下: :0043D3DF 66837B2E00 CMP WORD PTR [EBX+2E],00 :0043D3E4 7433 JZ 0043D419 :0043D3E6 6A00 PUSH 00 ;处理定时过程的程序入口地址 :0043D3E8 56 PUSH ESI ;暂停时间值 (21 seconds) :0043D3E9 6A01 PUSH 01 ; 定时器ID 标识符 :0043D3EB 8B4328 MOV EAX,[EBX+28] :0043D3EE 50 PUSH EAX ; 句柄 :0043D3EF E8648FFCFF CALL USER32!SetTimer :0043D3F4 85C0 TEST EAX,EAX ; 时间是否到期? :0043D3F6 7521 JNZ 0043D419 ; 没到JMP ... ... :0043D419 33C0 XOR EAX,EAX 现在我们可修改:0043D3E4 一行,让其直接跳过SetTimer函数,这样就没时间限制了。 将: JZ 0043D419改成JMP 0043D419 66837B2E007433改成66837B2E00EB33即可。 |
这是个时间限制程序。 一运行程序,我注意到跳出一对话框,说:trial-period has ended,这对话是调用messagebox函数的,今天我们不用此函数设断,这程序肯定调用了取系统时间函数,这样才能判断当前时间是否过期。因此用GetLocalTime函数设断。 bpx GetLocalTime 中断如下: * Reference To: cw3220._getdate, Ord:0000h | :0040108A E83F040000 Call 004014CE ->GetLocalTime函数 :0040108F 59 pop ecx :00401090 817DF8CD070000 cmp dword ptr [ebp-08], 000007CD //这一行觉得熟吧,7CD的十进制是1997,而当前时间在EAX里,是07D0 // :00401097 7F0F jg 004010A8 ->如当前日期大于1997则出错。 剩下的工作太简单了,结束。 |