探索 http://programhunter.home.china.com
杂志宗旨:知识共享 资料共享 资源共享
制作成员:程式猎人
发行时间:2000-7-29
网站地址:http://programhunter.home.china.com

编辑寄语:

这期杂志将向大家介绍我个人破解的cool kari软件,这个软件是网友要求对它进行破解的。对于破解这个软件我是花费了两天时间,终于将它完整的破解出来了。这里所说的完整当然是指破解出来这个软件的注册码和注册过程。如果大家想测试一下自己的破解水平的话,不妨先下载这个软件进行破解一下,你可以点击这里下载:cool kari 我想如果你是一个解密高手的话,一定会从这个软件中从中获得以前没有得到的破解知识(我个人就是一个),而如果你是一个初学者我想你尽量破解,如果没有成功再看一看我的破解过程,想必也会给你一定的帮助。
目 录:
1.
cool kari V5.1 程式猎人
How to crack FTP Navigator 4.01 dREAMtHEATER
How to crack AtomTime v2.1a by BuLLeT  
2.
   
3.
   
4.
   
5.
   
返回
                 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         *
                   ****************************
返回
 
 
PART 1: How to crack AtomTime v2.1a by BuLLeT
        http://www.atomtime.com
 
This program is capable of getting the time from all parts of the world and
save it somewhere ;)
 
Let's crack.
 
1) Run the program and...BAAHH..an ugly NAG pops up. Skip it and go to the
   REGISTER section of the program. Enter your NAME and a random SERIAL.
   Nah..doesn't work. You get this message right in your face:
   "License data is invalid..either the data was not entered correctly...."
   NOTE IT !
 
2) Disassemble ATOMTIME.EXE using W32Dasm and go to the SDR (=String Data
   Reference) section. Find the message and double-click it. Minimize the
   SDR window and you should be about here:
 
	* Referenced by a (U)nconditional or (C)onditional Jump at Address:
	|:0040654F(C)
	|
	:004065DD 6A00                    push 00000000
	:004065DF 6A00                    push 00000000
	
	* Possible StringData Ref from Data Obj ->"License data is invalid...
	|
	:004065E1 68C5434300              push 004343C5
	:004065E6 E8FD2B0200              call 004291E8
 
   Referenced by a call at address: 0040654F. Let's check it out. Scroll up
   until you see this:
 
	:00406548 E881400000              call 0040A5CE
	:0040654D 85C0                    test eax, eax
	:0040654F 0F8488000000            je 004065DD
 
   Hmmz..a CALL followed by a TEST and a JE. Maybe we should change that.
   Make sure the green bar is on top of the JE-line and NOTE the offset at
   the bottom of the screen. 
   (Offset: 0000514F)
 
3) But this is not all. When you ran the program you noticed that there is a
   * UNREGISTERED * in the title of the program. We might as well remove that
   as well. 
 
4) Restore the SDR window and locate the * UNREGISTERED * msg. Double-click it 
   and once again minimize the SDR window. Now you should see this:
 
	* Referenced by a (U)nconditional or (C)onditional Jump at Address:
	|:00405FEA(C)
	|
	:00405FFB 8D8BE0050000            lea ecx, dword ptr [ebx+000005E0]
	................ some un-important code....
	:00406038 E8924D0000              call 0040ADCF
	:0040603D 85C0                    test eax, eax
	:0040603F 7473                    je 004060B4
	
	* Possible StringData Ref from Data Obj ->" - *UNREGISTERED*"
	                                  |
	:00406041 68E83E4300              push 00433EE8
 
   Hmm..doesn't it look like that code we've already seen? Yes it does and it
   would therefor we obvious to patch the JE but not in this case. If you
   look a bit down you will see this:
 
* Possible StringData Ref from Data Obj ->"The temporary license is now %d.."
 
   So this means that both msgs are in the same call. So let's just make the
   program skip that call completely. Scroll up (about 4 lines) until you see:
 
	:00405FE3 E8B4120000              call 0040729C
	:00405FE8 85C0                    test eax, eax
	:00405FEA 750F                    jne 00405FFB
 
   Looks familiar? Yeah! So let's change that JNE to skip the call. Once again
   you place the green bar on top of the JNE-line and NOTE the offset.
   (Offset: 00004BEA)
 
