注:GetTickCount( )的破解
X-win Pro 4.3的demon版有31分钟的时间限制.
在运行到第30分钟的时候,弹出一个对话框,告诉你只能再用1分钟.到第31分钟的
时候,又弹出一个对话框,告诉你已经没时间了,要你重新运行它.它已经销毁了它
所启动的所有窗口.
我的破解方法如下:
用softice symbol loader加载xserver.exe,按F5运行.等连上UNIX主机后,
用bpx messageboxa设置断点,然后出去玩半个小时(我是去逛书店了).
等30分钟过后,就发现进入了softice.按F11从MessageBoxA函数返回.
再按几下F10,经过一条ret指令后,就可以看见如下的程序段:
0041228D: CALL CS:[KERNEL32!GetTickCount]
MOV ECX,[0050D184]
MOV EBX,EAX
TEST ECX,ECX
JZ 004122D3
004122A0: CMP EAX,ECX
JLE 004122D3
MOV EDX,0000EA60
;60000毫秒=1分钟
MOV EBX,[0050D17C]
MOV EAX,[0050D174]
MOV [0050D184],ESI
CALL [0050D178]
;显示"只剩1分钟了"
CALL CS:[KERNEL32!GetTickCount]
;取时间
ADD EAX,0000EA60
;加上1分钟(60000毫秒)
MOV [0050D188],EAX
;保存起来
JMP 004122F8
004122D3: CMP EBX,[0050D188]
JLE 004122F8
MOV EBX,[0050D17C]
MOV EAX,[0050D174]
XOR EDX,EDX
;0分钟
CALL [0050D178]
;显示"剩下0分钟"
MOV DWORD PTR [0050D18C],00000001
004122F8: MOV EAX,ESI
POP ESI
POP EDX
POP ECX
POP EBX
RET
通过用softice改变程序执行流程,对上面的程序段进行分析,知道程序是这么
作的:
程序不断用GetTickCount( )得到系统时间(系统启动以来所经过的毫秒数),
和预定的值比较,看有没有到30分钟.到了30分钟的时候,先显示对话框,告诉你
只能再用1分钟了.然后用GetTickCount( )得到系统时间,将其加上60000,
也就是加上1分钟,保存在一个变量中.此后不断将GetTickCount( )返回的数和这
个变量比较,如果大于这个变量,就说明过了31分钟,就弹出个对话框,告诉你剩下
0分钟,然后销毁窗口.
如果让GetTickCount( )返回固定值,不就可以骗过它了吗?由于GetTickCount
返回值在EAX寄存器中,所以只需要把CALL CS:[KERNEL32!GetTickCount]这条
指令改为
MOV EAX,00000001
NOP
NOP
为了保险起见,我把上面的两条CALL CS:[KERNEL32!GetTickCount]都改了.
find: 2E FF 15 4C 71 52 00 8B 0D
replace: B8 01 00 00 00 90 90 -- --
find: 2E FF 15 4C 71 52 00 05 60 EA
replace: B8 01 00 00 00 90 90 -- -- --
由于30分钟时间很长,我只检验过一次,不知道还有什么bug.
当然也可以把30分钟改短点儿.