我的破解心得(8) (2千字)

看雪資料發表於2001-03-13

破解程式:
    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"

相關文章