5) Ok..this should pretty much cover the expiration-thing and part of the
   name/serial, but we still have one more byte to go. When you register, the
   program will save your info and compare it at startup. We need to remove
   that check to make the patch 100% successfull. You will see this check when
   you patch the 3 places and run the program. You'll get this message:
   "License data is not valid"
 
6) So..restore the SDR window and double-click that msg too. Close the SDR
   window and you should be located about here:
 
      :0040495D E86C5C0000              call 0040A5CE
      :00404962 85C0                    test eax, eax
      :00404964 7518                    jne 0040497E
      :00404966 C7832C06000001000000    mov dword ptr [ebx+0000062C], 00000001
      :00404970 6A00                    push 00000000
      :00404972 6A00                    push 00000000
 
      * Possible StringData Ref from Data Obj ->"License data is not valid."
      |
      :00404974 689E354300              push 0043359E
      :00404979 E86A480200              call 004291E8
 
   Once again you see a familiar check, so it shouldn't be hard to figure out
   what to do. Place the green bar on the JNE-line and NOTE the offset.
   (Offset: 00003564)
 
7) Ok..now you have all three offsets so let's patch. Run HIEW ATOMTIME.EXE.
 
8) Press  TWICE to go to decode-mode.
 
9) Press F5 and enter the first offset.    		(Offset: 0000514F)
   (As you remember it didn't say 74 or 75 like it normally does. It said:
   0F84 which means that we need to change the 84 to 85 (74 to 75) and we need
   to add 1 to the offset to get to that place. So the new offset is now:
   00005150
   - Press F5 and enter the NEW offset
   - Press F3 to edit, and enter 85
   - Press F9 to update the first byte
 
10) Press F5 and enter the second offset.  		(Offset: 00004BEA)
    - Press F3 to edit, and enter 74
    - Press F9 to update the second byte
 
11) Press F5 and enter the third (and last) offset.   	(Offset: 00003564)
    - Press F3 to edit, and enter 74
    - Press F9 to update the third byte
 
12) Press ESC a couple of times to quit HIEW, and you should now have a 100%
    working version of AtomTime.
 
Hope you enjoyed following another tut by me :)
 
All for now..Cya
返回
                         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
返回
初学天地:
解密教程四
                  解密教程四
                       程式猎人
  今天又到了我们解密授课时间了,现在大家作业完成的情况如何,没有收到大家的作业,
也不知道你们对我讲的那个典型的比较形式理解的如何,但是无论如何对于初学者来说一定
要记住这个比较方式,它将会大大的减少你的破解时间。
  好了,今天我们将另一种典型的比较方式,它的比较方式为:
   mov eax [   ]
   mov edx [   ]
   cmp eax,edx
   jnz(jz)
或者
begin  mov al [   ]
       mov cl [   ]
       cmp al,cl
       jnz(jz)
       mov al [  +1]
       mov cl [  +1]
       cmp al,cl
       jnz(jz)
       cmp eax ecx (eax为计数器)
       jnl begin
       mov al 01
  上面这个比较形式也是初学者应当掌握的,它在软件破解过程中也常常使用到,现在就向
大家举一个例子来介绍这个比较形式是如何进行工作的。
        Arclab cleaner V1.0
简介:磁盘清洁软件
下载:http://210.77.155.248/soft4/cleaner.zip
追踪:
  破解它还是我以前说过的方法,如下:
  1 先输入
      name:dahuilang
      company:program hunter
      RN:0123-4567-8901-23456
  2 ctrl+M调出TRW(crtl+D调出SI),在这里设bpx hmemcpy
  3 回到程序中,点击OK,TRW弹出。 
  4 在这里你可以使用F12,跳跃直到上面0040323D处就可以了。
  5 开始分析这个软件,将使用我介绍的典型的比较形式。
