轉貼:破解時間限制的老文章(二) (2千字)

看雪資料發表於2000-10-23

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

相關文章