本人作品---夢龍智慧專案管理99A解狗教程(獻給對加密狗有興趣的朋友) (13千字)

看雪資料發表於2015-11-15

夢龍智慧專案管理99A破解過程

1.先下BPX CREATEFILEA,從MRUSE.DLL中返回到PERTWIN裡。
2.按F10走,當發現在執行某個CALL時有長時間的延持時,按F9在這個CALL上設斷。
3.重新執行一次,進入上面設斷點的那個CALL,按F10小心的走,注意段與段之間的跨越。

==<PART  A>=====================================


0167:00461E9D  PUSH    EBP
0167:00461E9E  MOV      EBP,ESP
0167:00461EA0  PUSH    BYTE -01
0167:00461EA2  PUSH    DWORD 0059DFD2
0167:00461EA7  MOV      EAX,[FS:00]
0167:00461EAD  PUSH    EAX
0167:00461EAE  MOV      [FS:00],ESP
0167:00461EB5  SUB      ESP,84
0167:00461EBB  MOV      [EBP+FFFFFF70],ECX
0167:00461EC1  PUSH    BYTE +00
0167:00461EC3  PUSH    DWORD 2710
0167:00461EC8  PUSH    DWORD 03E8
0167:00461ECD  MOV      ECX,[EBP+FFFFFF70]
0167:00461ED3  CALL    0054DC9D
0167:00461ED8  PUSH    BYTE +01
0167:00461EDA  PUSH    BYTE +01
0167:00461EDC  MOV      ECX,005EBAD8
0167:00461EE1  CALL    00463922
0167:00461EE6  MOV      [EBP-58],EAX //下BPX CREATEFILEA後從MRUSE.DLL中返回到
                                    //PERTWIN後游標會停在這裡。所以上面的那個
                                    //CALL 463922有延遲。
0167:00461EE9  LEA      EAX,[EBP-40]
0167:00461EEC  PUSH    EAX
0167:00461EED  MOV      ECX,005EBAD8
0167:00461FDF  PUSH    BYTE +00
0167:00461FE1  CALL    00548CCA
0167:00461FE6  PUSH    ECX
0167:00461FE7  MOV      ECX,ESP
0167:00461FE9  MOV      [EBP-6C],ESP
0167:00461FEC  LEA      EDX,[EBP-54]
0167:00461FEF  PUSH    EDX
0167:00461FF0  CALL    00548F64
0167:00461FF5  LEA      EAX,[EBP-70]
0167:00461FF8  PUSH    EAX
0167:00461FF9  LEA      ECX,[EBP-14]
0167:00461FFC  DB      E8
0167:00461FFD  JNO      0046206F
0167:00461EF2  CALL    00463CD3
0167:00461EF7  MOV      [EBP-58],EAX
0167:00461EFA  PUSH    BYTE +63
0167:00461EFC  MOV      ECX,005EBAD8
0167:00461F01  CALL    00463BFA  //用未破解過的MRUSE.DLL檔案時這裡會有很長時間
                                  //的延遲。但用解過的MRUSE.DLL檔案時不會。分析
                                //部分在PART D
0167:00461F06  MOV      ECX,[EBP+FFFFFF70]
0167:00461F0C  MOV      [ECX+C0],EAX
0167:00461F12  PUSH    BYTE +62
0167:00461F14  MOV      ECX,005EBAD8
0167:00461F19  CALL    00463BFA
0167:00461F1E  MOV      EDX,[EBP+FFFFFF70]
0167:00461F24  MOV      [EDX+C4],EAX
0167:00461F2A  PUSH    BYTE +61
0167:00461F2C  MOV      ECX,005EBAD8
0167:00461F31  CALL    00463BFA
0167:00461F36  MOV      ECX,[EBP+FFFFFF70]
0167:00461F3C  MOV      [ECX+C8],EAX
0167:00461F42  PUSH    BYTE +60
0167:00461F44  MOV      ECX,005EBAD8
0167:00461F49  CALL    00463BFA
0167:00461F4E  MOV      EDX,[EBP+FFFFFF70]
0167:00461F54  MOV      [EDX+CC],EAX
                .
                .
