PC6下载站

分类分类

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
保护方式:注册码(网络鉴别〕
破解方式:暴力破解
破解难度:中等

破解步骤:

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,怎么样?这下是不是没有什么毛病了呢?-- 由此我们也可以看出,暴力破解是存在“危险性”的,因为我们常常不知道暴破之后程序是否真正能稳定可靠的运行,俗话说“实践是检验真理的唯一标准”,只有不断去验证、使用,才能证明我们暴破的力度和深度,是否是“完全暴破”,切忌马虎大意,只是看了几眼便认为自己做得很漂亮的思想是靠不住的,废话有点多,希望大家不要介意^_^!





展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消