:0040323D 8D4C241C                lea ecx, dword ptr [esp+1C]
:00403241 51                      push ecx
:00403242 52                      push edx
:00403243 8D4C2444                lea ecx, dword ptr [esp+44]
:00403247 50                      push eax
:00403248 51                      push ecx
:00403249 8D8C2454020000          lea ecx, dword ptr [esp+00000254]
:00403250 E8AB090000              call 00403C00
:00403255 8B3D5CD04300            mov edi, dword ptr [0043D05C]
:0040325B 8D44241C                lea eax, dword ptr [esp+1C]
:0040325F 8BF7                    mov esi, edi
:00403261 33DB                    xor ebx, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403281(C)
|
:00403263 8A10                    mov dl, byte ptr [eax]
:00403265 8ACA                    mov cl, dl
:00403267 3A16                    cmp dl, byte ptr [esi]
:00403269 751C                    jne 00403287
:0040326B 3ACB                    cmp cl, bl
:0040326D 7414                    je 00403283
:0040326F 8A5001                  mov dl, byte ptr [eax+01]
:00403272 8ACA                    mov cl, dl
:00403274 3A5601                  cmp dl, byte ptr [esi+01]
:00403277 750E                    jne 00403287
:00403279 83C002                  add eax, 00000002
:0040327C 83C602                  add esi, 00000002
:0040327F 3ACB                    cmp cl, bl
:00403281 75E0                    jne 00403263

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040326D(C)
|
:00403283 33C0                    xor eax, eax
:00403285 EB05                    jmp 0040328C
   上面这个软件就是这课的教学软件,它是一个磁盘清洁软件。
   如果你没有这个软件就来看一看我上面的破解过程。对于这个软件的破解就要使用到我
今天向大家介绍的注册比较方式。
   现在大家可以看到了上面的关键比较地方了吧。我这课介绍的比较形式如下:
begin  mov al [   ]
       mov cl [   ]
       cmp al,cl
       jnz(jz)
       mov al [  +1]
       mov cl [  +1]
       cmp al,cl
       jnz(jz)
       cmp eax ecx (eax为计数器)
       jnl begin
       mov al 01
  你们看一看上面也有着与它相似的地方为:
:00403263 8A10                    mov dl, byte ptr [eax]
:00403265 8ACA                    mov cl, dl
:00403267 3A16                    cmp dl, byte ptr [esi]
:00403269 751C                    jne 00403287
:0040326B 3ACB                    cmp cl, bl
:0040326D 7414                    je 00403283
:0040326F 8A5001                  mov dl, byte ptr [eax+01]
:00403272 8ACA                    mov cl, dl
:00403274 3A5601                  cmp dl, byte ptr [esi+01]
:00403277 750E                    jne 00403287
:00403279 83C002                  add eax, 00000002
:0040327C 83C602                  add esi, 00000002
:0040327F 3ACB                    cmp cl, bl
:00403281 75E0                    jne 00403263
  这里同我介绍的比较形式是大同小异,我将它们列为一个比较方式中,在这里你就可以得
到这个软件的注册码,如下:
                      ******************************
                      *     name:dahuilang         *
                      *    company:program hunter  *
                      *    RN:5986-7754-4424-24144 *
                      ******************************
   如何,其实破解就这么的简单,你只要掌握了典型的比较形式,破解软件是一个相当EAS
Y的事情(对于简单是这样的,对于难度高的也是从这里出发的)。

   现在我想介绍一下我以后讲课的计划,我在开始写这个教程时,计划是按照注册方式来
向大家介绍如何破解软件的注册过程,但是我现在觉得应当先大家介绍破解过程中常用到的
比较形式,因为如果掌握了这个对于破解不同的注册方式软件都是一样的,所以现在我将计
划改为先介绍破解过程常用的比较形式,待到比较形式介绍完后我将系统的介绍注册的不同
方式。这样大家会更好的掌握破解这门技术。
  好了,今天就就到这里,大家可以下课了。
  你为什么还留下来呢?
  你还没有给我留作业呢?
  我本想大家都很忙就不用给你留作业了,没有想到还有你这么一个爱学习的人,那好,我
就给你一个人留个作业吧。
  你可以下载这个软件BuddyPhone V2.0回家后进行破解。希望你能够破解成功,并且将你
破解的过程写出来,记住一定要交作业,否则……
  喂,喂……
  嘿!!!现在的学生不同于我们那个时代的了。
返回
问题答疑:
 
返回
网站介绍:
技术资料网站:http://www.free51.net
这期向大家介绍的这个网站也是一个解密网站,在这里你可以得到解密文章,解密工具等东西,如果你觉得自己的破解水平还不够,可以到这个网站看一看,在这里你将能够使自己的破解水平得以提高。能吗?不信你就去看一看就知道了。
返回
杂志信箱:
投稿信箱:discoveredit@china.com
答疑信箱:discoveranswer@china.com
斑竹信箱:programhunter@china.com
返回