另一途径——不许增加。 (1千字)
它的过期限制不是什么试用30天之类的,而是记录运行总时间并限制它不能超过一小时。所以在什么GETSYSTEMTIME、GETLOCALTIME、GETFILETIME等函数上下断点都对其无效(因为它根本就没用到),何况它自身是被WINAMP定时频繁调用的,WINAMP会把时间信息作为参数传递给它,因此它内部也不用什么GETTICKCOUNT之类的函数。——这种插件分析起来的难点就是难以找到时间递增代码,时间的比较代码倒是好几处,查出错信息就能找到,只是数量多(其实也不多,才四五个吧),难免挂一漏万,还是跳过时间递增代码比较保险。倒霉的就是这种判断运算等全是浮点指令,不懂就只有猜,耽搁了不少时间。另外WINAMP在关闭时会通过这个插件把已经运行的时间秒数写入注册表,而且其值是浮点四字节格式,名称又是什么PARAM,很容易迷惑人。其实了解它的限制原理后,用BPM断点就能很快找到这段代码:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10002860(C)
|
:1000286A D905BC940110 fld dword ptr [100194BC]
:10002870 D81D08400110 fcomp dword ptr [10014008]
//[10014008]处是浮点数3600,也就是一小时。
:10002876 DFE0 fstsw ax
:10002878 F6C401 test ah, 01
:1000287B 7508 jne 10002885
//把这句话修改成JNE 10002897,也就是把7508改成751A。
:1000287D 8B4510 mov eax, dword ptr [ebp+10]
:10002880 E934050000 jmp 10002DB9
就是下面这里增加时间计数:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000287B(C)
|
:10002885 DB4510 fild dword ptr [ebp+10]
:10002888 DA751C ffidiv dword ptr [ebp+1C]
:1000288B D805BC940110 fadd dword ptr [100194BC]
:10002891 D915BC940110 fst dword ptr [100194BC] //增加的时间计数写回[100194BC]
:10002897 D81D08400110 fcomp dword ptr [10014008] //让其直接跳到此处,也就是不增加时间计数了。
:1000289D DFE0 fstsw ax
:1000289F F6C401 test ah, 01
:100028A2 7515 jne 100028B9
至于NAG窗口,DEMO字串等的消除,我也懒得去跟了。——DEMO字串消除也就查找字串换成空格就行。
