• 标 题:本人作品---梦龙智能项目管理99A解狗教程(献给对加密狗有兴趣的朋友) (13千字)
  • 作 者:罗降神
  • 时 间:2002-6-25 8:26:46
  • 链 接:http://bbs.pediy.com

梦龙智能项目管理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