cool kari V5.1
程式猎人
软件名:cool kari
用途:把图画转为字符格式(做签名)
限制:未注册只能转23行
下载地址: http://home.etang.com/hoverfei/software/Coolkari.zip
大小:378K
追踪:(我破解这个软件共花费了两天的时间来破解,如果没有第一天的破解结果的话,我
将无法得到这个软件的真正的注册过程,所以破解不同的地方有着相互关联的地方)
第一天破解过程
今天从网友处得到这个软件,开始对它进行破解,这个软件是国人设计的,它对于防破解
作的相当的好,对于从注册码方面对它进行破解有相当的难度,我花了很长时间也没有将它
的注册码给搞定,可是程序设计者是百密必有一疏,因为这个软件有功能的限制,所以对于
破解这个软件来说,将它的功能变为完全的就算破解成功了(至少我是这样认为的)。
:00453D06 E83D8EFCFF call 0041CB48
:00453D0B 8B55F8 mov edx, dword ptr [ebp-08]
:00453D0E A1748E4500 mov eax, dword ptr [00458E74]
:00453D13 8B00 mov eax, dword ptr [eax]
:00453D15 05FC020000 add eax, 000002FC
:00453D1A E87DFBFAFF call 0040389C
:00453D1F C645FF00 mov [ebp-01], 00
:00453D23 8D55F8 lea edx, dword ptr [ebp-08]
:00453D26 8B86F8010000 mov eax, dword ptr [esi+000001F8]
:00453D2C E8178EFCFF call 0041CB48
:00453D31 8B55F8 mov edx, dword ptr [ebp-08]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453CCD(C)
|
:00453D34 A1B88F4500 mov eax, dword ptr [00458FB8]
:00453D39 E85EFBFAFF call 0040389C
:00453D3E A1748E4500 mov eax, dword ptr [00458E74]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453CCA(C)
|
:00453D43 8B00 mov eax, dword ptr [eax]
:00453D45 C680DE02000000 mov byte ptr [eax+000002DE], 00
:00453D4C 80BE0402000000 cmp byte ptr [esi+00000204], 00
:00453D53 740C je 00453D61
:00453D55 A1748E4500 mov eax, dword ptr [00458E74]
:00453D5A 8B00 mov eax, dword ptr [eax]
:00453D5C E85B2C0000 call 004569BC
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453D53(C)
|
* Possible Reference to String Resource ID=00001: "&File"
|
:00453D61 B901000000 mov ecx, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453D91(C)
|
:00453D66 8BC1 mov eax, ecx
:00453D68 BB0A000000 mov ebx, 0000000A
:00453D6D 99 cdq
:00453D6E F7FB idiv ebx
:00453D70 8B15748E4500 mov edx, dword ptr [00458E74]
:00453D76 8B12 mov edx, dword ptr [edx]
:00453D78 80BC02DD02000000 cmp byte ptr [edx+eax+000002DD], 00 ***
:00453D80 7404 je 00453D86
:00453D82 B301 mov bl, 01
:00453D84 EB04 jmp 00453D8A
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453D80(C)
|
:00453D86 33DB xor ebx, ebx
:00453D88 EB09 jmp 00453D93
如果你从注册选项这个对这个软件进行破解的话,你将来到上面这里。我想对于破解这
个软件的人来说,大家一定会在这里研究它如何进行注册的,我在开始时也同大家一样在这
里花费的很多时间来研究这里,可是当我研究一段时间后,越来越来发现程序在这里其实无
法实现注册成功。你在这里只能使用跳跃才能获得注册成功。那么程序是为什么呢?我想会
计是程序设计者在这里设计的一个套,使破解人在这里花费大部分时间,那么程序为什么会
无法注册成功呢?
程序如果能够注册成功的话,它在将在***处比较后,不跳跃才能注册成功。但是程序运
算过程却是无法得到[edx+eax+000002DD]=00,具体如下所示:
:00453D61 B901000000 mov ecx, 00000001
:00453D66 8BC1 mov eax, ecx
:00453D68 BB0A000000 mov ebx, 0000000A
:00453D6D 99 cdq
:00453D6E F7FB idiv ebx
:00453D70 8B15748E4500 mov edx, dword ptr [00458E74]
:00453D76 8B12 mov edx, dword ptr [edx]
:00453D78 80BC02DD02000000 cmp byte ptr [edx+eax+000002DD], 00 ***
:00453D80 7404 je 00453D86
现在大家可以研究上面的运算过程了,这里最为关键的地方就是[00458E74]这个地址,可
以无论你如何改变注册码和名字它都不变,所以在这里你将无法获得注册成功的。
那么如何破解它呢?对于解除掉这个软件的功能,也有一定的技巧。现在我就开始介绍我
如何解除掉这个软件的23行的这个限制功能。
现在在没有破解这个功能之前,我先开始想,对于这种程序来说,在开始工作前一定要检
查内存中的一个标志,这个标志就是你是注册用户,还是非注册用户的标志。如果你是注册
用户,那么它将完全依照图形的大小来进行转变,而如果标志为非注册用户,它将图形的行
数变为23行。好了,现在想好了这个方面就可以对它进行破解了。
我将如何知道程序判断标志的地方,当然我对它也是不知道的(这个就是解密者的乐趣之
处),但是我可以试验它。软件有一个转化图形的命令按钮,如果你想转化的话,就要按这
个按钮进行转化。好了,现在就从这个按钮着手。
现在的关键是如何下这个中断呢?这个就是大显神通了。我在这里使用sendmessage这个
命令。设bpx sendmessage,后点击按钮,程序被拦下来,OK它已经成功了一半。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|004526AA(C)
|
00452351 A17C8F4500 mov eax, dword ptr [00458F7C]
00452356 8B00 mov eax, dword ptr [eax]
0045231B 80BC10DD02000000 cmp byte ptr [eax+edx+000002DD], 00
00452358 E837AAFDFF call 0042CD94
0045235D 8D8594FDFFFF lea eax, dword ptr [ebp+FFFFFD94] <-出来
00452363 E8E014FBFF call 00403848
00452368 668B7DE4 mov di, word ptr [ebp-1C]
0045236C 4F dec edi
0045236D 6685FF test di, di
00452370 0F82F3020000 jb 00452669
00452376 47 inc edi
现在从上面标记的地方出来了,于是就向下走
00452529 59 pop ecx
0045252A 66817DDEFF01 cmp word ptr [ebp-22], 01FF
00452530 0F8587000000 jne 004525BD
00452536 0FB7D0 movzx edx, ax
00452539 83FA06 cmp edx, 00000006
0045253C 7760 ja 0045259E
0045253E FF249545254500 jmp dword ptr [4*edx+00452545] 跳跃处
当来到这里后程序跳跃到另一个地址中。
0045267F FF5134 call [ecx+34]
00452682 0FB7958CFDFFFF movzx edx, word ptr [ebp+FFFFFD8C]
00452689 42 inc edx
0045268A A1708F4500 mov eax, dword ptr [00458F70]
0045268F 8B00 mov eax, dword ptr [eax]
00452691 8B80EC010000 mov eax, dword ptr [eax+000001EC]
00452697 E85C8EFEFF call 0043B4F8
0045269C 66FF858CFDFFFF inc word ptr [ebp+FFFFFD8C]
004526A3 66FF8D6AFDFFFF dec word ptr [ebp+FFFFFD6A]
004526AA 0F85A1FCFFFF jne 00452351
看一看这个jne跳跃的地址是00452351,而我刚刚出来的地址为0045235D,这就是说明它
将又回到了上面,如果你能够追踪到这里的话,你可以看一看[ebp+FFFFFD6A]这个值是多少
,你会发现它等于17(H)=23,这就说明我们至少已经找到了这个关键的比较地方了。那么下
一步将要做什么呢?还记得我前面说过的话没有,在转化之前程序一定要验证你是否为注册
用户。有了这个思想就可以进行下一步了。当然是查找我们找到的程序前面是否有比较的地
方或是将17保存的地方。
00452315 8B956CFDFFFF mov edx, dword ptr [ebp+FFFFFD6C]
0045231B 80BC10DD02000000 cmp byte ptr [eax+edx+000002DD], 00
00452323 750D jne 00452332
00452323 750D jne 00452332
00452325 66837DE617 cmp word ptr [ebp-1A], 0017
0045232A 7606 jbe 00452332
0045232C 66C745E61700 mov [ebp-1A], 0017
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|00452323(C), 0045232A(C)
|
00452332 668B45E6 mov ax, word ptr [ebp-1A]
00452336 48 dec eax
00452337 6685C0 test ax, ax
0045233A 0F8270030000 jb 004526B0
00452340 40 inc eax
00452341 6689856AFDFFFF mov word ptr [ebp+FFFFFD6A], ax
00452348 66C7858CFDFFFF0000 mov word ptr [ebp+FFFFFD8C], 0000
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|004526AA(C)
|
00452351 A17C8F4500 mov eax, dword ptr [00458F7C] 循环的开始处
00452356 8B00 mov eax, dword ptr [eax]
因为程序将回到00452351处,我就从这里向上看。大家发现了吧。
0045231B 80BC10DD02000000 cmp byte ptr [eax+edx+000002DD], 00
00452323 750D jne 00452332
00452325 66837DE617 cmp word ptr [ebp-1A], 0017
0045232A 7606 jbe 00452332
0045232C 66C745E61700 mov [ebp-1A], 0017
上面就是关键的比较地方,程序首先验证是否为注册用户,当[eax+edx+000002DD]不等于
0时就为注册用户,否则为非注册用户。如果你为非注册用户程序先比较你转化的图形是否
小于17(H),如果是者使用原值,如果不是的话,将使用17(H)这个值,也就是只能转化23行
的命令。
OK,现在一切都已经搞定了,其它的事情就是修改了。因为这个程序没有加壳,所以修改
它是没有问题的。
对了,还有一个小问题,如果象我这样做的话,它转化完后在文本中还有这样的说明
Unregistered Version --- 23 lines limitted.
See section How To Register CoolKari in help file.
现在再对它进行破解。这回使用W32对它破解。在W32中字符串中有这样的字符串。
:004526D6 80BC10DD02000000 cmp byte ptr [eax+edx+000002DD], 00
:004526DE 7548 jne 00452728
:004526E0 8B8598FDFFFF mov eax, dword ptr [ebp+FFFFFD98]
:004526E6 8B00 mov eax, dword ptr [eax]
:004526E8 8B8030010000 mov eax, dword ptr [eax+00000130]
:004526EE BA80274500 mov edx, 00452780
:004526F3 8B08 mov ecx, dword ptr [eax]
:004526F5 FF5134 call [ecx+34]
:004526F8 8B8598FDFFFF mov eax, dword ptr [ebp+FFFFFD98]
:004526FE 8B00 mov eax, dword ptr [eax]
:00452700 8B8030010000 mov eax, dword ptr [eax+00000130]
* Possible StringData Ref from Code Obj ->"Unregistered Version --- 23 lines "
->"limitted."
|
:00452706 BA8C274500 mov edx, 0045278C
:0045270B 8B08 mov ecx, dword ptr [eax]
:0045270D FF5134 call [ecx+34]
:00452710 8B8598FDFFFF mov eax, dword ptr [ebp+FFFFFD98]
:00452716 8B00 mov eax, dword ptr [eax]
:00452718 8B8030010000 mov eax, dword ptr [eax+00000130]
* Possible StringData Ref from Code Obj ->"See section How To Register CoolKari "
->"in help file."
|
:0045271E BAC0274500 mov edx, 004527C0
:00452723 8B08 mov ecx, dword ptr [eax]
在上面可以看到相关的字符串,在它的上面有一个跳跃,现在只要将这个跳跃变为jmp就
可以了。到现在为止才算破解完成。
***************************************
* 查找:75 0D 66 83 7D E6 17 *
* 替换:EB -- -- -- -- -- -- *
* 查找:75 48 8B 85 98 FD FF *
* 替换:EB -- -- -- -- -- -- *
***************************************
- 表示不用替换的值.
第二天破解过程
对于这个软件的破解,今天我终于将它完全破解成功了,所以就将它完全的过程写出来了
。当然破解它后非常的高兴。现在先说一下,这个软件有一个非常特殊的地方。如果你在程
序启动后,再进行注册码的比较,从这里想找到突破口是不可能的。因为我现在将程序注册
成功后,在它的注册选项中再进行注册你猜发生了什么事情?程序告诉我wrong key。可是
我使用这个注册码来运算程序时却是注册成功了。这就说明程序运行后根本不去验证注册码
,而是将你所有输入的注册码都认为是错误的。这就是大多数人无法追踪到这个软件的地方
。但是因为我在昨天已经将它的限制功能破解掉了。今天我就从这里出发,终于找到了注册
比较的地方。
现在就开始介绍如何破解的这个软件。
在昨天我破解内容就为上面的内容,其中这里是相当的重要。
0045231B 80BC10DD02000000 cmp byte ptr [eax+edx+000002DD], 00
00452323 750D jne 00452332
00452325 66837DE617 cmp word ptr [ebp-1A], 0017
0045232A 7606 jbe 00452332
0045232C 66C745E61700 mov [ebp-1A], 0017
[eax+edx+000002DD]就是注册的标记,它的值将决定这个软件是否注册了。那么今天我就
找到这个值的位置,将它设为中断。它的地址为00D41E6E,所以就设为:bpm 00D41E6E rw
(这个命令很重要啊)。现在运行程序。你将中断两次,如下:
:00402D0A C1E902 shr ecx, 02
:00402D0D 49 dec ecx
:00402D0E F3 repz 中断处
:00402D0F AB stosd
:00402D10 59 pop ecx
:00402D11 83E103 and ecx, 00000003
:00402D14 F3 repz
:00402D15 AA stosb
:00402D16 89D0 mov eax, edx
:00402D18 89E2 mov edx, esp
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D2B(U)
|
:00402D1A 8B4BC4 mov ecx, dword ptr [ebx-3C]
经过验证,程序在这里没有什么用处,现在就向下运行到另一个中断点处,这里可是程序
比较注册码关键地方,大家一定要注意。
:00456AFD A11CA84500 mov eax, dword ptr [0045A81C]
:00456B02 E8BDCFFAFF call 00403AC4
:00456B07 03C0 add eax, eax
:00456B09 8D0480 lea eax, dword ptr [eax+4*eax]
:00456B0C 83F850 cmp eax, 00000050 ***
:00456B0F 7505 jne 00456B16
:00456B11 83FF03 cmp edi, 00000003
:00456B14 7D25 jge 00456B3B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456B0F(C)
|
* Possible Reference to String Resource ID=00001: "&File"
|
:00456B16 B901000000 mov ecx, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456B34(C)
|
:00456B1B 8BC1 mov eax, ecx
:00456B1D BB0A000000 mov ebx, 0000000A
:00456B22 99 cdq
:00456B23 F7FB idiv ebx
:00456B25 C68406DD02000000 mov byte ptr [esi+eax+000002DD], 00
:00456B2D 41 inc ecx <-中断处
:00456B2E 81F9C9000000 cmp ecx, 000000C9
:00456B34 75E5 jne 00456B1B
:00456B36 E9E2000000 jmp 00456C1D
如果运行的话,你将上面的地方中断,[esi+eax+000002DD]的地址就是00D41E6E,程序在
这里不断的向这个地址中写入00,那么程序如何能够向这个地址中写入01呢?这就是我们要
解决的问题。现在向上看,你将会发现重要的地方,***处。因为程序没有运行到下面地方
,所以现在将在这里设断。记住在下面的地址上设断:
:00456B02 E8BDCFFAFF call 00403AC4
你得重新运行程序,你将在00456B02处中断,现在d eax,你会发现这个值就是我们输入的
注册码。好了,我对自己说成功一半了。当走出这个call 00403AC4后,eax的值就是你在注
册表中注册码的个数。它在这里是得到注册码的位数,下面就是将比较你的注册码位数了。
:00456B02 E8BDCFFAFF call 00403AC4
:00456B07 03C0 add eax, eax
:00456B09 8D0480 lea eax, dword ptr [eax+4*eax]
:00456B0C 83F850 cmp eax, 00000050 ***
:00456B0F 7505 jne 00456B16
:00456B11 83FF03 cmp edi, 00000003
:00456B14 7D25 jge 00456B3B
因为我在注册表中的RN:0123456789,所以eax=A,经过运算eax=64,它没有等于50,它
就跳到00456B16这里,也就是错误的地方。好了,第一将要解决的地方就是注册码的位数。
它是多少位时才能运算后等于50。上面的运算其实很简单,它就将位数*10的16进位值,那
么50的十进位值为80,所以注册码的位数一定为8位。第一问题已经不是问题了。向下这个e
di值是多少呢?我发现这个edi值不同RN的位数改变而改变。它始终等于A,所以它到jge处
自然就跳跃了。
:00456B3B B901000000 mov ecx, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456BA5(C)
|
:00456B40 8BC1 mov eax, ecx
:00456B42 48 dec eax
:00456B43 3BF8 cmp edi, eax
:00456B45 7D19 jge 00456B60
这里比较edi同00的大小,当然是edi大了,跳跃。
:00456B60 8B86FC020000 mov eax, dword ptr [esi+000002FC]
:00456B66 8A4408FF mov al, byte ptr [eax+ecx-01]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456B5E(U)
|
:00456B6A 8BE8 mov ebp, eax
:00456B6C 81E5FF000000 and ebp, 000000FF
:00456B72 6683ED41 sub bp, 0041
:00456B76 6603E9 add bp, cx
:00456B79 8BC5 mov eax, ebp
:00456B7B 6635FF00 xor ax, 00FF
:00456B7F 0FB7C0 movzx eax, ax
:00456B82 BD0A000000 mov ebp, 0000000A
:00456B87 99 cdq
:00456B88 F7FD idiv ebp
:00456B8A 8BEA mov ebp, edx
:00456B8C A11CA84500 mov eax, dword ptr [0045A81C]
:00456B91 0FB64408FF movzx eax, byte ptr [eax+ecx-01]
:00456B96 6683E830 sub ax, 0030
:00456B9A 663BC5 cmp ax, bp
:00456B9D 7402 je 00456BA1
:00456B9F 33DB xor ebx, ebx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456B9D(C)
|
:00456BA1 41 inc ecx
:00456BA2 83F907 cmp ecx, 00000007
:00456BA5 7599 jne 00456B40
上面可是这个软件运行注册码的地方,它的运算过程不复杂,可以制作注册机,但是我没
有时间来制作。只简单的得到注册码。如何得到呢?
:00456B9A 663BC5 cmp ax, bp
:00456B9D 7402 je 00456BA1
bp值为我们输入的注册码每位值,ax为运算后的值,只要它们两个相等就可以了。在这里
我能够得到6个值,分别如下:
name:dahuilang
RN:9 1 3 9 0 6
因为程序要求是8位,所以设后两位为99,现在再向下进行破解工作。
:00456BA7 8B86FC020000 mov eax, dword ptr [esi+000002FC]
:00456BAD 8A4438FF mov al, byte ptr [eax+edi-01]
:00456BB1 8BE8 mov ebp, eax
:00456BB3 81E5FF000000 and ebp, 000000FF
:00456BB9 6683ED41 sub bp, 0041
:00456BBD 6683C50B add bp, 000B
:00456BC1 8BC5 mov eax, ebp
:00456BC3 6635FF00 xor ax, 00FF
:00456BC7 0FB7C0 movzx eax, ax
:00456BCA B964000000 mov ecx, 00000064
:00456BCF 99 cdq
:00456BD0 F7F9 idiv ecx
:00456BD2 8BEA mov ebp, edx
:00456BD4 A11CA84500 mov eax, dword ptr [0045A81C]
:00456BD9 0FB64006 movzx eax, byte ptr [eax+06]
:00456BDD 6683E830 sub ax, 0030
:00456BE1 03C0 add eax, eax
:00456BE3 8D0480 lea eax, dword ptr [eax+4*eax]
:00456BE6 8B151CA84500 mov edx, dword ptr [0045A81C]
:00456BEC 0FB65207 movzx edx, byte ptr [edx+07]
:00456BF0 6603C2 add ax, dx
:00456BF3 6683E830 sub ax, 0030
:00456BF7 663BC5 cmp ax, bp
:00456BFA 7402 je 00456BFE
:00456BFC 33DB xor ebx, ebx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00456BFA(C)
|
* Possible Reference to String Resource ID=00001: "&File"
|
:00456BFE B901000000 mov ecx, 00000001
这里是运算后面两位的地方,具体运算也不是很难,它的计算是16进位的运算,如果你将
它转化为10进位的运算你就很清楚的知道程序在做什么。
:00456BF7 663BC5 cmp ax, bp
:00456BFA 7402 je 00456BFE
在这里程序将得到ax=63(H),bp=06(H),那么63(H)=99(D),所以得到后面两位的注册码
为06(H)=06(D),好了,注册码得到了。
现在破解结束了,再回忆一下它增加破解难度关键就在程序设计者让你在运行软件后,无
论使用正确还是错误的注册码,它都认为是错误的,就这个增加了我们不少难度,也使我花
了不少时间。现在可以通过这个软件的破解,可以给解密者上了一堂课,加密者可不是白给
的。
在结束前还要说一下,这个程序将注册码和用户名均写在注册表中如下的位置中:
HKEY_CURRENT_USER\Software\CoolKari\CoolKari\Register Code
HKEY_CURRENT_USER\Software\CoolKari\CoolKari\User Name
你可以在这里将注册码修改,再到程序中比较。你只能在这里将注册码输入,在前面我说过
程序如果从注册选项处输入将无法注册成功,所以你只能在这里注册成功。
****************************
* name:dahuilang *
* RN:91390606 *
****************************
|
Tutor2 How to crack FTP Navigator 4.01
作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 27th July, 1999
软件背景资料
运行平台: Win9X
文件名称: 1ftpnav.zip
程序类型: FTP类管理工具
下载地点: http://www.vista.ru
文件大小: 256KB
使用的工具
SoftIce V3.25--Win9X Debugger
W32Dasm V8.93--Win9X Dissembler
Hex WorkShop v2.54--Hex Editor
RegSnap V2.51--Registry Tracer
难易程度
Easy( ) Medium(X) Hard( ) Pro( )
----------=======声明========----------
未经作者同意,不得修改、引用原文,一切权利保留。
本教程只供教学用,其他一切用途皆被禁止。
----------=======软件介绍========----------
FTP Navigator is a program that makes using FTP much simpler. The graphical
interface is intuitive to Windows users, and makes transferring files via FTP a easy.
----------=======软件的保护机制========----------
使用时间保存在:
HKEY_LOCAL_MACHINE\Software\CLASSES\MrCom\,可以看出这个键值藏得很隐秘,现在越来
越多的共享软件把安装时间伪装起来,以避免用修改注册表这种低级方式重新获得试用期,
不过这对高手来说,只能算是小伎俩,有了RegSnap这个工具,一切记录在注册表中东东都
会暴露在“光天化日”之下。
运行程序,首先出现的是nag screen,显示的时间以秒计算,每使用一天其显示时间就
增加一秒,如若你使用了半年还没有注册,那么你就要等待120s,这也是他的等待时间的极
限,为了使用这个软件,要真是等待这么长时间,我们还不要等死!让我们行动,crack掉
它!
----------=======正文========----------
线索
进入主窗口,发现在标题栏显示“(Unregistered)"
在W32Dasm中寻找,没找到,我们只剩下最后的线索了。不过我从string data referen
ce中看出此软件是用Delphi编写的,用Delphi写的软件有时真的很难crack,这是因为在程序
中出现的字符串反汇编后有时根本找不到。也不知道Delphi的编译器是怎么编译的,真的很
cool,我绝对是Delphi的崇拜者。
既然nag screen也是窗口,让我们在SoftIce中设断点:bpx showwindow do "p ret;"
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042DBE9(C)
|
:0042DCA4 8B45FC mov eax, dword ptr [ebp-04]
:0042DCA7 0FB68036010000 movzx eax, byte ptr [eax+00000136]
:0042DCAE 8B048590274600 mov eax, dword ptr [4*eax+00462790]
:0042DCB5 50 push eax
:0042DCB6 8B45FC mov eax, dword ptr [ebp-04]
:0042DCB9 E82E63FFFF call 00423FEC
:0042DCBE 50 push eax
* Reference To: user32.ShowWindow, Ord:0000h
|
:0042DCBF E81C84FDFF Call 004060E0
:0042DCC4 E905010000 jmp 0042DDCE <==程序中断在这里
你发现这段代码是从0042DBE9跳转过来的,
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042DB35(C)
|
:0042DBD5 8B45FC mov eax, dword ptr [ebp-04]
:0042DBD8 C6803B01000000 mov byte ptr [eax+0000013B], 00
:0042DBDF 8B45FC mov eax, dword ptr [ebp-04]
:0042DBE2 80B83A01000001 cmp byte ptr [eax+0000013A], 01
:0042DBE9 0F85B5000000 jne 0042DCA4 <==是从这里跳转的
:0042DBEF 8B45FC mov eax, dword ptr [ebp-04]
:0042DBF2 80B83601000002 cmp byte ptr [eax+00000136], 02
:0042DBF9 7536 jne 0042DC31
我试图修改此处的代码,将jne指令变为nop,但不成,看来关键的跳转不在这里。
我们要采取另一方案了--扩大包围圈法。
所谓扩大包围圈法,即一段代码的出现往往包括在某个子程序中,同时这个子程序也有
可能被包含在其他子程序中,这样层层包含,形成了复杂的程序结构。
我们现在要做的就是找到呼叫nag screen的最外层的call。
在SoftIce中重新下bpx showwindow do "p ret;",然后一直按F12,直到出现nag scre
en,每按一次F12,你都要记录每个call的Offset,这也许是一种很笨的办法,但这是最有效的
,有时遇到这种情况需要按上F12几十次,看到我的显示器一直在眨眼,我真的好心疼,为
了cracking,我付出的太多了。
闲话少说,倒数第二次按F12回到了0042E26E
* Referenced by a CALL at Addresses:
|:0043CD41 , :0043D015 , :00458341 , :004589BB , :00459815
|:0045AE7C , :0045B2C4 , :0045B9FE , :0045BC4B , :0045C4DC
|:00461631
|
:0042E15C 55 push ebp
.
.(Omit)
.
:0042E263 648922 mov dword ptr fs:[edx], esp
:0042E266 8B45FC mov eax, dword ptr [ebp-04]
:0042E269 E84AFEFFFF call 0042E0B8
:0042E26E 33D2 xor edx, edx <==回到这里
:0042E270 55 push ebp
你发现这段代码被11个CALL参考,怎么办呢?到这里你也许会放弃,但作为cracker,
你要有一追到底的精神,要找到nag screen是从这十一个CALL中哪一个呼叫来的,我的办法
是在十一个call处设断点,真的很烦琐,一想到马上看到黎明的曙光你就不烦了。
这部分工作我是在W32Dasm的DEBUG状态下实现的,经实践,呼叫nag screen的CALL是
在
:00461631
:00461589 648920 mov dword ptr fs:[eax], esp
:0046158C 85DB test ebx, ebx
:0046158E 0F8CBF000000 jl 00461653 <==此处跳转,直接进入主窗口
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046151E(C)
|
:00461594 8B0DC42D4600 mov ecx, dword ptr [00462DC4]
:0046159A 8B09 mov ecx, dword ptr [ecx]
:0046159C B201 mov dl, 01
:0046159E A144134600 mov eax, dword ptr [00461344]
:004615A3 E80C9BFCFF call 0042B0B4
:004615A8 8945FC mov dword ptr [ebp-04], eax
:004615AB 33C0 xor eax, eax
:004615AD 55 push ebp
:004615AE 684C164600 push 0046164C
:004615B3 64FF30 push dword ptr fs:[eax]
:004615B6 648920 mov dword ptr fs:[eax], esp
:004615B9 85DB test ebx, ebx
:004615BB 7E44 jle 00461601 <==此处跳转,出现不进行以秒计算的nag screen
:004615BD 8D55F8 lea edx, dword ptr [ebp-08]
:004615C0 8BC3 mov eax, ebx
:004615C2 E8D15BFAFF call 00407198
:004615C7 8B55F8 mov edx, dword ptr [ebp-08]
:004615CA 8B45FC mov eax, dword ptr [ebp-04]
:004615CD 8B8000020000 mov eax, dword ptr [eax+00000200]
:004615D3 E8CCEDFBFF call 004203A4
:004615D8 8B45FC mov eax, dword ptr [ebp-04]
:004615DB 8B8008020000 mov eax, dword ptr [eax+00000208]
:004615E1 33D2 xor edx, edx
:004615E3 89500C mov dword ptr [eax+0C], edx
:004615E6 8B45FC mov eax, dword ptr [ebp-04]
:004615E9 899814020000 mov dword ptr [eax+00000214], ebx
:004615EF 8B45FC mov eax, dword ptr [ebp-04]
:004615F2 8B8008020000 mov eax, dword ptr [eax+00000208]
:004615F8 B201 mov dl, 01
:004615FA E8BD96FDFF call 0043ACBC
:004615FF EB1D jmp 0046161E <==此处跳转,出现进行以秒计算的nag
screen
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004615BB(C)
|
:00461601 8B45FC mov eax, dword ptr [ebp-04]
:00461604 C7801402000003000000 mov dword ptr [ebx+00000214], 00000003
:0046160E 8B45FC mov eax, dword ptr [ebp-04]
:00461611 8B8000020000 mov eax, dword ptr [eax+00000200]
:00461617 B201 mov dl, 01
:00461619 E8EEECFBFF call 0042030C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004615FF(U)
|
:0046161E 8B45FC mov eax, dword ptr [ebp-04]
:00461621 8B8008020000 mov eax, dword ptr [eax+00000208]
:00461627 B201 mov dl, 01
:00461629 E88E96FDFF call 0043ACBC
:0046162E 8B45FC mov eax, dword ptr [ebp-04]
:00461631 E826CBFCFF call 0042E15C <==呼叫nag screen的call
:00461636 33C0 xor eax, eax
跟踪到这里,我们要进行最后的战役了。
分析代码,可以看出从0046161E开始处,是从004615FF处无条件跳转过来的,再往
上看,又
从004615BB处间接条件跳转过来,中间有很小的一段代码。
实验前,请先把时间往后调几个月,让nag screen出现进行以秒计算的状态,将004
615BB处的jle改为jmp,看看效果。奇迹出现了,nag screen还是出现,但没有出现以秒计算
的状态,很快进入主窗口,我们已成功了一半。
有一点我没有说,当你第一次运行此程序时,没有nag screen,看来我们还是有希望
让程序永远地直接进入主窗口。
我们首先让程序认为他是第一次运行,经过摸索,我发现从注册表删去键值
"HKEY_LOCAL_MACHINE\Software\CLASSES\MrCom\"即可。
W32DasmDebug状态下,在00461594处设断点,我们到底看看程序是否再执行这段代
码,果然不出我所料,程序是绕过此部分执行的。从哪里绕过的呢?我又在0046158E处设断
点(执行程序之前,请再次删掉上面提到的注册表键值),程序执行到此处中断,再按F8(st
ep over),跳转到:00461653,答案终于找到了。我们只要改jl为jmp
----------=======The Patch========----------
在文件FTP.EXE的offset:6098E处,修改0F8CBF000000为E9C000000090
|