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