|
|
|
|
|
|
|
|

首 页:|业界资讯|:图形图像|:网络冲浪|:操作系统|:工具软件|:办公软件|:媒体动画|:精文荟萃|:认证考试|:网页设计|:技术开发 |:专 栏|

  当前位置:飓风软件下载网络学院工具软件破解文章 → CuteFTP V4.2.4之暴力破解

(出处:飓风网络)

CuteFTP V4.2.4之暴力破解
日期:2004年10月15日 作者:蓝点 人气: 查看:[大字体 中字体 小字体]
CuteFTP这个软件可能有些人不是很熟悉,不过对于网上的各位斑竹来说它就再熟悉不过了,因为CuteFTP是使用FTP上传网页的最佳工具,当然一般人也可以用它来下载FTP上的东西。
  CuteFTP的加密保护比较狡猾,即便是我们跟踪程序得到正确注册码,可程序本身仅仅是验证输入的用户名是否跟注册码相对应而已,然后随即登录到GLOBALSCAPE公司的服务器,在服务器的数据库中查找是否输入的用户名已经注册在案,因为我们根本就没有进行什么电子注册,所以服务器返回的结果肯定只有失败喽!可恶的是,当一个月的试用期限一到,它便再也不允许使用,此刻即便是卸载后再重新安装也无济于事,也许你会想到它肯定在注册表里做了手脚,那么我们找到并删除注册表中的CuteFTP子键,结果发现问题依旧,还是不能使用,除非你重装整个系统(而且要格式化C盘,太夸张了吧^_^!〕,除了看见那幅硬逼着人注册的画面以外就没有其它的东西了。
  按照常规的破解思路,在这个软件的破解过程中,我们首先会去试着取得正确的注册码,进而发现得到正确的注册码是枉费心机,随后我们被逼无奈才要想办法使用暴力对它开肠破肚,让它乖乖的听我们使唤,我想这样其实才是破解的真实过程再现。因为暴力破解始终是不得已而为之的行为,在平常的破解过程中我们你应该力求找到正确的注册码,而不要一开始就来个暴破,这样虽然是吐一时之痛快,可对我们自身破解能力的提高是没有多少好处的,况且这个软件的暴破并不象一般软件那么简单,因为它会对自身代码的完整性进行校验,一旦发现代码被修改就会立即退出,所以不是简单地在关键比较处使用一个JZ<-->JNZ替换就能搞定的。

程序名 :CuteFTP
版本   :V4.2.4 Build 6.25.1
大小   :1,687KB
运行平台:Windows
保护方式:注册码(网络鉴别〕
破解方式:暴力破解
破解难度:中等
程序下载:cuteftp424.zip

破解步骤:

1. 用softice载入windows(通过CTRL+D来检查softice是否已经准备好,按F5退出);

2. 运行CuteFTP,程序首先弹出注册画面,分别有三个选项:Buy Now(立即购买)、Enter Serial Number(输入注册码)、Continue Trial(继续试用);

3. 关闭CuteFTP,将你的windows系统时间调后一年(比如从2002年改成2003年),重新启动CuteFTP,此时你发现原来那个启动画面有了一点点的变化:Buy Now(立即购买)、Enter Serial Number(输入注册码)、Close(关闭),“Continue Trial(继续试用)”选项变成了“Close(关闭)”,也就是你不能再继续使用CuteFTP;

4. 现在你可以试先卸载CuteFTP,然后重新安装,你会发现仍然是“Close(关闭)”,即不得再次使用它了;既然反安装不管用,那么我们就在注册表中找到CuteFTP的子键,随后删掉它:HKEY_CURRENT_USER\Software\GlobalSCAPE\CuteFTP4.0,结果你会发现问题依旧,真是可恶!为什么要这么这样做?-- 这就叫做“置之死地而后生”,该是时候破解它了,要不然怎么使用呢?

5. 点击“Enter Serial Number(输入注册码)”,在“Serial Number:”中输入“12345678”,“Registered User Name:”中输入“ddcrack”;

6. 用CTRL+D呼出softice,下万能断点:bpx hmemcpy,按F5返回CuteFTP;

7. 点击CuteFTP的“Register”按钮,很快程序就被softice拦截下来;

8. 用 bd * 暂停断点 bpx hmemcpy ;

9. 按F12键8次,返回到CuteFTP的领空,程序停留在下面的地方:
。。。
0167:004E4516  CALL      [USER32!GetWindowTextA]
0167:004E451C  MOV       ECX,[EBP+10]                <-- 我们来到这里
0167:004E451F  PUSH      FF
0167:004E4521  CALL      004DCA6F
0167:004E4526  JMP       004E4533                    <-- 跳到004E4533去结束这段CALL
0167:004E4528  MOV       EAX,[EBP+10]
0167:004E452B  PUSH      DWORD PTR [EAX]
0167:004E452D  PUSH      ESI
0167:004E452E  CALL      004E2C79
0167:004E4533  POP       EDI
0167:004E4534  POP       ESI
0167:004E4535  POP       EBP
0167:004E4536  RET       000C
。。。
10. 看到上面那个CALL [USER32!GetWindowTextA]了吗?其作用是获取我们输入的信息,这段程序取得输入信息之后就退出了,所以没什么好看的,我们按一下F12走出这个CALL:
。。。
0167:00491403  CALL      004E44E7                   <-- 这就上面程序段的那个CALL
0167:00491408  PUSH      50                         <-- 走出上面的CALL后来到里
0167:0049140A  PUSH      EBX
0167:0049140B  PUSH      ESI
0167:0049140C  CALL      004E47C5
0167:00491411  LEA       EBX,[EDI+68]
0167:00491414  PUSH      EBX
0167:00491415  PUSH      000004DA
0167:0049141A  PUSH      ESI
0167:0049141B  CALL      004E44E7
0167:00491420  PUSH      50
0167:00491422  PUSH      EBX
0167:00491423  PUSH      ESI
0167:00491424  CALL      004E47C5
0167:00491429  LEA       EBX,[EDI+6C]
0167:0049142C  PUSH      EBX
0167:0049142D  PUSH      000004BA
0167:00491432  PUSH      ESI
0167:00491433  CALL      004E44E7
0167:00491438  PUSH      50
0167:0049143A  PUSH      EBX
0167:0049143B  PUSH      ESI
0167:0049143C  CALL      004E47C5
0167:00491441  LEA       EBX,[EDI+70]
0167:00491444  PUSH      EBX
0167:00491445  PUSH      00000581
0167:0049144A  PUSH      ESI
0167:0049144B  CALL      004E44E7
0167:00491450  PUSH      50
0167:00491452  PUSH      EBX
0167:00491453  PUSH      ESI
0167:00491454  CALL      004E47C5
0167:00491459  LEA       EBX,[EDI+74]
0167:0049145C  PUSH      EBX
0167:0049145D  PUSH      000004DB
0167:00491462  PUSH      ESI
0167:00491463  CALL      004E44E7
0167:00491468  PUSH      50
0167:0049146A  PUSH      EBX
0167:0049146B  PUSH      ESI
0167:0049146C  CALL      004E47C5
0167:00491471  LEA       EBX,[EDI+78]
0167:00491474  PUSH      EBX
0167:00491475  PUSH      00000593
0167:0049147A  PUSH      ESI
0167:0049147B  CALL      004E44E7
0167:00491480  PUSH      50
0167:00491482  PUSH      EBX
0167:00491483  PUSH      ESI
0167:00491484  CALL      004E47C5
0167:00491489  LEA       EBX,[EDI+7C]
0167:0049148C  PUSH      EBX
0167:0049148D  PUSH      00000591
0167:00491492  PUSH      ESI
0167:00491493  CALL      004E44E7
0167:00491498  PUSH      50
0167:0049149A  PUSH      EBX
0167:0049149B  PUSH      ESI
0167:0049149C  CALL      004E47C5
0167:004914A1  LEA       EBX,[EDI+00000080]
0167:004914A7  PUSH      EBX
0167:004914A8  PUSH      0000058E
0167:004914AD  PUSH      ESI
0167:004914AE  CALL      004E44E7
0167:004914B3  PUSH      50
0167:004914B5  PUSH      EBX
0167:004914B6  PUSH      ESI
0167:004914B7  CALL      004E47C5
0167:004914BC  LEA       EBX,[EDI+00000088]
0167:004914C2  PUSH      EBX
0167:004914C3  PUSH      0000058B
0167:004914C8  PUSH      ESI
0167:004914C9  CALL      004E44E7
0167:004914CE  PUSH      50
0167:004914D0  PUSH      EBX
0167:004914D1  PUSH      ESI
0167:004914D2  CALL      004E47C5
0167:004914D7  LEA       EBX,[EDI+00000090]
0167:004914DD  PUSH      EBX
0167:004914DE  PUSH      00000587
0167:004914E3  PUSH      ESI
0167:004914E4  CALL      004E44E7
0167:004914E9  PUSH      50
0167:004914EB  PUSH      EBX
0167:004914EC  PUSH      ESI
0167:004914ED  CALL      004E47C5
0167:004914F2  LEA       EBX,[EDI+00000094]
0167:004914F8  PUSH      EBX
0167:004914F9  PUSH      000004DE
0167:004914FE  PUSH      ESI
0167:004914FF  CALL      004E44E7
0167:00491504  PUSH      14
0167:00491506  PUSH      EBX
0167:00491507  PUSH      ESI
0167:00491508  CALL      004E47C5
0167:0049150D  ADD       EDI,00000098
0167:00491513  PUSH      EDI
0167:00491514  PUSH      000004ED
0167:00491519  PUSH      ESI
0167:0049151A  CALL      004E44E7
0167:0049151F  PUSH      50
0167:00491521  PUSH      EDI
0167:00491522  PUSH      ESI
0167:00491523  CALL      004E47C5
0167:00491528  POP       EDI
0167:00491529  POP       ESI
0167:0049152A  POP       EBX
0167:0049152B  RET       0004
。。。
11. 上面的程序段比较长,可是大家不要害怕,因为这段程序更本就没有任何值得怀疑的地方,换句话说,也就是没有任何的比较指令,当然也就没有判断注册码的关键所在,所以我们不用理它,再按F12退出这里:
。。。
0167:004DAF6F  CALL      [EAX+00000084]
0167:004DAF75  MOV       DWORD PTR [EBP+08],00000001  <-- 到这里来了
0167:004DAF7C  JMP       004DAFA5                     <-- 跳到004DAFA5去
0167:004DAF7E  MOV       EAX,004DAFA2
0167:004DAF83  RET
0167:004DAF84  MOV       ESI,[EBP-1C]
0167:004DAF87  PUSH      0000F108
0167:004DAF8C  PUSH      30
0167:004DAF8E  MOV       ECX,ESI
0167:004DAF90  MOV       EAX,[ESI]
0167:004DAF92  CALL      [EAX+10]
0167:004DAF95  MOV       ECX,ESI
0167:004DAF97  CALL      004DE370
0167:004DAF9C  MOV       EAX,004DAFA2
0167:004DAFA1  RET
0167:004DAFA2  MOV       EDI,[EBP-14]
0167:004DAFA5  MOV       EAX,[EBP-18]
0167:004DAFA8  MOV       ECX,[EBP-0C]
0167:004DAFAB  MOV       [EDI+000000B8],EAX
0167:004DAFB1  MOV       EAX,[EBP+08]
0167:004DAFB4  POP       EDI
0167:004DAFB5  POP       ESI
0167:004DAFB6  MOV       FS:[00000000],ECX
0167:004DAFBD  POP       EBX
0167:004DAFBE  LEAVE
0167:004DAFBF  RET       0004
。。。
12. 看出上面的程序有什么问题吗?-- 是的,没有,都是垃圾!我们继续按F12跳出这一层CALL:
。。。
0167:0049155F  CALL      004DAF20
0167:00491564  TEST      EAX,EAX                     <-- 走出上面的CALL后来到里
0167:00491566  JZ        00491B28                    <-- 比较什么,不管它!
0167:0049156C  LEA       EDI,[ESI+00000094]
0167:00491572  MOV       DWORD PTR [ESP+0C],7FFFFFFF
0167:0049157A  MOV       ECX,EDI
0167:0049157C  CALL      004D3499
0167:00491581  MOV       ECX,EDI
0167:00491583  CALL      004D33E5
0167:00491588  MOV       EAX,[EDI]
0167:0049158A  MOV       ECX,ESI
0167:0049158C  PUSH      EAX
0167:0049158D  PUSH      000004DE
0167:00491592  CALL      004DBA5D
0167:00491597  PUSH      00
0167:00491599  MOV       ECX,EDI
0167:0049159B  CALL      004DCA20
0167:004915A0  PUSH      EAX                        <-- 注意:EAX指向我们输入的注册码“12345678”
0167:004915A1  LEA       EAX,[ESP+10]
0167:004915A5  PUSH      EAX
0167:004915A6  CALL      004B7240                   <-- 按F8杀进去
0167:004915AB  ADD       ESP,08
0167:004915AE  TEST      AX,AX
0167:004915B1  JNZ       00491621
0167:004915B3  LEA       ECX,[ESP+14]
0167:004915B7  PUSH      0000F05D
0167:004915BC  PUSH      ECX
0167:004915BD  CALL      00425450
0167:004915C2  MOV       EDI,[EAX]
0167:004915C4  LEA       EDX,[ESP+18]
0167:004915C8  PUSH      0000F057
0167:004915CD  PUSH      EDX
0167:004915CE  MOV       DWORD PTR [ESP+68],00000000
0167:004915D6  CALL      00425450
0167:004915DB  ADD       ESP,10
0167:004915DE  MOV       EAX,[EAX]
0167:004915E0  PUSH      00
0167:004915E2  PUSH      EDI
0167:004915E3  PUSH      EAX
0167:004915E4  MOV       ECX,ESI
0167:004915E6  MOV       BYTE PTR [ESP+64],01
0167:004915EB  CALL      004DA2A9
0167:004915F0  LEA       ECX,[ESP+10]
0167:004915F4  MOV       BYTE PTR [ESP+58],00
0167:004915F9  CALL      004DC5F0
0167:004915FE  LEA       ECX,[ESP+14]
0167:00491602  MOV       DWORD PTR [ESP+58],FFFFFFFF
0167:0049160A  CALL      004DC5F0
0167:0049160F  MOV       ECX,[ESP+50]
0167:00491613  MOV       FS:[00000000],ECX
0167:0049161A  POP       EDI
0167:0049161B  POP       ESI
0167:0049161C  POP       EBP
0167:0049161D  ADD       ESP,50
0167:00491620  RET
。。。
13. 上面的程序有些意思了,一开始我们就碰到一条0167:00491564 TEST EAX,EAX,什么作用呢?-- 我们不用去关心?为啥?-- 因为我们一路跟踪程序来到这里,似乎并没有发现对注册码进行运算的地方,所以程序没有理由在这里就已经知道注册码的正确与否!其实这是个小技巧,通常跟踪程序时我们从程序领空一步一步退回到其核心部分时都会立马碰上这样一条指令,其作用无非是判断用户是否输入了正确的字符(例如用户名或注册码不能为“空”,不能为某些字符等等);

14. 按F10往下跟踪,走到0167:004915A0 PUSH EAX时我们发现它下面有个CALL和比较指令,所以我们要格外留意这里,用命令 D EAX,可以发现内存中藏着我们输入的注册码“12345678”,走到0167:004915A5 PUSH EAX时也用 D EAX,不过什么也没发现;那么0167:004915A6处的CALL 004B7240有什么作用,我们要观察一下:鼠标双击0167:004915A0 PUSH EAX,在此设置一断点,然后按F10一直往下走,当走过0167:004915EB CALL 004DA2A9时CuteFTP弹出错误框,提示输入的注册码无效,OK,CALL 004B7240肯定跟注册码的验证息息相关,让我们进去看看;

15. 重新进行注册,按“Register”之后我们马上来到刚才设置过断点的0167:004915A0 PUSH EAX处,走到CALL 004B7240时按F8杀进去:

。。。
0167:004B7240  SUB       ESP,20
0167:004B7243  OR        ECX,-01
0167:004B7246  XOR       EAX,EAX
0167:004B7248  PUSH      ESI
0167:004B7249  MOV       ESI,[ESP+2C]
0167:004B724D  PUSH      EDI
0167:004B724E  MOV       EDI,ESI                    <-- EDI指向我们输入的注册码“12345678”
0167:004B7250  REPNZ SCASB
0167:004B7252  NOT       ECX
0167:004B7254  DEC       ECX
0167:004B7255  CMP       ECX,0E                     <-- 注册码位数是14位吗?
0167:004B7258  JNZ       004B72CD                   <-- 不是,GAME OVER!
。。。
0167:004B72CD  MOV       ECX,[ESP+2C]
0167:004B72D1  POP       EDI
0167:004B72D2  XOR       AX,AX
0167:004B72D5  POP       ESI
0167:004B72D6  MOV       DWORD PTR [ECX],FFFFFFFF
0167:004B72DC  ADD       ESP,20
0167:004B72DF  RET
。。。
16. 上面这段程序作用很简单,就是判断我们输入的注册码是否是14位,如果不是,程序就提前结束,因为我们输入的注册码是8位,按照程序正常的执行顺序,肯定会在0167:004B7258 JNZ 004B72CD时提前出局的,为了骗过程序,当走到0167:004B7258 JNZ 004B72CD时用命令 RFL Z,然后我们就可以继续往下走了:
。。。
0167:004B7258  JNZ       004B72CD                  <-- 不用跳过去了
0167:004B725A  PUSH      ESI                       <-- 这里开路^_^
0167:004B725B  CALL      004C53C3
0167:004B7260  PUSH      0E
0167:004B7262  LEA       EAX,[ESP+20]
0167:004B7266  PUSH      ESI
0167:004B7267  PUSH      EAX
0167:004B7268  CALL      004C2E70
0167:004B726D  LEA       ECX,[ESP+28]
0167:004B7271  MOV       BYTE PTR [ESP+36],00
0167:004B7276  PUSH      ECX
0167:004B7277  CALL      00499480
0167:004B727C  MOV       ESI,EAX
0167:004B727E  PUSH      ESI
0167:004B727F  CALL      00499170
0167:004B7284  LEA       EDX,[ESP+20]
0167:004B7288  MOV       EDI,EAX
0167:004B728A  PUSH      EDX
0167:004B728B  PUSH      ESI
0167:004B728C  MOV       BYTE PTR [ESP+28],00
0167:004B7291  CALL      00499300
0167:004B7296  LEA       EAX,[ESP+38]
0167:004B729A  PUSH      0E
0167:004B729C  LEA       ECX,[ESP+2C]
0167:004B72A0  PUSH      EAX                    <-- EAX指向我们输入的注册码“12345678”
0167:004B72A1  PUSH      ECX                    <-- EDI指向字符串“A2222222222222”
0167:004B72A2  CALL      004C3C20
0167:004B72A7  ADD       ESP,2C
0167:004B72AA  TEST      EAX,EAX
0167:004B72AC  JNZ       004B72BE
0167:004B72AE  MOV       EDX,[ESP+2C]
0167:004B72B2  OR        AX,FFFF
0167:004B72B6  MOV       [EDX],EDI
0167:004B72B8  POP       EDI
0167:004B72B9  POP       ESI
0167:004B72BA  ADD       ESP,20
0167:004B72BD  RET
。。。
17. 按F10继续往下跟踪,看见没有:0167:004B72A2处的CALL 004C3C20后面有比较,可疑!按F10走到CALL 004C3C20停下,分别用命令 D EAX 和 D ECX,我们可疑看到两串字符,一是输入的注册码“12345678”,二是字符串“A2222222222222”,哈哈,不用说,“A2222222222222”就是正确的注册码了!咋样?找到这里还不算难吧^_^

18. 按F5退出softice,输入用户名“ddcrack”和注册码“A2222222222222”,发现什么了?-- CuteFTP马上试图登录到GLOBALSCAPE公司的服务器,不论你的机是否已连上网,你都发现最终还是不能注册,尽管我们拥有“正确”的用户名和注册码,可是最终的验证不是在本地,而是在网络的另一端:GLOBALSCAPE公司的服务器。

19. 这真叫“敬酒不吃吃罚酒,给脸不要脸”,哈哈。。。,软的不行,我们只好来硬的,暴破!真是不好意思,但也是不得以而为之啊!^_^

20. 暴破第一步:因为程序不让我们使用,甚至是反安装、手动删掉注册标中的相应键值也不行,那么现在最要紧的就是让程序能够再次“试用”,即返回到最初安装时使用的状态。为什么我们做了那些努力仍然不能再次使用程序呢?原因只有一个:程序在某个地方做了手脚,在哪里呢?因为我们已经手动删掉了注册表中的CuteFTP子键,所以很可能程序不是在注册表中做的记号,而是在硬盘的某个文件里做了记号,好的,让我们去找吧!

21. 关闭退出CuteFTP,启动FileMon(在“破解工具”的“监测工具”里下载),接着启动CuteFTP,当CuteFTP重新弹出注册框时选择FileMon中“Option”下的“Capture Events”,这时“Capture Events”前面的钩号消失,即让FileMon暂停监视文件调用,我们在FileMon的输出窗口中找到有关Cutftp的项目,如下所示:
。。。
349	7:54:02 PM	Cutftp32	Directory	D:\TOOLS\CUTEFTP	SUCCESS	CHECK	
350	7:54:02 PM	Cutftp32	FindOpen	C:\WINDOWS\WIN.INI	SUCCESS	WIN.INI	
351	7:54:02 PM	Cutftp32	FindClose	C:\WINDOWS\WIN.INI	SUCCESS		
352	7:54:02 PM	Cutftp32	Open	C:\WINDOWS\WIN.INI	SUCCESS	OPENEXISTING READWRITE DENYWRITE 	
353	7:54:02 PM	Cutftp32	Ioctl	C:	SUCCESS	Subfunction: 08h	
354	7:54:02 PM	Cutftp32	Attributes	C:\WINDOWS\WIN.INI	SUCCESS	Get Modify	
355	7:54:02 PM	Cutftp32	Seek	C:\WINDOWS\WIN.INI	SUCCESS	End Offset: 0 / New offset: 0	
356	7:54:02 PM	Cutftp32	Seek	C:\WINDOWS\WIN.INI	SUCCESS	Beginning Offset: 0 / New offset: 0	
357	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\WIN.INI	SUCCESS	Offset: 0 Length: 9855	
358	7:54:02 PM	Cutftp32	Close	C:\WINDOWS\WIN.INI	SUCCESS	CLOSE_FINAL	
359	7:54:02 PM	Cutftp32	Attributes	D:\TOOLS\CUTEFTP\CUTFTP32.EXE.LOCAL	NOTFOUND	GetAttributes	
360	7:54:02 PM	Cutftp32	Seek	C:\WINDOWS\SYSTEM\MMSYSTEM.DLL	SUCCESS	Beginning Offset: 1841 / New offset: 1841	
361	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MMSYSTEM.DLL	SUCCESS	Offset: 1841 Length: 2935	
362	7:54:02 PM	Cutftp32	Seek	C:\WINDOWS\SYSTEM\MMSYSTEM.DLL	SUCCESS	Beginning Offset: 1841 / New offset: 1841	
363	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MMSYSTEM.DLL	SUCCESS	Offset: 1841 Length: 2935	
364	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\WSOCK32.DLL	SUCCESS	Offset: 24576 Length: 2560	
365	7:54:02 PM	Cutftp32	Attributes	D:\TOOLS\CUTEFTP\WS2_32.DLL	NOTFOUND	GetAttributes	
366	7:54:02 PM	Cutftp32	Attributes	C:\WINDOWS\SYSTEM\WS2_32.DLL	SUCCESS	GetAttributes	
367	7:54:02 PM	Cutftp32	Directory	C:\WINDOWS\SYSTEM\WS2_32.DLL	SUCCESS	QUERY	
368	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\WS2_32.DLL	SUCCESS	Offset: 61440 Length: 2560	
369	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MSVCRT.DLL	SUCCESS	Offset: 229376 Length: 4096	
370	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MSVCRT.DLL	SUCCESS	Offset: 229376 Length: 4096	
371	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MSVCRT.DLL	SUCCESS	Offset: 204800 Length: 4096	
372	7:54:02 PM	Cutftp32	Read	C:\WINDOWS\SYSTEM\MSVCRT.DLL	SUCCESS	Offset: 204800 Length: 4096	
373	7:54:02 PM	Cutftp32	Attributes	D:\TOOLS\CUTEFTP\WS2HELP.DLL	NOTFOUND	GetAttributes	
374	7:54:02 PM	Cutftp32	Attributes	C:\WINDOWS\SYSTEM\WS2HELP.DLL	SUCCESS	GetAttributes	
375	7:54:02 PM	Cutftp32	Directory	C:\WINDOWS\SYSTEM\WS2HELP.DLL	SUCCESS	QUERY	
。。。
下面还有行多省略掉了。。。
。。。
  注意:这里是关键,一定要仔细查看是否有可疑文件(也就是可能被CuteFTP做上标记的文件),你会发现CuteFTP除了效用一些动态链接库之外就没有什么异常活动了;看来问题并没有出在文件上,那么我们现在又只好怀疑到注册表身上去了;

21. 重新关闭退出CuteFTP,启动RegMon(在“破解工具”的“监测工具”里下载),接着启动CuteFTP,当CuteFTP重新弹出注册框时选择RegMon中“Option”下的“Capture Events”,这时“Capture Events”前面的钩号消失,让RegMon暂停注册表调用情况,在RegMon的输出窗口中找到有关Cutftp的项目,如下所示:
。。。
1822	6.48367440	Cutftp32	QueryValueEx	0xC1887480\WS2_32	NOTFOUND		
1823	6.48761440	Cutftp32	QueryValueEx	0xC1887480\MSVCRT	SUCCESS	"MSVCRT.DLL"	
1824	6.48934480	Cutftp32	QueryValueEx	0xC1887480\WS2HELP	NOTFOUND		
1825	6.49726320	Cutftp32	OpenKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS	hKey: 0xC69AAB20	
1826	6.49731040	Cutftp32	QueryValueEx	HKLM\Software\Microsoft\Windows\CurrentVersion\SubVersionNumber	SUCCESS	20 41 20 0 	
1827	6.49732960	Cutftp32	CloseKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS		
1828	6.49982160	Cutftp32	OpenKey	HKLM\System\CurrentControlSet\Services\Winsock\Autodial	SUCCESS	hKey: 0xC69AAB20	
1829	6.49987680	Cutftp32	QueryValueEx	HKLM\System\CurrentControlSet\Services\Winsock\Autodial\AutodialDllName32	SUCCESS	77 69 6E 69 6E 65 74 2E ...	
1830	6.49992240	Cutftp32	QueryValueEx	HKLM\System\CurrentControlSet\Services\Winsock\Autodial\AutodialFcnName32	SUCCESS	49 6E 74 65 72 6E 65 74 ...	
1831	6.50027760	Cutftp32	OpenKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS	hKey: 0xC69A9CA0	
1832	6.50031280	Cutftp32	QueryValueEx	HKLM\Software\Microsoft\Windows\CurrentVersion\ServicePackNumber	NOTFOUND		
1833	6.50034800	Cutftp32	QueryValueEx	HKLM\Software\Microsoft\Windows\CurrentVersion\SubVersionNumber	SUCCESS	20 41 20 0 	
1834	6.50036640	Cutftp32	CloseKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS		
1835	6.50041680	Cutftp32	OpenKey	HKLM\System\CurrentControlSet\Control\ProductOptions	NOTFOUND		
1836	6.50072000	Cutftp32	OpenKey	HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Performance	NOTFOUND		
1837	6.50078640	Cutftp32	OpenKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS	hKey: 0xC69A9CA0	
1838	6.50082480	Cutftp32	QueryValueEx	HKLM\Software\Microsoft\Windows\CurrentVersion\SubVersionNumber	SUCCESS	20 41 20 0 	
1839	6.50084320	Cutftp32	CloseKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS		
1840	6.50150320	Cutftp32	OpenKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS	hKey: 0xC69A9CA0	
1841	6.50154080	Cutftp32	QueryValueEx	HKLM\Software\Microsoft\Windows\CurrentVersion\SubVersionNumber	SUCCESS	20 41 20 0 	
1842	6.50155920	Cutftp32	CloseKey	HKLM\Software\Microsoft\Windows\CurrentVersion	SUCCESS		
1843	6.50184080	Cutftp32	OpenKey	HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings	SUCCESS	hKey: 0xC188A480	
1844	6.50189600	Cutftp32	CloseKey	HKLM\System\CurrentControlSet\Services\Winsock\Autodial	SUCCESS		
1845	6.50201600	Cutftp32	QueryValueEx	0xC1887480\MSWSOCK	NOTFOUND		
1846	6.50763920	Cutftp32	OpenKey	HKCU\Control Panel\Desktop	SUCCESS	hKey: 0xC69AAB20	
1847	6.50767840	Cutftp32	QueryValueEx	HKCU\Control Panel\Desktop\SmoothScroll	NOTFOUND		
1848	6.50769680	Cutftp32	CloseKey	HKCU\Control Panel\Desktop	SUCCESS		
1849	6.50781360	Cutftp32	OpenKey	HKCU\Control Panel\Mouse	NOTFOUND		
1850	6.51102160	Cutftp32	OpenKey	HKCR\CLSID	SUCCESS	hKey: 0xC188A570	
1851	6.51107760	Cutftp32	CreateKey	HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer	SUCCESS	hKey: 0xC188A5A0	
1852	6.51112640	Cutftp32	CreateKey	HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer	SUCCESS	hKey: 0xC188A5D0	
1853	6.51185120	Cutftp32	OpenKey	HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Documents	SUCCESS	hKey: 0xC69AAB20	
1854	6.51188080	Cutftp32	QueryValueEx	HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Documents\DisableStartInMyDocs	NOTFOUND		
1855	6.51190320	Cutftp32	QueryValueEx	HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Documents\HideMyDocsFolder	NOTFOUND		
1856	6.51192480	Cutftp32	CloseKey	HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Documents	SUCCESS		
。。。
下面还有行多省略掉了。。。
。。。
3333	6.81469040	Cutftp32	CloseKey	HKCU\software\GlobalSCAPE\CuteFTP 4.0	SUCCESS		
3334	6.81473760	Cutftp32	OpenKey	0xC69AA790\CuteFTP	SUCCESS	hKey: 0xC69AAA70	
3335	6.81476000	Cutftp32	CloseKey	0xC69AA790	SUCCESS		
3336	6.81478640	Cutftp32	QueryValueEx	0xC69AA790\CuteFTP\StartUp	SUCCESS	0xC8	
3337	6.81480240	Cutftp32	CloseKey	0xC69AA790\CuteFTP	SUCCESS		
3338	6.81549920	Cutftp32	DeleteKey	HKCR\ram\CFK12	NOTFOUND		
3339	6.81618080	Cutftp32	DeleteKey	HKCR\ram\CFK13	NOTFOUND		
3340	6.81685920	Cutftp32	DeleteKey	HKCR\ram\CFK14	NOTFOUND		
3341	6.81753680	Cutftp32	DeleteKey	HKCR\ram\CFK15	NOTFOUND		
3342	6.81822800	Cutftp32	DeleteKey	HKCR\ram\CFK25	NOTFOUND		                
3343	6.86191360	Cutftp32	OpenKey	HKCR\ram\CFK40	SUCCESS	hKey: 0xC69AAA70	
3344	6.86194560	Cutftp32	QueryValue	HKCR\ram\CFK40\(Default)	SUCCESS	"3c3bd806,1e"	
3345	6.86225840	Cutftp32	SetValue	HKCR\ram\CFK40\(Default)	SUCCESS	"3c3bd806,1f"	
3346	6.86227920	Cutftp32	CloseKey	HKCR\ram\CFK40	SUCCESS		                             <-- 注意红色的这几行,非常可疑
3347	6.86334080	Cutftp32	OpenKey	HKCR\CLSID\{1E5AFA70-F67A-11D3-8620-0090279BA8F9}	NOTFOUND		
3348	6.86335920	Cutftp32	CloseKey	0x0	BADKEY		
3349	6.86400640	Cutftp32	DeleteKey	HKCR\CLSID\{1E5AFA70-F67A-11D3-8620-0090279BA8F9}	NOTFOUND		
3350	6.86468160	Cutftp32	OpenKey	HKCR\CLSID\{1E5AFA73-F67A-11D3-8620-0090279BA8F9}	NOTFOUND		
3351	6.86470320	Cutftp32	CloseKey	0x55DE30	BADKEY		
3352	6.86534480	Cutftp32	DeleteKey	HKCR\CLSID\{1E5AFA73-F67A-11D3-8620-0090279BA8F9}	NOTFOUND		
。。。
下面还有行多省略掉了。。。
。。。
  仔细观察RegMon的输出结果,你会在3338行到3343行之间发现Cutftp试图对名为“CFK13”、“CFK14”、“CFK15”、“CFK25”和“CFK40”的可疑子键进行操作,但是结果只有对“CFK40”的操作成功,并设置了值,这是不是我们要找的那个标记呢?看看便知:

22. 上面的“HKCR\ram\CFK40”其实就是注册表中的下列路径:“HKEY_CLASSES_ROOT\ram\CFK40”,在windows的开始菜单中选择“运行(Run...)”,输入注册表管理器程序名“regedit”,回车,进入注册表编辑环境,删掉子键“HKEY_CLASSES_ROOT\ram\CFK40”;重新启动CuteFTP,哈哈。。。,那个“Close(关闭)”选项又变回最初的“Start Trial(开始试用)”,我们可以无限制的继续“试用”CuteFTP了,暴破第一步目标已经达到!^_^

23. 暴破第二步:去掉启动时的注册框,其实想想就能知道如果正确注册成功后,启动CuteFTP时应该就没有什么注册框了,所以去掉这个可恶的提示框绝对是没有问题的。若要去掉启动的注册画面,我们就必须找到弹出这个CALL的地方,方法有三:其一、用softice的symbol loader装载CuteFTP,然后一步一步的跟踪;其二、利用W32Dasm反汇编CuteFTP,然后对其进行静态分析,从“关键信息”找到调用它的源头;其三、在CuteFTP弹出注册框的时刻拦截它,然后回头跟踪,不过这种方法很可能不行,因为你常常都能发现找不到CALL的源头,但是如果能找到的话这却是个较快的办法,这里我们使用第二种方法:

24. 重新关闭退出CuteFTP,启动W32Dasm(在“破解工具”的“反编译工具”里下载),打开CuteFTP进行反汇编,现在我们要找到程序中跟注册框有关的地方,回头看看启动的注册画面,我们可以看到“Evaluation Period”的字样,我们就用它作为敲门砖。点击“Search”下的“Find Text”,输入“Evaluation Period”进行查找,我们可以发现如下的程序段:
。。。
* Possible StringData Ref from Data Obj ->"FTPURL="
                                  |
:0043C561 6860525500              push 00555260
:0043C566 52                      push edx
:0043C567 E804750800              call 004C3A70
:0043C56C 83C408                  add esp, 00000008
:0043C56F 85C0                    test eax, eax
:0043C571 7437                    je 0043C5AA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043C55C(C)
|
:0043C573 8D442410                lea eax, dword ptr [esp+10]

* Possible Reference to String Resource ID=62151: "Because CuteFTP is past the evaluation period, you must rest" <-- 注意这里是我们找到的字符串
                                  |
:0043C577 68C7F20000              push 0000F2C7
:0043C57C 50                      push eax
:0043C57D E8CE8EFEFF              call 00425450
:0043C582 83C408                  add esp, 00000008
:0043C585 8B00                    mov eax, dword ptr [eax]
:0043C587 6A00                    push 00000000
:0043C589 6A00                    push 00000000
:0043C58B 50                      push eax
:0043C58C C684246801000001        mov byte ptr [esp+00000168], 01
:0043C594 E8EABE0A00              call 004E8483
:0043C599 8D4C2410                lea ecx, dword ptr [esp+10]
:0043C59D C684245C01000000        mov byte ptr [esp+0000015C], 00
:0043C5A5 E846000A00              call 004DC5F0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043C571(C)
|
:0043C5AA 8BCD                    mov ecx, ebp
:0043C5AC E84F890000              call 00444F00
:0043C5B1 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"IntegrationEnableBrowserMonitor"
                                  |
:0043C5B3 68744F5500              push 00554F74

* Possible StringData Ref from Data Obj ->"Browser Integration"
                                  |
:0043C5B8 68604F5500              push 00554F60
:0043C5BD 8BCD                    mov ecx, ebp
。。。
25. 如果你上下打量,就能知道这里就是弹出启动画面的地方(已经到期的画面,不过都是启动画面,“换汤不换药”而已),往前走,找到CALL这段程序的源头:
。。。
* Possible StringData Ref from Data Obj ->"CuteFTP"
                                  |
:0043B849 68F4235500              push 005523F4
:0043B84E 8BCB                    mov ecx, ebx
:0043B850 E82CB70B00              call 004F6F81
:0043B855 8983DC000000            mov dword ptr [ebx+000000DC], eax
:0043B85B B801000000              mov eax, 00000001
:0043B860 898344060000            mov dword ptr [ebx+00000644], eax
:0043B866 898380060000            mov dword ptr [ebx+00000680], eax
:0043B86C E8FF4F0500              call 00490870
:0043B871 85C0                    test eax, eax
:0043B873 753D                    jne 0043B8B2                                     <-- 这里可以跳过上面的程序
:0043B875 33F6                    xor esi, esi
:0043B877 8BCB                    mov ecx, ebx
:0043B879 56                      push esi

* Possible StringData Ref from Data Obj ->"TSUninstaller"
                                  |
:0043B87A 68DC465500              push 005546DC

* Possible StringData Ref from Data Obj ->"CuteFTP"
                                  |
:0043B87F 68F4235500              push 005523F4
:0043B884 E85B890A00              call 004E41E4
:0043B889 89B380060000            mov dword ptr [ebx+00000680], esi
:0043B88F 6A01                    push 00000001
:0043B891 8BCB                    mov ecx, ebx
:0043B893 89B388060000            mov dword ptr [ebx+00000688], esi
:0043B899 E812130000              call 0043CBB0
:0043B89E 8BCB                    mov ecx, ebx
:0043B8A0 E87B0A0000              call 0043C320                                   <-- 这个CALL就是上面那段程序的CALL
:0043B8A5 85C0                    test eax, eax
:0043B8A7 751E                    jne 0043B8C7
:0043B8A9 56                      push esi

* Reference To: KERNEL32.ExitProcess, Ord:007Dh
                                  |
:0043B8AA FF1514D45100            Call dword ptr [0051D414]
:0043B8B0 EB15                    jmp 0043B8C7


:0043C318 90                      nop
:0043C319 90                      nop
:0043C31A 90                      nop
:0043C31B 90                      nop
:0043C31C 90                      nop
:0043C31D 90                      nop
:0043C31E 90                      nop
:0043C31F 90                      nop

* Referenced by a CALL at Address:
|:0043B8A0   
|

* Possible Reference to String Resource ID=00255: "No entry for the current site found. Do you wish to create o"  <-- 这里是上面那段程序的开头
                                 |
:0043C320 6AFF                    push FFFFFFFF
:0043C322 689BD15000              push 0050D19B
:0043C327 64A100000000            mov eax, dword ptr fs:[00000000]
:0043C32D 50                      push eax
:0043C32E 64892500000000          mov dword ptr fs:[00000000], esp
:0043C335 81EC44010000            sub esp, 00000144
:0043C33B 53                      push ebx
:0043C33C 55                      push ebp
:0043C33D 56                      push esi
:0043C33E 8BE9                    mov ebp, ecx
:0043C340 57                      push edi
。。。
26. 从上面的分析中我们可以得知0043B873处的jne 0043B8B2指令可以“预测”应该可以跳过注册框,所以我们修改那里的指令:
。。。
:0043B86C E8FF4F0500              call 00490870
:0043B871 85C0                    test eax, eax
:0043B873 753D                    jne 0043B8B2
将这段程序改成下面的样子:
:0043B86C E8FF4F0500              call 00490870
:0043B871 85C0                    test eax, eax
:0043B873 EB3D                    jmp 0043B8B2
。。。
27. 修改方法:首先备份一下你的CuteFTP,保持手里有一份原始的可执行文件以防不测,运行HIEW,按F4选择“Decode”切换到汇编模式,然后按F7输入被修改程序的代码:E8 FF 4F 05 00 85 C0 75 3D,找到程序后按F3进入编辑状态,将“75”改成“EB”,按F9存盘,然后退出HIEW,也许你会问为什么只改一个字节却要输入那么长一段代码进行查找?-- 原因嘛只有一个:保证我们能一次找到需要修改的代码,假如输入的信息少,结果很可能会有很多相同代码的地方,假如不注意,结果只会将程序“改死”!

28. 重新启动CuteFTP,哈哈。。。,注册框不见了,不过马上你会发现还没笑完CuteFTP就弹出一个错误框,告诉你校验错误,这说明CuteFTP有代码自校验功能,没关系,既然已经破了半,没有理由退步;

29. 不要关闭CuteFTP的错误框,下断点:bpx lockmytask,点击错误框的“确定”按钮,程序马上被softice拦截到,用 BD * 暂停断点,然后按F12大约27次之后我们又返回到CuteFTP的领空:
。。。
0167:004E844E  CALL      [USER32!MessageBoxA]                <-- 弹出错误框的API函数
0167:004E8454  TEST      ESI,ESI                             <-- 我们来到这里
0167:004E8456  MOV       EDI,EAX
0167:004E8458  JZ        004E845F
0167:004E845A  MOV       EAX,[EBP-08]
0167:004E845D  MOV       [ESI],EAX
0167:004E845F  CMP       DWORD PTR [EBP-04],00
0167:004E8463  JZ        004E8470
0167:004E8465  PUSH      01
0167:004E8467  PUSH      DWORD PTR [EBP-04]
0167:004E846A  CALL      [USER32!EnableWindow]
0167:004E8470  MOV       ECX,[EBP-10]
0167:004E8473  PUSH      01
0167:004E8475  CALL      004E836E
0167:004E847A  MOV       EAX,EDI
0167:004E847C  POP       EDI
0167:004E847D  POP       ESI
0167:004E847E  POP       EBX
0167:004E847F  LEAVE
0167:004E8480  RET       000C
。。。
30. 返回到程序的领空后,我们发现前面一句就是弹出错误框的API函数,因为到这里的时候错误已经产生,所以我们必须按F12走出这里找到调用这个地方的程序段(按两次F12):
。。。
0167:0043BC55  6A00                PUSH      00
0167:0043BC57  6A00                PUSH      00
0167:0043BC59  8B481C              MOV       ECX,[EAX+1C]
0167:0043BC5C  51                  PUSH      ECX
0167:0043BC5D  FF1544D65100        CALL      [USER32!RedrawWindow]
0167:0043BC63  C7835006000001000000MOV       DWORD PTR [EBX+00000650],00000001
0167:0043BC6D  E81E510500          CALL      00490D90
0167:0043BC72  85C0                TEST      EAX,EAX
0167:0043BC74  756F                JNZ       0043BCE5                    <-- 这里可以跳过上面的错误框
0167:0043BC76  8D55EC              LEA       EDX,[EBP-14]
0167:0043BC79  68AA010000          PUSH      000001AA
0167:0043BC7E  52                  PUSH      EDX
0167:0043BC7F  E8CC97FEFF          CALL      00425450
0167:0043BC84  83C408              ADD       ESP,08
0167:0043BC87  8B00                MOV       EAX,[EAX]
0167:0043BC89  6A00                PUSH      00
0167:0043BC8B  6A10                PUSH      10
0167:0043BC8D  50                  PUSH      EAX
0167:0043BC8E  C645FC2A            MOV       BYTE PTR [EBP-04],2A
0167:0043BC92  E8ECC70A00          CALL      004E8483
0167:0043BC97  8D4DEC              LEA       ECX,[EBP-14]                <-- 我们返回后停在这里    
0167:0043BC9A  C645FC29            MOV       BYTE PTR [EBP-04],29
0167:0043BC9E  E84D090A00          CALL      004DC5F0
0167:0043BCA3  8D4DDC              LEA       ECX,[EBP-24]
0167:0043BCA6  C645FC1B            MOV       BYTE PTR [EBP-04],1B
0167:0043BCAA  E841090A00          CALL      004DC5F0
0167:0043BCAF  8D4DD4              LEA       ECX,[EBP-2C]
0167:0043BCB2  C645FC05            MOV       BYTE PTR [EBP-04],05
0167:0043BCB6  E835090A00          CALL      004DC5F0
0167:0043BCBB  8D4DE0              LEA       ECX,[EBP-20]
0167:0043BCBE  C645FC04            MOV       BYTE PTR [EBP-04],04
0167:0043BCC2  E829090A00          CALL      004DC5F0
0167:0043BCC7  8D4DE8              LEA       ECX,[EBP-18]
0167:0043BCCA  897DFC              MOV       [EBP-04],EDI
0167:0043BCCD  E81E090A00          CALL      004DC5F0
0167:0043BCD2  33C0                XOR       EAX,EAX
0167:0043BCD4  8B4DF4              MOV       ECX,[EBP-0C]
0167:0043BCD7  64890D00000000      MOV       FS:[00000000],ECX
0167:0043BCDE  5F                  POP       EDI
0167:0043BCDF  5E                  POP       ESI
0167:0043BCE0  5B                  POP       EBX
0167:0043BCE1  8BE5                MOV       ESP,EBP
0167:0043BCE3  5D                  POP       EBP
0167:0043BCE4  C3                  RET
。。。
31. 返回到上面的程序段之后我们可以发现0167:0043BC74处的JNZ 0043BCE5可以跳过上面的错误框,照猫画虎修改程序:
。。。
0167:0043BC6D  E81E510500          CALL      00490D90
0167:0043BC72  85C0                TEST      EAX,EAX
0167:0043BC74  756F                JNZ       0043BCE5
上面的程序改成:
0167:0043BC6D  E81E510500          CALL      00490D90
0167:0043BC72  85C0                TEST      EAX,EAX
0167:0043BC74  EB6F                JNZ       0043BCE5
。。。
32. 修补好CuteFTP后运行之,这下看到了什么?-- 哈哈,成功了,什么错误也没有了,不过如果你是个比较“完美主义”的人的话,你会发现在“Help”菜单下的“About CuteFTP”里仍然显示未注册的标志: Licensed to: UNREGISTERED,虽然程序已经没有“任何”限制,但是这个地方确实也不太美观,让我们继续来修理它:

33. 启动eXeScope(在“破解工具”的“编辑工具”里下载),打开CuteFTP进行资源编辑:在“Resource\Dialog\100”里我们能发现它就是刚才那个“About CuteFTP”对话框的资源,点击“Static: UNREGISTERED”,将“UNREGISTERED”改成自己的名字(比如我的“ddcrack”^_^!),存盘退出;

34. 再次启动CuteFTP,进去后赶紧进入“About CuteFTP”,哈哈,你会看到已经显示出“Licensed to: ddcrack”的信息,搞定了!

35. 真的一切都OK了吗?-- 其实没有,还存在BUG:假如你使用CuteFTP上传文件,当登陆进远程服务器以后,假如此时你点击两下CuteFTP的“最大化/最小化”按钮,结果会发现“远程窗口”并不能随着你的鼠标一块儿最大化、最小化,最大化以后本地窗口确实最大化了,可是远程窗口只有原来最小化那么一点地方,明显有问题,什么问题呢?-- 肯定是上个步骤修改校验部分程序代码时有些不妥,0167:0043BC6D处的CALL 00490D90没有那么简单,让我们重新开始跟踪,进入这个CALL里去看个究竟:
。。。
0167:00490D90  6AFF                PUSH      FF
0167:00490D92  6831505100          PUSH      00515031
0167:00490D97  64A100000000        MOV       EAX,FS:[00000000]
0167:00490D9D  50                  PUSH      EAX
0167:00490D9E  64892500000000      MOV       FS:[00000000],ESP
0167:00490DA5  81EC24010000        SUB       ESP,00000124
0167:00490DAB  8D4C2408            LEA       ECX,[ESP+08]
0167:00490DAF  E863CA0400          CALL      004DD817
0167:00490DB4  8D442420            LEA       EAX,[ESP+20]
0167:00490DB8  6804010000          PUSH      00000104
0167:00490DBD  50                  PUSH      EAX
0167:00490DBE  6A00                PUSH      00
0167:00490DC0  C7842438010000000000MOV       DWORD PTR [ESP+00000138],00000000
0167:00490DCB  FF1540D45100        CALL      [KERNEL32!GetModuleFileNameA]
0167:00490DD1  6A00                PUSH      00
0167:00490DD3  8D4C2424            LEA       ECX,[ESP+24]
0167:00490DD7  6A40                PUSH      40
0167:00490DD9  51                  PUSH      ECX
0167:00490DDA  8D4C2414            LEA       ECX,[ESP+14]
0167:00490DDE  E8E6CB0400          CALL      004DD9C9
0167:00490DE3  85C0                TEST      EAX,EAX
0167:00490DE5  0F858E000000        JNZ       00490E79
0167:00490DEB  8D542400            LEA       EDX,[ESP+00]
0167:00490DEF  6825E80000          PUSH      0000E825
0167:00490DF4  52                  PUSH      EDX
0167:00490DF5  E85646F9FF          CALL      00425450
0167:00490DFA  83C408              ADD       ESP,08
0167:00490DFD  8D4C2420            LEA       ECX,[ESP+20]
0167:00490E01  8D542404            LEA       EDX,[ESP+04]
0167:00490E05  51                  PUSH      ECX
0167:00490E06  50                  PUSH      EAX
0167:00490E07  52                  PUSH      EDX
0167:00490E08  C684243801000001    MOV       BYTE PTR [ESP+00000138],01
0167:00490E10  E870BA0400          CALL      004DC885
0167:00490E15  8B00                MOV       EAX,[EAX]
0167:00490E17  6A00                PUSH      00
0167:00490E19  6A00                PUSH      00
0167:00490E1B  50                  PUSH      EAX
0167:00490E1C  C684243801000002    MOV       BYTE PTR [ESP+00000138],02
0167:00490E24  E85A760500          CALL      004E8483
0167:00490E29  8D4C2404            LEA       ECX,[ESP+04]
0167:00490E2D  C684242C01000001    MOV       BYTE PTR [ESP+0000012C],01
0167:00490E35  E8B6B70400          CALL      004DC5F0
0167:00490E3A  8D4C2400            LEA       ECX,[ESP+00]
0167:00490E3E  C684242C01000000    MOV       BYTE PTR [ESP+0000012C],00
0167:00490E46  E8A5B70400          CALL      004DC5F0
0167:00490E4B  8D4C2408            LEA       ECX,[ESP+08]
0167:00490E4F  C784242C010000FFFFFFMOV       DWORD PTR [ESP+0000012C],FFFFFFFF
0167:00490E5A  E8ADCA0400          CALL      004DD90C
0167:00490E5F  B801000000          MOV       EAX,00000001
0167:00490E64  8B8C2424010000      MOV       ECX,[ESP+00000124]
0167:00490E6B  64890D00000000      MOV       FS:[00000000],ECX
0167:00490E72  81C430010000        ADD       ESP,00000130
0167:00490E78  C3                  RET
0167:00490E79  8D442418            LEA       EAX,[ESP+18]
0167:00490E7D  8D4C2408            LEA       ECX,[ESP+08]
0167:00490E81  50                  PUSH      EAX
0167:00490E82  51                  PUSH      ECX
0167:00490E83  E858FEFFFF          CALL      00490CE0
0167:00490E88  83C408              ADD       ESP,08
0167:00490E8B  8D4C2408            LEA       ECX,[ESP+08]
0167:00490E8F  E850CD0400          CALL      004DDBE4
0167:00490E94  33C0                XOR       EAX,EAX
0167:00490E96  8A4C0418            MOV       CL,[EAX+ESP+18]
0167:00490E9A  84C9                TEST      CL,CL
0167:00490E9C  7508                JNZ       00490EA6                          <-- 这里跳到00490EA6去将EAX清0就完蛋了!
0167:00490E9E  40                  INC       EAX
0167:00490E9F  83F808              CMP       EAX,08
0167:00490EA2  7CF2                JL        00490E96
0167:00490EA4  EBA5                JMP       00490E4B                          <-- 这里跳到00490E4B去将EAX置1就OK了!
0167:00490EA6  8D4C2408            LEA       ECX,[ESP+08]
0167:00490EAA  C784242C010000FFFFFFMOV       DWORD PTR [ESP+0000012C],FFFFFFFF
0167:00490EB5  E852CA0400          CALL      004DD90C
0167:00490EBA  8B8C2424010000      MOV       ECX,[ESP+00000124]
0167:00490EC1  33C0                XOR       EAX,EAX
0167:00490EC3  64890D00000000      MOV       FS:[00000000],ECX
0167:00490ECA  81C430010000        ADD       ESP,00000130
0167:00490ED0  C3                  RET
。。。
36. 通常程序的结果都是在最后出来的,我们既不研究算法,又不研究注册码,所以可以快步往后走,可以发现从0167:00490E96开始的地方会直接决定程序的返回值EAX的大小,前面已经知道返回值EAX等于0的话就表示校验失败,所以我们必须修改这里使EAX始终返回1,这样就不会出现校验错误了;

37. 还是一样使用HIEW进行修改,方法如下:
。。。
0167:00490E96  8A4C0418            MOV       CL,[EAX+ESP+18]
0167:00490E9A  84C9                TEST      CL,CL
0167:00490E9C  7508                JNZ       00490EA6                         
0167:00490E9E  40                  INC       EAX
0167:00490E9F  83F808              CMP       EAX,08
0167:00490EA2  7CF2                JL        00490E96
0167:00490EA4  EBA5                JMP       00490E4B   
将上面的程序段改成:
0167:00490E96  8A4C0418            MOV       CL,[EAX+ESP+18]
0167:00490E9A  84C9                TEST      CL,CL
0167:00490E9C  90                  NOP
0167:00490E9D  90                  NOP                         
0167:00490E9E  40                  INC       EAX
0167:00490E9F  83F808              CMP       EAX,08
0167:00490EA2  90                  NOP
0167:00490EA3  90                  NOP
0167:00490EA4  EBA5                JMP       00490E4B   
。。。
38. 完成上面的修改,然后马上试用CuteFTP,怎么样?这下是不是没有什么毛病了呢?-- 由此我们也可以看出,暴力破解是存在“危险性”的,因为我们常常不知道暴破之后程序是否真正能稳定可靠的运行,俗话说“实践是检验真理的唯一标准”,只有不断去验证、使用,才能证明我们暴破的力度和深度,是否是“完全暴破”,切忌马虎大意,只是看了几眼便认为自己做得很漂亮的思想是靠不住的,废话有点多,希望大家不要介意^_^!
相关文章:
·用Fireworks MX制作Windows XP风格按钮
·创建 Windows XP 图标
·在Windows XP以幻灯片方式浏览图片
·怎样把Windows server 2003转换成工作站系统
·Windows NTFS分区随心转换
·优化Windows启动 提升性能
·把Windows ME中的五笔拿出来
·Windows Me中的批处理
·Windows XP到底有多安全
·替你的Windows Me减减肥
相关软件:
·WINDOWS XP全攻略(HTML)
·Windows 2003 server 技术文章(PDF)
·Windows 优化大师 5.92 Build 4.325 破解补丁
·Windows优化大师 注册机 (适用于5.91及以前所有版本)
·WINDOWS 4in1 序列号生成器 V1.0
·微软“震荡波(Worm.Sasser)”漏洞补丁 for Windows Server 2003
·微软官方Windows“冲击波”蠕虫删除工具
·Windows 2000 IIS 入侵图解教程
·LumaQQ for Windows 2004
·Microsoft Windows Installer
特别推荐
热点TOP10
站长推荐!`