破解程式:
JPEG Optimizer Version 3.00 For Windows
破解工具:
SoftICE 3.0 For Windows 95
Ultra Edit 5.0
破解者:
chcw
JPEG Optimizer的註冊只需要輸入一個註冊碼即可,採用這種註冊方式的程式一般都比較容易破解。
1. 用SoftICE將JPEGOPT.EXE程式載入。
2. 選擇Help/Register開啟註冊對話方塊,並輸入註冊碼9530109。
3. 按Ctrl-D,進入SoftICE視窗中,由於程式通常要用hmemcpy函式將輸入註冊對話方塊的註冊碼複製到
程式自己的資料區中,因此我們就對hmemcpy設定斷點:
BPX hmemcpy
4. 按Ctrl-D,回到Jpeg Optimizer的註冊視窗中,按"OK"鍵,觸發SoftICE,執行光帶停留在函式
hmemcpy的啟始處:
KERNEL!HMEMCPY
0117:9E30 PUSH BP
從此處開始連續按F10鍵,直到跳出系統模組,回到程式Jpeg Optimizer中:
0137:00431D86 CALL 0044B2AC
0137:00431D8B MOV WORD PTR[EBP-28], 0008
0137:00431D91 MOV WORD PTR[EBP-28], 0020
5. 鍵入BC *清除原先的斷點。繼續按F10,直到以下語句處:
0137:00431DB2 LEA EAX, DWORD PTR [EBP-08]
鍵入dd ds:eax,得到ds:eax指標所指的資料:
013F:006EF5F4 00C1859C xxxxxxxx xxxxxxxx
xxxxxxxx
再鍵入db ds:00C1859C, 得到以下資料:
013F:00C1859C 39 35 33 30 31 30 39 xx
xx xx xx xx xx xx xx xx 9530109
看來eax是指向註冊碼RegCode的雙重指標,接下來的函式,很可能與註冊碼有關:
0137:00431DB5 CALL 004521FE
0137:00431DBA CMP EAX, 00000006
按F10,執行完0137:00431DB5 CALL 004521FE處的函式呼叫,發現EAX==7且呈高亮。回想我們輸
入的註冊碼的長度剛好為7,而在執行完上述呼叫之後,立即有一句比較語句CMP EAX, 00000006。
看來函式004521FE的功能是取得註冊碼的長度,而程式要求的正確的註冊碼的長度應該為6。
6. 在0137:00431DBA處雙擊滑鼠,設定斷點。然後按Ctrl-D,回到Jpeg Optimizer的註冊視窗,將註冊
碼改為六位數字530109,再按按"OK"鍵,觸發SoftICE,連續按F10,到0137:00431DC8處:
0137:00431DBA CMP EAX, 00000006
<-觸發SoftICE後亮條所在處
0137:00431DBD JNE 00431DD2
0137:00431DBF LEA EAX, DWORD PTR [EBP-04]
; eax是指向註冊碼RegCode的雙重指標
0137:00431DC2 CALL 00405DA4
; 取得RegCode的地址
0137:00431DC7 PUSH EAX
; eax是指向註冊碼RegCode的指標
0137:00431DC8 CALL 00432C4B
<-按F10直到此處
0137:00431DCD POP ECX
0137:00431DCE TEST AL, AL
; 判斷AL是否為0
0137:00431DD0 JNE 00431DD6
; 若不為0,則跳轉。
7. 注意到在執行0137:00431DC8處的呼叫CALL 00432C4B後,根據返回值的不同,程式將進行跳轉,所以有必要
分析一下子函式0137:00431DC8。按F8,進入此函式,然後連續按F10鍵:
0137:00432C4B PUSH EBP
; 程式入口點
...
0137:00432C8A PUSH EAX
; 將RegCode[0]地址壓棧
0137:00432C8B CALL 004787B8
; 將RegCode[0]轉換為大寫,並放在EAX中返回
0137:00432C90 POP ECX
0137:00432C91 CMP EAX, 0000005A
; RegCode[0]=='Z'?
0137:00432C94 JNE 00432CDA
; 不是則跳轉
.
.
.
0137:00432CC1 MOVSX ECX, BYTE PTR [EBP-03]
; 將RegCode[5]地址壓棧
0137:00432CC5 CMP ECX, 00000031
; RegCode[5]=='1'?
0137:00432CC8 JNE 00432CDA
; 不是則跳轉
很顯然,從0137:00432C91到0137:00432CC8的一段比較/跳轉語句就是程式在比較註冊碼,將每個比較語句
中判斷的16進位制碼收集起來是:
5A 49 31 37 38 31
用UltraEdit轉換一下就得到註冊碼的ASCII值:
RegCode="ZI1781"