0167:00461FC5  PUSH    EAX
0167:00461FC6  LEA      ECX,[EBP-14]
0167:00461FC9  CALL    00549072
0167:00461FCE  MOV      ECX,EAX
0167:00461FD0  CALL    00548F24
0167:00461FD5  TEST    EAX,EAX
0167:00461FD7  JNZ      0046200C
0167:00461FD9  PUSH    ECX
0167:00461FDA  MOV      ECX,ESP
0167:00461FDC  MOV      [EBP-74],ESP
0167:00461FDF  PUSH    BYTE +00
0167:00461FE1  CALL    00548CCA
0167:00461FE6  PUSH    ECX
0167:00461FE7  MOV      ECX,ESP
0167:00461FE9  MOV      [EBP-6C],ESP
0167:00461FEC  LEA      EDX,[EBP-54]
0167:00461FEF  PUSH    EDX
0167:00461FF0  CALL    00548F64
0167:00461FF5  LEA      EAX,[EBP-70]
0167:00461FF8  PUSH    EAX
0167:00461FF9  LEA      ECX,[EBP-14]
0167:00461FFC  DB      E8      //在這裡如果按F10就會執行軟體了,但為了分析它是
                                //如何執行的,按F8進入,原來這是一種特別的CALL,
                                //乍一看以為是定義值。以下是從這個CALL進入後的程式碼。

0167:00461FFC  CALL    00549072 //從上面那個DB E8中返回後變成了CALL 549072,這是種變像的CALL
0167:00462001  MOV      ECX,EAX
0167:00462003  CALL    00548ED6
0167:00462008  TEST    EAX,EAX
0167:0046200A  JZ      00462022 //這裡會跳
0167:0046200C  PUSH    BYTE +00
0167:0046200E  PUSH    BYTE +00
0167:00462010  PUSH    DWORD 005DB5C0
0167:00462015  CALL    005271C1
0167:0046201A  OR      EAX,BYTE -01
0167:0046201D  JMP      00462256
0167:00462022  MOV      ECX,[EBP+08]
0167:00462025  PUSH    ECX
0167:00462026  MOV      ECX,[EBP+FFFFFF70]
0167:0046202C  CALL    00538C61
0167:00462031  CMP      EAX,BYTE -01
0167:00462034  JNZ      0046203E
0167:00462036  OR      EAX,BYTE -01
0167:00462039  JMP      00462256
0167:0046203E  PUSH    DWORD 005DB5E0
              .
              .
0167:004620DB  CALL    004628EB  //注意,從這裡進入後再走幾步就來到PART B
0167:004620E0  TEST    EAX,EAX
0167:004620E2  JNZ      0046210E            (JUMP)
0167:004620E4  MOV      DWORD [EBP-78],FFFFFFFF
0167:004620EB  MOV      BYTE [EBP-04],00
0167:004620EF  LEA      ECX,[EBP-10]
0167:004620F2  CALL    0050ACBC
0167:004620F7  MOV      DWORD [EBP-04],FFFFFFFF
0167:004620FE  LEA      ECX,[EBP-48]
0167:00462101  CALL    0050ACBC
0167:00462106  MOV      EAX,[EBP-78]
0167:00462109  JMP      00462256
0167:0046210E  MOV      ECX,[EBP+FFFFFF70]
0167:00462114  CALL    00462266  //注意,從這裡進入後再走幾步就來到PART B
0167:00462119  TEST    EAX,EAX
0167:0046211B  JNZ      00462147 //未破解版這裡不會跳。
0167:0046211D  MOV      DWORD [EBP-7C],FFFFFFFF
0167:00462124  MOV      BYTE [EBP-04],00
0167:00462128  LEA      ECX,[EBP-10]
0167:0046212B  CALL    0050ACBC
0167:00462137  LEA      ECX,[EBP-48]
0167:0046213A  CALL    0050ACBC
0167:0046213F  MOV      EAX,[EBP-7C]
0167:00462142  JMP      00462256
0167:00462147  PUSH    DWORD F000
0167:0046214C  MOV      ECX,[EBP+FFFFFF70]
0167:00462152  CALL    00543E75
0167:00462157  MOV      ECX,[EBP+FFFFFF70]
0167:0046215D  CALL    004626B7  //注意,從這裡進入後再走幾步就來到PART B
0167:00462162  TEST    EAX,EAX
0167:00462164  JNZ      00462190  //未破解版這裡不會跳。
0167:00462166  MOV      DWORD [EBP-80],FFFFFFFF
0167:0046216D  MOV      BYTE [EBP-04],00
0167:00462171  LEA      ECX,[EBP-10]
0167:00462174  CALL    0050ACBC
0167:00462179  MOV      DWORD [EBP-04],FFFFFFFF
0167:00462180  LEA      ECX,[EBP-48]
0167:00462183  CALL    0050ACBC
0167:00462188  MOV      EAX,[EBP-80]
0167:0046218B  JMP      00462256
0167:00462196  CALL    004623C4  //注意,從這裡進入後再走幾步就來到PART B
0167:0046219B  TEST    EAX,EAX
0167:0046219D  JNZ      004621CF //未破解版這裡不會跳。
0167:0046219F  MOV      DWORD [EBP+FFFFFF7C],FFFFFFFF
0167:004621A9  MOV      BYTE [EBP-04],00
0167:004621AD  LEA      ECX,[EBP-10]
0167:004621B0  CALL    0050ACBC
0167:004621B5  MOV      DWORD [EBP-04],FFFFFFFF
0167:004621BC  LEA      ECX,[EBP-48]
0167:004621BF  CALL    0050ACBC
0167:004621C4  MOV      EAX,[EBP+FFFFFF7C]
0167:004621CA  JMP      00462256
0167:004621CF  MOV      ECX,[EBP+FFFFFF70]
0167:004621D5  CALL    004627D1  //注意,從這裡進入後再走幾步就來到PART B
0167:004621DA  TEST    EAX,EAX
0167:004621DC  JNZ      0046220B //未破解版這裡不會跳。
0167:004621DE  MOV      DWORD [EBP+FFFFFF78],FFFFFFFF
0167:004621E8  MOV      BYTE [EBP-04],00
0167:004621EC  LEA      ECX,[EBP-10]
0167:004621EF  CALL    0050ACBC


