• 标 题:Tutor 11  How to crack WebZIP V2.72.135
  • 作 者:dREAMtHEATER
  • 时 间:20th, August 1999
  • 链 接:http://bbs.pediy.com

作者:dREAMtHEATER
E-mail:dreamtheater@263.net
写作日期: 20th, August 1999

软件背景资料

运行平台: Win9X/NT4
文件名称: WEBZIP272.EXE
程序类型: InterNet工具
下载地点: http://www.spidersoft.com
文件大小: 1,314KB

使用的工具

W32Dasm V8.93--Win9X Dissembler&Debugger
Hex WorkShop V2.54--Hex Editor
RegSnap V2.51--Registry Analyzing Tool
Registry Studio V1.01--Enhanced Registry Editor

难易程度

Easy( )  Medium(x)  Hard( )  Pro( )

                  ----------=======声明========----------

      未经作者同意,不得修改、引用原文,一切权利保留。
      本教程只供教学用,其他一切用途皆被禁止。
             
                  ----------=======软件介绍========----------
   
      WebZip是目前一个非常流行的网站下载软件,它的很大的一个卖点就是可将下载的站点压缩
为一个Zip文件,方便传输及节省磁盘空间,另外它的界面相当的漂亮,并且可换Skins,同类软件中
它应是你首选的。不过我认为它的不足是启动时间过长,经我检查,此软件又是用Delphi编写的,
而且用了很多第三方的控件,太多的功能必然导致占据较多的系统资源,对于我来说,我不喜欢这
种过多占用系统资源的软件,你呢?

                ----------=======软件的保护机制========-------
     
      又是Name/Code保护形式,试用期28天,试用期或过期后,如若往回调整系统时间,程序均会
提醒你将系统时间调回,如果是在试用期间调整的,那么将直接导致试用期结束,结束后程序每个
下载任务最多包括50个网页。
      未注册时,每次启动均有nag,提醒你还剩多少天的试用期。
      用RegSnap拍照、分析注册表后,得知时间与注册信息保存在:
