我的破解心得(1) (3千字)

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

說明:這是我以前寫的心得,貼在這裡,請大家指正。

破解物件:
  IrfanView32

破解工具:
  W32Dasm 8.5(或更高版本)
  Hacker View 5.6(或更高版本)

破解者:
  chcw

IrfanView32是一個免費軟體,程式作者沒有花什麼力氣來對付Cracker,故較適合
初學Crack的人練習用。

1. 執行IrfanView32。
2. 選擇About/Registration, 隨便輸一個name和code, 如
  name=chcw, code=9530109。
3. 一般來說,你的註冊碼當然是錯誤的(除非你的運氣特別好,剛好給你碰對了)
  程式將顯示一個訊息框, 內容是"Incorrect registration!"。記下該資訊後,
  退出IrfanView32。
4. 執行W32Dasm, 將I_view32.exe反彙編。
5. 反彙編結束後,選擇W32Dasm選單Refs/String Data References, 從列表框中
  找出字串"Incorrect registration!", 選中後用滑鼠雙擊,W32Dasm將把亮
  條定位在反彙編程式碼中訪問到該字串的程式碼行上。
6. 關閉字串列表對話方塊,我們來看一下亮條處的程式碼:
                    ...    
:0041A733 E8C868FEFF              call 00401000
:0041A738 83C408                  add esp, 00000008
:0041A73B 85C0                    test eax, eax
:0041A73D 751B                    jne 0041A75A
                    ...                            
* Possible StringData Ref from Data Obj ->"Incorrect registration !"
                                  |
:0041A74F 68A0E24700              push 0047E2A0      <-亮條所在處
:0041A754 51                      push ecx
:0041A755 E9FEFDFFFF              jmp 0041A558

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041A73D(C)
                             
:0041A75A 8B354C754900            mov esi, dword ptr [0049754C]

  從亮條所在處往上找,可以發現在0041A73B處有一條test eax,eax語句,它
後面的jne語句是eax為非零值時,跳轉到0041A75A處,正好跳過了對字串
"Incorrect registration !"的引用。而在test語句前有一個call 00401000調
用。因此,00401000很可能就是一個對註冊碼進行檢查的函式,當註冊碼合法時
返回非零值,否則返回零,並顯示錯誤資訊。將亮條移到:0041A733 call 00401000
語句處,亮條呈亮綠色。按工具欄上的"Call"按鈕進入該子程式。在子程式ret
語句前有下面幾條語句:

:00401280 3BE8                    cmp ebp, eax
        ...
:00401284 0F94C1                  sete cl
        ...    
:00401288 8BC1                    mov eax, ecx
        ...
:0040128E C3                      ret

  可見,如果猜想正確,那麼我們只需要將00401284處的sete cl語句改為
setne cl,就可以使註冊成功。

7. 在W32Dasm中,將亮條移到00401284的jne語句處,此時在W32Dasm反彙編視窗
的狀態行中將顯示@Offset 00000684h in File:I_view32.exe, 記下這個偏移地
址。
    
8. 將I_view32.exe備份,執行Hiew I_view32.exe,按F4鍵(Mode),選擇Decode
模式,再按F5鍵(Goto), 輸入偏移地址684,Hiew將定位到偏移684處:

.00401284 0F94C1          sete cl

9. 現在我們將這條語句改為setne cl,按F3鍵(Edit),輸入0F95(setne的機器碼)
將原先的0F94(sete的機器碼)覆蓋,此時我們可以看到機器碼右部的彙編程式碼也發生
了相應的變化。再按F9鍵(Update),儲存所作的修改,退出Hiew。

10. 執行I_view32.exe, 隨便輸入一個註冊碼(如Name="chcw",Code="9530109")選
擇"OK",程式顯示"Register Successful",再到About/About IrfanView中,可以看
到原先的registered to You字樣改成了registerd to chcw。註冊成功了!
    在修改過I_view32.exe之後,如果你輸入了正確的註冊碼,程式反而會提示
"Incorrect registeration"。

11. 有人也許會想,能不能將呼叫檢測函式00401000之後的語句0041A73D jne 0041A75A
改為je或jmps語句,從而達到相同的效果呢?回答是否定的。的確,很多軟體都可以在
檢測函式之外的跳轉處Patch,而且這樣做一般來說更為安全,但是IrfanView32卻是例外。
IrfanView32相當狡猾,它在程式啟動時、註冊時和顯示About IrfanView32對話方塊時都會
反覆呼叫00401000函式檢驗註冊的正確性。所以直接改動檢測函式也許更為合理一些。

相關文章