注: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分鐘改短點兒.