這幾天在研究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,哈哈,發現什麼,恭喜、恭喜,註冊成功!!