開心鬥地主1.6標準版 註冊碼破解 (4千字)

看雪資料發表於2001-04-25

這幾天在研究Crack,為了研究VB PCode Crack方法,就找了這個
開心鬥地主的最新版本來試手。

    開心鬥地主1.6標準版,的確不錯,挺好完的。它的保護方法也挺
樂的。剛安裝上它的時候,你有30次使用次數,就為了保護這個次數
開心鬥地主也完了不少花招,登錄檔裡記錄的是沒用的,它在系統system
目錄下生成兩個檔案Olive.DLL和Coierd.CPL,其中以Coierd.CPL為主。
實際上Coierd.CPL是Olive.DLL的內容以ASC碼值儲存。一但發現這些資訊
不符,立即提示說非法註冊,好陰險哦。

    當然我們不會侷限於這種修改,現在我們就開始用工具來獲取真正的註冊碼。
先用fileinfo來檢查一下開心鬥地主是否加殼,哈哈,UPX V1.06幾個大字顯示眼前,
OK,UPX的-d選項來脫殼,好了,現在用W32Dasm來反彙編,看有沒有什麼收穫,
嗯,這個字串“UFO8769967”有點可疑,進入引用之處看看,啊喲,太多了,
引用它的地方太多了,算了,還是用TRW2000來對付它吧。

    OK,先把MSVBVM50.dll,複製到TRW200的DLL目錄下面,因為待會我們要用
rtcMsgBox來作斷點。執行TRW2000,提示已經Load MSVBVM50.dll,現在讀入
開心鬥地主,到註冊視窗,輸入註冊名,註冊碼,隨便了。我輸入Leafred及56376058,
按Ctrl+N到TRW2000,打入bpx rtcMsgBox,F5回到程式,按確定,被TRW2000中斷,
按F2,在按F10來到呼叫處,發現在XXXX:004C16D5,好,現在再來到W32Dasm,從
XXXX:004C16D5,向上讀,發現按鈕處理入口在XXXX:004C0100,好,現在重新以
bpm 004C0100 X,作斷點,重新註冊,現在進入了TRW2000,好,追蹤吧。

    拿好紙和筆,以下要耐心,並不時D EAX、D EDX等等,檢查什麼時候,讀取字元,什麼時候
進行比較。我在下面列出部分:

使用者名稱是否為空判斷===》:
017F:004C07C6  PUSH    EAX          ======== 》》  EAX 是我們輸入的使用者名稱。
017F:004C07C7  PUSH    DWORD 00440408 ====》》 為空
017F:004C07CC  CALL    `MSVBVM50!__vbaStrCmp`  =====》》這裡判斷輸入使用者名稱是否為空。
017F:004C07D2  NEG      EAX              ====》》 你可以試試,把返回值改掉,會彈出提示請輸入使用者名稱。
017F:004C07D4  SBB      EAX,EAX
017F:004C07D6  INC      EAX
017F:004C07D7  NEG      EAX
017F:004C07D9  MOV      [EBP+FFFFFEAC],AX
017F:004C07E0  LEA      ECX,[EBP-60]
017F:004C07E3  CALL    `MSVBVM50!__vbaFreeStr`
017F:004C07E9  LEA      ECX,[EBP-80]
017F:004C07EC  CALL    `MSVBVM50!__vbaFreeObj`
017F:004C07F2  MOVSX    ECX,WORD [EBP+FFFFFEAC]

判斷註冊碼是否為空===》:
017F:004C0A12  MOV      EDX,[EBP-60]
017F:004C0A15  PUSH    EDX            ======》》EDX 輸入的註冊碼。
017F:004C0A16  PUSH    DWORD 00440408
017F:004C0A1B  CALL    `MSVBVM50!__vbaStrCmp`
017F:004C0A21  NEG      EAX
017F:004C0A23  SBB      EAX,EAX
017F:004C0A25  INC      EAX
017F:004C0A26  NEG      EAX
017F:004C0A28  MOV      [EBP+FFFFFEAC],AX

其中某一判斷===》》:
017F:004C0F5D  MOV      EDX,[EBP-60]
017F:004C0F60  PUSH    EDX =======》》輸入的使用者名稱
017F:004C0F61  PUSH    DWORD 004433C0 =======》》比較雜亂五章的字元,其實很有用。
017F:004C0F66  CALL    `MSVBVM50!__vbaStrCmp`
017F:004C0F6C  NEG      EAX
017F:004C0F6E  SBB      EAX,EAX
017F:004C0F70  INC      EAX
017F:004C0F71  NEG      EAX
017F:004C0F73  AND      BX,AX
017F:004C0F76  MOV      EAX,[EBP-64]
017F:004C0F79  PUSH    EAX  =============》》 輸入的註冊碼。
017F:004C0F7A  PUSH    DWORD 004433D0 =======》》“http://ufocn.coc.cc”
017F:004C0F7F  CALL    `MSVBVM50!__vbaStrCmp`
017F:004C0F85  NEG      EAX
017F:004C0F87  SBB      EAX,EAX
017F:004C0F89  INC      EAX
017F:004C0F8A  NEG      EAX
017F:004C0F8C  AND      BX,AX
017F:004C0F8F  MOV      [EBP+FFFFFEA4],BX

此處對於破解非常重要====》:
017F:004C1373  MOV      ECX,[EBP-6C]
017F:004C1376  PUSH    ECX =======》輸入的使用者名稱
017F:004C1377  MOV      EDX,[EBP-68]
017F:004C137A  PUSH    EDX  ========》》一些字元。
017F:004C137B  CALL    `MSVBVM50!__vbaStrCmp`
017F:004C1381  NEG      EAX
017F:004C1383  SBB      EAX,EAX
017F:004C1385  INC      EAX
017F:004C1386  NEG      EAX
017F:004C1388  MOV      [EBP+FFFFFEA0],AX

十日註冊碼之處====》:
017F:004C15CE  MOV      EDX,[EBP-70]
017F:004C15D1  PUSH    EDX  =======》 輸入的註冊碼
017F:004C15D2  PUSH    DWORD 00442B78 ===》“UFO8769967”
017F:004C15D7  CALL    `MSVBVM50!__vbaStrCmp`
這裡如果我們讓他相等,則提示十日註冊成功。

由此可以看出我們在W32Dasm中看到的“UFO8769967”是十日註冊碼。

現在我們已經有了十日註冊碼,可以用一陣子了。

下面再來找標準註冊碼,
我們已經看到
017F:004C1373  MOV      ECX,[EBP-6C]
017F:004C1376  PUSH    ECX =======》輸入的使用者名稱
017F:004C1377  MOV      EDX,[EBP-68]
017F:004C137A  PUSH    EDX  ========》》一些字元。
017F:004C137B  CALL    `MSVBVM50!__vbaStrCmp`
017F:004C1381  NEG      EAX

現在肯定是不相等的,如果我們把這裡改為相等,會怎麼樣呢,哈哈,註冊成功。
但再執行時,有不行了。看來它每次重新比較。不過我們已經知道這裡時比較關鍵了,
我們再試試改註冊名和註冊碼,發現EDX裡的值只隨註冊碼而變化,這樣我們就可以
隨便輸入註冊碼,然後獲取註冊使用者,當然可以根據演算法來根據註冊名反算出註冊碼,
但我不想再去研究演算法了。OK,現在,以bpm 4c1373 X,為斷點,隨便輸入註冊碼,
輸入:547865,中斷後,執行到017F:004C137B,D EDX 發現了什麼Txe,現在重新執行
程式,輸入註冊名Txe,註冊碼547865,哈哈,發現什麼,恭喜、恭喜,註冊成功!!

相關文章