HKEY_USERS\.DEFAULT\Software\Microsoft\IFind\
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Metrics\
两处的键值是完全一模一样的,这就相当于在其中的一处做了备份,试用期过后,只有将两处的键
值同时删去,才能重新获得28天试用期。另外,键值的内容是加密的,包括注册信息,下面是程序
在我的注册表里生成的时间记录值(sample):
4u8h儎厗噲墛E=@I@DCDE敃枟RJMVMQPQR、¥Y`Ж┆f]`f`dcde吹斗nnpo哎究懒旅呐

                  ----------========正文========----------

      这个软件如果你没有足够的crack经验,我想几天之内休想破解掉它。我曾经先后几次破解
此软件,但均以失败告终,但昨天站长Cflanker让我帮帮忙,把此软件破掉,于是我抱着最后一线
希望又拿它开刀了!老天真给我面子,这会我终于找到了切入点,看来做什么事情都需要讲究点方
式方法(怎么那么多废话!得!各位看官着急了,我这就话回正题)。
      还是老规矩,请出我们的老朋友--W32Dasm,反汇编、等待(够你歇会儿的),OK!
      还是先去“String Data References”看看有没有可值得参考的字符串,在这里,我想要的
信息都找到了,我分别到代码窗口去寻找他们对应的代码,看看有没有CALL/TEST/JNE这样的经典结
构,或者reg flag这样的全局变量,很不幸,我迷失在“汇编”丛林中。我可以推测出这些相应的
代码是被寄存器间接寻址方式呼叫的,因此只有在Debugger状态下才能找到源头!
      真的没有办法了吗?我开始漫无边际地寻找,也许幸运之神很青睐我,请看下面的代码:

:004E28A8 8B45FC                  mov eax, dword ptr [ebp-04]
:004E28AB E8241AF2FF              call 004042D4
:004E28B0 50                      push eax

* Reference To: SHRLK20.InputUnlockCode, Ord:0000h  《==调用动态链结库SHRLK20.DLL的
InputUnlockCode函数
                                  |
:004E28B1 E872F9FFFF              Call 004E2228
:004E28B6 33C0                    xor eax, eax
:004E28B8 5A                      pop edx
:004E28B9 59                      pop ecx
       
      我终于大彻大悟,原来所有的秘密都在这个SHRLK20.DLL动态链结库里,怪不得找不到CALL的
源头。
      接下来我到W32代码窗口开始部分的“IMPORTED FUNCTIONS”处看看程序调用了SHRLK20.DLL
的哪些函数(如下):

  Import Module 021: SHRLK20.DLL

Addr:0011BE5C hint(0000) Name: PassHandle
Addr:0011BE6A hint(0000) Name: InputUnlockCode
Addr:0011BE7C hint(0000) Name: GetUserName
Addr:0011BE8A hint(0000) Name: GetTryNumber
Addr:0011BE9A hint(0000) Name: GetTrialPeriodRemaining
Addr:0011BEB4 hint(0000) Name: CheckProtectionDLL

      各个函数的名称非常直接了当,不用我再多说了吧!我非常关心“PassHandle”这个函数,
它极有可能是程序启动时调用的函数。在W32Dasm的search窗口,输入“PassHandle”,查找的结果
有两处,其中一处是由下面的代码呼叫出来的,可不予考虑:

* Referenced by a CALL at Address:
|:0050A8B4 
|
:004E2780 55                      push ebp
:004E2781 8BEC                    mov ebp, esp
:004E2783 6A00                    push 00000000
:004E2785 53                      push ebx
:004E2786 8BD8                    mov ebx, eax
:004E2788 33C0                    xor eax, eax
:004E278A 55                      push ebp
:004E278B 6824284E00              push 004E2824
:004E2790 64FF30                  push dword ptr fs:[eax]
:004E2793 648920                  mov dword ptr fs:[eax], esp
:004E2796 8B4324                  mov eax, dword ptr [ebx+24]
:004E2799 50                      push eax

* Reference To: SHRLK20.PassHandle, Ord:0000h
                                  |
:004E279A E891FAFFFF              Call 004E2230  〈==trace进去,还是呼叫“
SHRLK20.PassHandle”
:004E279F 33C0                    xor eax, eax
:004E27A1 8A4344                  mov al, byte ptr [ebx+44]
:004E27A4 50                      push eax
:004E27A5 33C0                    xor eax, eax
:004E27A7 8A4370                  mov al, byte ptr [ebx+70]
:004E27AA 50                      push eax
:004E27AB 8B4354                  mov eax, dword ptr [ebx+54]
:004E27AE 50                      push eax
:004E27AF 8B4350                  mov eax, dword ptr [ebx+50]
:004E27B2 50                      push eax
:004E27B3 8B434C                  mov eax, dword ptr [ebx+4C]
:004E27B6 50                      push eax
:004E27B7 8B4368                  mov eax, dword ptr [ebx+68]
:004E27BA E8151BF2FF              call 004042D4
:004E27BF 50                      push eax
:004E27C0 8B4360                  mov eax, dword ptr [ebx+60]
:004E27C3 E87C99F2FF              call 0040C144
:004E27C8 83C4F8                  add esp, FFFFFFF8
:004E27CB DD1C24                  fstp qword ptr [esp]
:004E27CE 9B                      wait
:004E27CF 8D55FC                  lea edx, dword ptr [ebp-04]

* Possible StringData Ref from Code Obj ->"ddddd"
                                  |
:004E27D2 B838284E00              mov eax, 004E2838
:004E27D7 E8A091F2FF              call 0040B97C
:004E27DC 8B45FC                  mov eax, dword ptr [ebp-04]
:004E27DF E8F01AF2FF              call 004042D4
:004E27E4 50                      push eax
:004E27E5 8B436C                  mov eax, dword ptr [ebx+6C]
:004E27E8 E8E71AF2FF              call 004042D4
:004E27ED 50                      push eax
:004E27EE 8B4364                  mov eax, dword ptr [ebx+64]
:004E27F1 E8DE1AF2FF              call 004042D4
:004E27F6 50                      push eax
:004E27F7 8B432C                  mov eax, dword ptr [ebx+2C]
:004E27FA E8D51AF2FF              call 004042D4
:004E27FF 50                      push eax
:004E2800 8B4328                  mov eax, dword ptr [ebx+28]
:004E2803 E8CC1AF2FF              call 004042D4
:004E2808 50                      push eax

* Reference To: SHRLK20.CheckProtectionDLL, Ord:0000h
                                  |
:004E2809 E8FAF9FFFF              Call 004E2208  <==此处出现nag
:004E280E 33C0                    xor eax, eax
:004E2810 5A                      pop edx
:004E2811 59                      pop ecx
:004E2812 59                      pop ecx
:004E2813 648910                  mov dword ptr fs:[eax], edx

* Possible StringData Ref from Code Obj ->"[Y]"
                                  |
:004E2816 682B284E00              push 004E282B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E2829(U)
|
:004E281B 8D45FC                  lea eax, dword ptr [ebp-04]
:004E281E E86116F2FF              call 00403E84
:004E2823 C3                      ret

      为了验证以上结论,我是在W32Dasm的Debugger状态下通过的,具体操作方式请看W32Dasm的
Help。
      再让我们去呼叫此部分代码的上一个CALL去瞧瞧,即:0050A8B4处

:0050A891 E8BA85FCFF              call 004D2E50
:0050A896 B201                    mov dl, 01
:0050A898 A1B4674F00              mov eax, dword ptr [004F67B4]
:0050A89D E88EBFFEFF              call 004F6830
:0050A8A2 A32C815100              mov dword ptr [0051812C], eax
:0050A8A7 8BC3                    mov eax, ebx
:0050A8A9 E85AEBFFFF              call 00509408
:0050A8AE 8B8314030000            mov eax, dword ptr [ebx+00000314]
:0050A8B4 E8C77EFDFF              call 004E2780  〈==呼叫nag
:0050A8B9 A104695100              mov eax, dword ptr [00516904]
:0050A8BE 8B00                    mov eax, dword ptr [eax]
:0050A8C0 E84364F4FF              call 00450D08
:0050A8C5 A104695100              mov eax, dword ptr [00516904]
:0050A8CA 8B00                    mov eax, dword ptr [eax]
:0050A8CC 80B88400000000          cmp byte ptr [eax+00000084], 00
:0050A8D3 0F85BC010000            jne 0050AA95
:0050A8D9 C683D507000000          mov byte ptr [ebx+000007D5], 00
:0050A8E0 B201                    mov dl, 01

      为了进一步验证,在W32Dasm的Debugger状态下,在:0050A8B4处设断点,又一次验证了结论,
程序执行完此行后,出现nag;将你的系统时间往前调整,再次用此方法验证,还是在这个CALL里出
现提醒你将系统时间调回的messagebox。看来这个CALL是处理程序启动时检查注册信息、试用期是
否已过的部分!
      接下来,我试着把此CALL Nop掉,重新运行程序,Bingo!nag没了,窗口的title处也不再有
还剩多少天的适用期的提示,Cool!为了进一步验证,我将系统时间调前调后均没有任何影响,看来
可以收兵了!

The Patch

      在文件WebZIP.exe的offset:00109CB4h处,将E8C77EFDFF修改为9090909090,但这不是最好
的办法,你应该知道机器码E8xxxxxxxx代表CALL xxxxxxxx,而B8xxxxxxxx代表MOV eax, xxxxxxxx,
这样只需将E8改为B8即可,是不是很cool,只改半个字节就让程序百分之百注册!

                  ---------========The Final========----------
     
      这回你知道了,在W32Dasm中,除了“String Data References”以外,“IMPORTED
FUNCTIONS”也很重要哦!
      祝你好运!下节见。