==<PART  B>=====================================
這部分是關鍵,如果462285處的CALL返回的EAX和[ECX+C0]不相等,程式可執行,但會出錯。
它出現的錯誤VC的呼叫錯誤(紅X,英文提示,XXX檔案內部錯誤),原以為是軟體本身的問題。
後來分析發現它是用這種方法制造出來的錯誤。
所以在解狗過程中要細心分析,有很多的系統錯誤以及非法操作都是人為製造出來的,而不是
程式本身的問題。
-------------------------------------------------
好了,言歸正傳,下面來看看夢龍是如何讓程式產生錯誤的。

0167:0046226C  MOV      [EBP-18],ECX
0167:0046226F  PUSH    BYTE +63
0167:00462271  MOV      ECX,005EBAD8
0167:00462276  CALL    00463B2F
0167:0046227B  MOV      [EBP-04],EAX
0167:0046227E  PUSH    BYTE +63
0167:00462280  MOV      ECX,005EBAD8
0167:00462285  CALL    00463B2F  //這裡的CALL將計算EAX,並將[ECX+C0]中賦值。
                                  //想辦法使從這個CALL中返回的EAX=[ECX+C0]就行了。
0167:0046228A  MOV      ECX,[EBP-18]
0167:0046228D  CMP      EAX,[ECX+C0]
0167:00462293  JZ      0046229C
0167:00462295  XOR      EAX,EAX
0167:00462297  JMP      004623C0
0167:0046229C  PUSH    DWORD E800
0167:004622A1  PUSH    BYTE +00

==<PART C>======================================
0167:00463DF5  PUSH    EBP  //從這裡開始將計算EAX
0167:00463DF6  MOV      EBP,ESP
0167:00463DF8  SUB      ESP,BYTE +08
0167:00463DFB  MOV      [EBP-08],ECX
0167:00463DFE  MOV      EAX,[EBP+08]
0167:00463E01  SUB      EAX,BYTE +76
0167:00463E04  MOV      [EBP-04],EAX
0167:00463E07  MOV      ECX,[EBP-08]
0167:00463E0A  MOV      EDX,[EBP-04]
0167:00463E0D  XOR      EDX,[ECX+98]
0167:00463E13  MOV      [EBP-04],EDX
0167:00463E16  MOV      EAX,[EBP-08]
0167:00463E19  MOV      ECX,[EBP-04]
0167:00463E1C  ADD      ECX,[EAX+98]
0167:00463E22  MOV      [EBP+08],ECX
0167:00463E25  MOV      EAX,[EBP+08] //這裡得出EAX,而從這段返回後會把EAX寫入[ECX+C0]
0167:00463E28  MOV      ESP,EBP
0167:00463E2A  POP      EBP

只要將463E25處寫成XOR EAX,EAX就可以讓程式不會產生錯誤了。

==<PART D>====================================
延遲通常用兩種方法實現:
1.用核心的API----SLEEP,可以在SLEEP前面加引數來控制休眠的時間。
2.利用迴圈,將迴圈的次數設定的比較多,或是迴圈套迴圈。(夢龍用的就是這種)

0167:10006C94  CALL    10006D31
0167:10006C99  MOV      [EBP-08],EAX
0167:10006C9C  CMP      DWORD [EBP-08],BYTE +00
0167:10006CA0  JL      10006D02  //將這裡改成JMP就可以跳過有延遲的CALL了。
0167:10006CA2  MOV      EDX,[EBP-08]
0167:10006CA5  MOV      BYTE [EDX+1001512C],FF
0167:10006CAC  MOV      EAX,[EBP+08]
0167:10006CAF  MOV      BYTE [EAX+1001519C],FF
0167:10006CB6  MOV      ECX,[EBP+08]
0167:10006CB9  MOV      DL,[EBP-08]
0167:10006CBC  MOV      [ECX+10015138],DL
0167:10006CC2  CALL    1000AA81  //這個CALL會產生延遲,想辦法跳過去。
0167:10006CC7  MOV      [EBP-0C],AL
0167:10006CCA  MOV      EAX,[EBP-0C]
0167:10006CCD  AND      EAX,FF
0167:10006CD2  PUSH    EAX
0167:10006CD3  MOV      ECX,[EBP-08]
0167:10006CD6  PUSH    ECX
0167:10006CD7  MOV      ECX,[10015124]
0167:10006CDD  CALL    10004163 //這個CALL會產生延遲,想辦法跳過去。
0167:10006CE2  MOV      EDX,[EBP-0C]
0167:10006CEB  MOV      [EBP-10],EDX
0167:10006CEE  MOV      EAX,[EBP+0C]
0167:10006CF1  ADD      EAX,[EBP-10]
0167:10006CF4  MOV      [EBP+0C],EAX
0167:10006CF7  MOV      ECX,[EBP+0C]
0167:10006CFA  XOR      ECX,[EBP-10]
0167:10006CFD  MOV      [EBP+0C],ECX
0167:10006D00  JMP      SHORT 10006D0C
0167:10006D02  MOV      EDX,[EBP+08]
0167:10006D05  MOV      BYTE [EDX+1001519C],00
0167:10006D0C  MOV      EAX,[EBP+08]
0167:10006D0F  MOV      ECX,[10015120]
0167:10006D15  MOV      EDX,[EBP+0C]
0167:10006D18  MOV      [ECX+EAX*4],EDX
0167:10006D1B  MOV      EAX,[EBP-04]
0167:10006D1E  PUSH    EAX
0167:10006D1F  CALL    1000658E
0167:10006D24  ADD      ESP,BYTE +04
0167:10006D27  MOV      [EBP-04],EAX
0167:10006D2A  MOV      EAX,[EBP-04]
0167:10006D2D  MOV      ESP,EBP
0167:10006CEB  MOV      [EBP-10],EDX
0167:10006CEE  MOV      EAX,[EBP+0C]
0167:10006CF1  ADD      EAX,[EBP-10]
0167:10006CF4  MOV      [EBP+0C],EAX
0167:10006CF7  MOV      ECX,[EBP+0C]
0167:10006CFA  XOR      ECX,[EBP-10]
0167:10006CFD  MOV      [EBP+0C],ECX
0167:10006D00  JMP      SHORT 10006D0C
0167:10006D02  MOV      EDX,[EBP+08]
0167:10006D05  MOV      BYTE [EDX+1001519C],00
0167:10006D0C  MOV      EAX,[EBP+08]
0167:10006D0F  MOV      ECX,[10015120]
0167:10006D15  MOV      EDX,[EBP+0C]
0167:10006D18  MOV      [ECX+EAX*4],EDX
0167:10006D1B  MOV      EAX,[EBP-04]
0167:10006D1E  PUSH    EAX
0167:10006D1F  CALL    1000658E
0167:10006D24  ADD      ESP,BYTE +04
0167:10006D27  MOV      [EBP-04],EAX
0167:10006D2A  MOV      EAX,[EBP-04]
0167:10006D2D  MOV      ESP,EBP
0167:10006D2F  POP      EBP
0167:10006D30F RET

破解心得:1.對付延遲的方法通常是改變迴圈的次數或是跳過有迴圈的CALL,但要注意的是,
            如果這個CALL裡的迴圈是用來向記憶體中寫值或是計算值的就不能跳過。
          2.系統錯誤以及非法操作有很多都是人為製造出,比如除零,非法地址等。
            除了在校驗狗的過程後要注意跳轉,還要幾個值與值之比較。通常程式中都是
            利用一個過程來計算值的,點有狗時這個值就是固定的,在以後的比較中不會出錯。
            而無狗時每次產生的值都不一樣,也就導致系統出錯。

===================================================================================
  另外,哪個朋友自己有破解網站?我以前的站叫雪舞廬州,後來因為空間問題關了。我現在
 已畢業了,回想起3年前一手創立的網站,很是心酸呀。不知哪位朋友能幫幫我,我不是想要空
 間我是想和他一起做網站,我現在已從白菜樂園裡退出來了,那裡太複雜了。我想很多人都知道
 我靠解狗賺錢,但我不希望大家把羅降神和錢劃上一個等號,我還是喜歡看雪論壇,它是我的啟
 蒙老師,看雪兄也是我的好朋友,而且在這裡有很多人支援我,幫助過我,它伴隨我走過了3年。
 如果時過境遷,罈子裡的很多人我都不認識了,還記得在罈子裡認識的第一個人是peterchen,
  他以前的特長不是解密,而是交友,如今也成了老鳥了。
 我的QQ是17525661  email:aispark@21cn.com  如果閒著沒事,加我吧。

                                    
                                   羅降神 
                                                                    2002.6.25

相關文章