题目:备份工具Iomega QuikSyncV3.1注册机制之分析破文
适用平台:Win9x/Me/NT/2000
软件简介:这是由ZIP磁盘大厂Iomega公司所出的自动备份软件,它可以在后台自动定时备份你的文件到本地驱动器及网络驱动

器。可让你保护好你重要的文件,如此亦可让你免于受到病毒侵害或系统当机崩溃时,仍能够将重要的文件免于受到波及。
工具:Softice,PEID。
引子:今天安装了这个小系统工具,试验了一下果然好用。可惜在安装过程中需要输入序列号,否则只有30天试用期。现在我们

就通过跟踪找到其注册码生成机制,用了30分钟分析完毕,用1个小时写出以下破文,作为献给各位菜鸟的礼物好了。因为是在安

装过程中输入注册码的,所以输入用户名wanggang,再输入注册码11111-22222-33333-44444总共20位,分4段组成。调出

Softice下断点bpx GetwindowtextA,F5退出,然后点击Register被拦截。按一次F12回到主程序空间来。然后换F10慢慢跟踪

到下面代码处:
0043A1F1  |. E8 EEAF0400    CALL QUIKSYNC.004851E4       
0043A1F6  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
0043A1F9  |. 81C2 48020000  ADD EDX,248
0043A1FF  |. 52             PUSH EDX
0043A200  |. 68 F0030000    PUSH 3F0
0043A205  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043A208  |. 50             PUSH EAX
0043A209  |. E8 A1AE0400    CALL QUIKSYNC.004850AF     //读入第一段注册码。
0043A20E  |. 6A 05          PUSH 5
0043A210  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
0043A213  |. 81C1 48020000  ADD ECX,248
0043A219  |. 51             PUSH ECX
0043A21A  |. 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]
0043A21D  |. 52             PUSH EDX
0043A21E  |. E8 C1AF0400    CALL QUIKSYNC.004851E4  
0043A223  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0043A226  |. 05 4C020000    ADD EAX,24C
0043A22B  |. 50             PUSH EAX
0043A22C  |. 68 EC030000    PUSH 3EC
0043A231  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
0043A234  |. 51             PUSH ECX
0043A235  |. E8 75AE0400    CALL QUIKSYNC.004850AF   //读入第二段注册码。
0043A23A  |. 6A 05          PUSH 5
0043A23C  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
0043A23F  |. 81C2 4C020000  ADD EDX,24C
0043A245  |. 52             PUSH EDX
0043A246  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043A249  |. 50             PUSH EAX
0043A24A  |. E8 95AF0400    CALL QUIKSYNC.004851E4     
0043A24F  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
0043A252  |. 81C1 50020000  ADD ECX,250
0043A258  |. 51             PUSH ECX
0043A259  |. 68 EE030000    PUSH 3EE
0043A25E  |. 8B55 08        MOV EDX,DWORD PTR SS:[EBP+8]
0043A261  |. 52             PUSH EDX
0043A262  |. E8 48AE0400    CALL QUIKSYNC.004850AF    //读入第三段注册码。
0043A267  |. 6A 05          PUSH 5
0043A269  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0043A26C  |. 05 50020000    ADD EAX,250
0043A271  |. 50             PUSH EAX
0043A272  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
0043A275  |. 51             PUSH ECX
0043A276  |. E8 69AF0400    CALL QUIKSYNC.004851E4
0043A27B  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
0043A27E  |. 81C2 54020000  ADD EDX,254
0043A284  |. 52             PUSH EDX
0043A285  |. 68 EF030000    PUSH 3EF
0043A28A  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043A28D  |. 50             PUSH EAX
0043A28E  |. E8 1CAE0400    CALL QUIKSYNC.004850AF    //读入第四段注册码。
=============================================================================
下面返回到如下代码处:
0043A44A  |. 8B85 78FDFFFF  MOV EAX,DWORD PTR SS:[EBP-288]
0043A450  |. 05 48020000    ADD EAX,248
0043A455  |. 50             PUSH EAX
0043A456  |. B9 9CFD4A00    MOV ECX,QUIKSYNC.004AFD9C
0043A45B  |. E8 732D0400    CALL QUIKSYNC.0047D1D3
0043A460  |. 8B8D 78FDFFFF  MOV ECX,DWORD PTR SS:[EBP-288]
0043A466  |. 81C1 4C020000  ADD ECX,24C
0043A46C  |. 51             PUSH ECX
0043A46D  |. B9 9CFD4A00    MOV ECX,QUIKSYNC.004AFD9C
0043A472  |. E8 3B300400    CALL QUIKSYNC.0047D4B2        //把第一,二段注册码拷贝到另一位置并串接起来。
0043A477  |. 8B95 78FDFFFF  MOV EDX,DWORD PTR SS:[EBP-288]
0043A47D  |. 81C2 50020000  ADD EDX,250
0043A483  |. 52             PUSH EDX
0043A484  |. B9 9CFD4A00    MOV ECX,QUIKSYNC.004AFD9C
0043A489  |. E8 24300400    CALL QUIKSYNC.0047D4B2        //把第三段注册码复制到前面2段的后面。
0043A48E  |. 8B85 78FDFFFF  MOV EAX,DWORD PTR SS:[EBP-288]
0043A494  |. 05 54020000    ADD EAX,254
0043A499  |. 50             PUSH EAX
0043A49A  |. B9 9CFD4A00    MOV ECX,QUIKSYNC.004AFD9C
0043A49F  |. E8 0E300400    CALL QUIKSYNC.0047D4B2       //把第四段注册码复制到前面3段的后面。
0043A4A4  |. B9 98FD4A00    MOV ECX,QUIKSYNC.004AFD98
0043A4A9  |. E8 D2C3FCFF    CALL QUIKSYNC.00406880       //取用户名长度。
0043A4AE  |. 85C0           TEST EAX,EAX
0043A4B0  |. 74 0E          JE SHORT QUIKSYNC.0043A4C0
0043A4B2  |. B9 9CFD4A00    MOV ECX,QUIKSYNC.004AFD9C
0043A4B7  |. E8 C4C3FCFF    CALL QUIKSYNC.00406880       //取注册码长度。
0043A4BC  |. 85C0           TEST EAX,EAX
0043A4BE  |. 75 35          JNZ SHORT QUIKSYNC.0043A4F5  //此处自然跳走。
=============================================================================
0043A50E  |. 6A 20          PUSH 20
0043A510  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
0043A513  |. E8 B22F0400    CALL QUIKSYNC.0047D4CA       //复制注册码到另一位置。
0043A518  |. 50             PUSH EAX
0043A519  |. 8D85 7CFDFFFF  LEA EAX,DWORD PTR SS:[EBP-284]
0043A51F  |. 50             PUSH EAX
0043A520  |. 8B8D 20FFFFFF  MOV ECX,DWORD PTR SS:[EBP-E0]
0043A526  |. E8 431A0000    CALL QUIKSYNC.0043BF6E       //这里就是关键了,产生注册码。后面分析。 (1)
0043A52B  |. 8985 74FDFFFF  MOV DWORD PTR SS:[EBP-28C],EAX
0043A531  |. 8B8D 74FDFFFF  MOV ECX,DWORD PTR SS:[EBP-28C]
0043A537  |. 898D 70FDFFFF  MOV DWORD PTR SS:[EBP-290],ECX
0043A53D  |. C645 FC 02     MOV BYTE PTR SS:[EBP-4],2
0043A541  |. 8B95 70FDFFFF  MOV EDX,DWORD PTR SS:[EBP-290]
0043A547  |. 52             PUSH EDX
0043A548  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
0043A54B  |. E8 832C0400    CALL QUIKSYNC.0047D1D3
0043A550  |. C645 FC 00     MOV BYTE PTR SS:[EBP-4],0
0043A554  |. 8D8D 7CFDFFFF  LEA ECX,DWORD PTR SS:[EBP-284]
0043A55A  |. E8 3B2B0400    CALL QUIKSYNC.0047D09A
0043A55F  |. 6A FF          PUSH -1
0043A561  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
0043A564  |. E8 B02F0400    CALL QUIKSYNC.0047D519       //取刚刚产生的新注册码的地址送EAX。
0043A569  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
0043A56C  |. 50             PUSH EAX
0043A56D  |. 68 9CFD4A00    PUSH QUIKSYNC.004AFD9C
0043A572  |. E8 D9F0FCFF    CALL QUIKSYNC.00409650       //这里就是对真假进行对比的地方了。(2)
0043A577  |. 25 FF000000    AND EAX,0FF
0043A57C  |. 85C0           TEST EAX,EAX
0043A57E  |. 0F84 57010000  JE QUIKSYNC.0043A6DB
=============================================================================
下面分析(1)处的函数:
0043BF6E  /$ 55             PUSH EBP
0043BF6F  |. 8BEC           MOV EBP,ESP
0043BF71  |. 6A FF          PUSH -1
0043BF73  |. 68 00FE4800    PUSH QUIKSYNC.0048FE00
0043BF78  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0043BF7E  |. 50             PUSH EAX
0043BF7F  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
0043BF86  |. 83EC 1C        SUB ESP,1C
0043BF89  |. 894D E0        MOV DWORD PTR SS:[EBP-20],ECX
0043BF8C  |. C745 E4 000000>MOV DWORD PTR SS:[EBP-1C],0
0043BF93  |. 8D4D EC        LEA ECX,DWORD PTR SS:[EBP-14]
0043BF96  |. E8 757CFCFF    CALL QUIKSYNC.00403C10
0043BF9B  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
0043BFA2  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
0043BFA5  |. 50             PUSH EAX
0043BFA6  |. 8D4D E8        LEA ECX,DWORD PTR SS:[EBP-18]
0043BFA9  |. 51             PUSH ECX
0043BFAA  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
0043BFAD  |. E8 BEECFFFF    CALL QUIKSYNC.0043AC70      //这个函数关键地方,我们后面分析。(3)
0043BFB2  |. 8945 DC        MOV DWORD PTR SS:[EBP-24],EAX
0043BFB5  |. 8B55 DC        MOV EDX,DWORD PTR SS:[EBP-24]
0043BFB8  |. 8955 D8        MOV DWORD PTR SS:[EBP-28],EDX
0043BFBB  |. C645 FC 02     MOV BYTE PTR SS:[EBP-4],2
0043BFBF  |. 8B45 D8        MOV EAX,DWORD PTR SS:[EBP-28]
0043BFC2  |. 50             PUSH EAX
0043BFC3  |. 8D4D EC        LEA ECX,DWORD PTR SS:[EBP-14]
0043BFC6  |. E8 08120400    CALL QUIKSYNC.0047D1D3
0043BFCB  |. C645 FC 01     MOV BYTE PTR SS:[EBP-4],1
0043BFCF  |. 8D4D E8        LEA ECX,DWORD PTR SS:[EBP-18]
0043BFD2  |. E8 C3100400    CALL QUIKSYNC.0047D09A
0043BFD7  |. 8D4D EC        LEA ECX,DWORD PTR SS:[EBP-14]
0043BFDA  |. 51             PUSH ECX
0043BFDB  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
0043BFDE  |. E8 2C0E0400    CALL QUIKSYNC.0047CE0F
0043BFE3  |. 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C]
0043BFE6  |. 83CA 01        OR EDX,1
0043BFE9  |. 8955 E4        MOV DWORD PTR SS:[EBP-1C],EDX
0043BFEC  |. C645 FC 00     MOV BYTE PTR SS:[EBP-4],0
0043BFF0  |. 8D4D EC        LEA ECX,DWORD PTR SS:[EBP-14]
0043BFF3  |. E8 A2100400    CALL QUIKSYNC.0047D09A
0043BFF8  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043BFFB  |. 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]
0043BFFE  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
0043C005  |. 8BE5           MOV ESP,EBP
0043C007  |. 5D             POP EBP
0043C008  \. C2 0800        RETN 8
============================================================================
下面分析(3)处的函数,就是这个函数产生的注册码:
0043AC70  /$ 55             PUSH EBP
0043AC71  |. 8BEC           MOV EBP,ESP
0043AC73  |. 6A FF          PUSH -1
0043AC75  |. 68 C0FC4800    PUSH QUIKSYNC.0048FCC0
0043AC7A  |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0043AC80  |. 50             PUSH EAX
0043AC81  |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
0043AC88  |. 83EC 58        SUB ESP,58
0043AC8B  |. 894D 9C        MOV DWORD PTR SS:[EBP-64],ECX
0043AC8E  |. C745 A0 000000>MOV DWORD PTR SS:[EBP-60],0
0043AC95  |. 8D4D AC        LEA ECX,DWORD PTR SS:[EBP-54]
0043AC98  |. E8 738FFCFF    CALL QUIKSYNC.00403C10
0043AC9D  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
0043ACA4  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
0043ACA7  |. 8945 F0        MOV DWORD PTR SS:[EBP-10],EAX
0043ACAA  |. C745 EC 000000>MOV DWORD PTR SS:[EBP-14],0
0043ACB1  |. C745 A4 000000>MOV DWORD PTR SS:[EBP-5C],0
0043ACB8  |. C745 E4 000000>MOV DWORD PTR SS:[EBP-1C],0
0043ACBF  |. 6A 15          PUSH 15
0043ACC1  |. 8D4D AC        LEA ECX,DWORD PTR SS:[EBP-54]
0043ACC4  |. E8 78280400    CALL QUIKSYNC.0047D541
0043ACC9  |. 8945 E8        MOV DWORD PTR SS:[EBP-18],EAX
0043ACCC  |. 6A 15          PUSH 15
0043ACCE  |. 6A 00          PUSH 0
0043ACD0  |. 8B4D E8        MOV ECX,DWORD PTR SS:[EBP-18]
0043ACD3  |. 51             PUSH ECX
0043ACD4  |. E8 A7430300    CALL QUIKSYNC.0046F080          //把一段内存清零,准备产生注册码。
0043ACD9  |. 83C4 0C        ADD ESP,0C
0043ACDC  |> 8B55 F0        /MOV EDX,DWORD PTR SS:[EBP-10]  //从这里开始到0043AD27处的循环是复制假码的前4位

到另一地址。EDX为假码地址。记新串为S1。
0043ACDF  |. 0FBE02         |MOVSX EAX,BYTE PTR DS:[EDX]    //依次取假码前4位送EAX。
0043ACE2  |. 85C0           |TEST EAX,EAX                   //如果EAX为0则OVER。
0043ACE4  |. 74 43          |JE SHORT QUIKSYNC.0043AD29
0043ACE6  |. 837D E4 04     |CMP DWORD PTR SS:[EBP-1C],4    //判断是否已经到4位了。
0043ACEA  |. 7D 3D          |JGE SHORT QUIKSYNC.0043AD29    //如果到了则跳走。
0043ACEC  |. 8B4D E8        |MOV ECX,DWORD PTR SS:[EBP-18] 
0043ACEF  |. 034D A4        |ADD ECX,DWORD PTR SS:[EBP-5C]  //目的地址送ECX。
0043ACF2  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
0043ACF5  |. 8A02           |MOV AL,BYTE PTR DS:[EDX]       //把假码依次送AL。 
0043ACF7  |. 8801           |MOV BYTE PTR DS:[ECX],AL       //把假码送ECX指定的地址保存。
0043ACF9  |. 8B4D A4        |MOV ECX,DWORD PTR SS:[EBP-5C]
0043ACFC  |. 83C1 01        |ADD ECX,1          //ECX增1。
0043ACFF  |. 894D A4        |MOV DWORD PTR SS:[EBP-5C],ECX  //送回保存。
0043AD02  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
0043AD05  |. 0FBE02         |MOVSX EAX,BYTE PTR DS:[EDX]
0043AD08  |. 8B4D E4        |MOV ECX,DWORD PTR SS:[EBP-1C]
0043AD0B  |. D3E0           |SHL EAX,CL                     //EAX左移CL位。CL依次取0,1,2,3。
0043AD0D  |. 8B4D EC        |MOV ECX,DWORD PTR SS:[EBP-14]  //取上次累加结果送ECX。
0043AD10  |. 03C8           |ADD ECX,EAX                    //本次EAX值累加到ECX。
0043AD12  |. 894D EC        |MOV DWORD PTR SS:[EBP-14],ECX  //保存结果。
0043AD15  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]  
0043AD18  |. 83C2 01        |ADD EDX,1                      //地址增1。
0043AD1B  |. 8955 F0        |MOV DWORD PTR SS:[EBP-10],EDX  //送回保存。
0043AD1E  |. 8B45 E4        |MOV EAX,DWORD PTR SS:[EBP-1C]  //循环次数送EAX。
0043AD21  |. 83C0 01        |ADD EAX,1    //EAX增1。
0043AD24  |. 8945 E4        |MOV DWORD PTR SS:[EBP-1C],EAX  //送回保存。
0043AD27  |.^EB B3          \JMP SHORT QUIKSYNC.0043ACDC    //未完继续。
注意:这个循环把前4位循环累加起来,比如前4位是abcd,则结束后计算过程为R=a+b*2+c*4+d*8. 下面就要用这个结果R。
0043AD29  |> 6A FF          PUSH -1
0043AD2B  |. 8D4D AC        LEA ECX,DWORD PTR SS:[EBP-54]
0043AD2E  |. E8 E6270400    CALL QUIKSYNC.0047D519
0043AD33  |. 8B4D EC        MOV ECX,DWORD PTR SS:[EBP-14]  //前面计算的前4位累加和R送ECX。
0043AD36  |. 51             PUSH ECX
0043AD37  |. 8B4D 9C        MOV ECX,DWORD PTR SS:[EBP-64] 
0043AD3A  |. E8 11150000    CALL QUIKSYNC.0043C250         //取前面累加和R送EAX。
0043AD3F  |. C745 A8 000000>MOV DWORD PTR SS:[EBP-58],0
0043AD46  |. EB 09          JMP SHORT QUIKSYNC.0043AD51    //这里跳下去。
0043AD48  |> 8B55 A8        /MOV EDX,DWORD PTR SS:[EBP-58] //这里循环开始。求注册码了。
0043AD4B  |. 83C2 01        |ADD EDX,1
0043AD4E  |. 8955 A8        |MOV DWORD PTR SS:[EBP-58],EDX 
0043AD51  |> 837D A8 32      CMP DWORD PTR SS:[EBP-58],32  //查表次数与32h比较。
0043AD55  |. 7D 4E          |JGE SHORT QUIKSYNC.0043ADA5      //大于32h次则结束循环。
0043AD57  |. 8B4D 9C        |MOV ECX,DWORD PTR SS:[EBP-64] //上次计算结果地址送ECX。
0043AD5A  |. E8 11150000    |CALL QUIKSYNC.0043C270        //这个函数用累加和做参数进行简单计算。(4)
0043AD5F  |. 99             |CDQ                           //扩展到EDX。
0043AD60  |. B9 5F000000    |MOV ECX,5F                    //把常数5Fh送ECX。
0043AD65  |. F7F9           |IDIV ECX                      //EAX除以ECX,余数在EDX。
0043AD67  |. 8B45 A8        |MOV EAX,DWORD PTR SS:[EBP-58]  
0043AD6A  |. 8A8A B4BE4A00  |MOV CL,BYTE PTR DS:[EDX+4ABEB4]    //根据得到的余数EDX查表,结果送CL。
0043AD70  |. 884C05 B0      |MOV BYTE PTR SS:[EBP+EAX-50],CL    //保存CL。
0043AD74  |. 8B55 A8        |MOV EDX,DWORD PTR SS:[EBP-58]
0043AD77  |. 0FBE4415 B0    |MOVSX EAX,BYTE PTR SS:[EBP+EDX-50] //取出刚刚得到的查表结果。
0043AD7C  |. 85C0           |TEST EAX,EAX                       //判断是否为0。
0043AD7E  |. 75 02          |JNZ SHORT QUIKSYNC.0043AD82        //如果不为0则跳到下面处理。
0043AD80  |.^EB C6          |JMP SHORT QUIKSYNC.0043AD48        //如果上面不跳,说明取出的值为0,则需要重新

计算,然后查表取值。
0043AD82  |> 8B4D A4        |MOV ECX,DWORD PTR SS:[EBP-5C]      //新得到的字符要存放的相对位置。
0043AD85  |. 83C1 01        |ADD ECX,1                          //相对偏移增1。
0043AD88  |. 894D A4        |MOV DWORD PTR SS:[EBP-5C],ECX      //送回保存。
0043AD8B  |. 837D A4 14     |CMP DWORD PTR SS:[EBP-5C],14       //和14h比较是否到达20。
0043AD8F  |. 7E 02          |JLE SHORT QUIKSYNC.0043AD93        //如果没有到20则跳下面。
0043AD91  |. EB 12          |JMP SHORT QUIKSYNC.0043ADA5
0043AD93  |> 8B55 A8        |MOV EDX,DWORD PTR SS:[EBP-58]   
0043AD96  |. 8A4415 B0      |MOV AL,BYTE PTR SS:[EBP+EDX-50]    //取出得到的查表结果送AL。
0043AD9A  |. 50             |PUSH EAX
0043AD9B  |. 8D4D AC        |LEA ECX,DWORD PTR SS:[EBP-54]      //取出新注册码串地址送ECX。
0043AD9E  |. E8 FA260400    |CALL QUIKSYNC.0047D49D             //把查得的字符送到新串S的后面。
0043ADA3  |.^EB A3          \JMP SHORT QUIKSYNC.0043AD48        //一直循环到满20位为止。
0043ADA5  |> 8D4D AC        LEA ECX,DWORD PTR SS:[EBP-54]
0043ADA8  |. 51             PUSH ECX
0043ADA9  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]        //后面几个函数无用。
0043ADAC  |. E8 5E200400    CALL QUIKSYNC.0047CE0F
0043ADB1  |. 8B55 A0        MOV EDX,DWORD PTR SS:[EBP-60]
0043ADB4  |. 83CA 01        OR EDX,1
0043ADB7  |. 8955 A0        MOV DWORD PTR SS:[EBP-60],EDX
0043ADBA  |. C645 FC 00     MOV BYTE PTR SS:[EBP-4],0
0043ADBE  |. 8D4D AC        LEA ECX,DWORD PTR SS:[EBP-54]
0043ADC1  |. E8 D4220400    CALL QUIKSYNC.0047D09A
0043ADC6  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
0043ADC9  |. 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]
0043ADCC  |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
0043ADD3  |. 8BE5           MOV ESP,EBP
0043ADD5  |. 5D             POP EBP
0043ADD6  \. C2 0800        RETN 8
============================================================================
下面分析(4)处的函数,这个函数通过计算得到一个数。
0043C270  /$ 55             PUSH EBP
0043C271  |. 8BEC           MOV EBP,ESP
0043C273  |. 51             PUSH ECX
0043C274  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
0043C277  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 
0043C27A  |. 8B08           MOV ECX,DWORD PTR DS:[EAX]        //上次计算结果送ECX。
0043C27C  |. 69C9 4DBD2000  IMUL ECX,ECX,20BD4D               //ECX=ECX*20BD4D。
0043C282  |. 81C1 C39E2600  ADD ECX,269EC3                    //ECX=ECX+269EC3 。
0043C288  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4] 
0043C28B  |. 890A           MOV DWORD PTR DS:[EDX],ECX        //ECX保存到EDX指定的地址。
0043C28D  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]  
0043C290  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]        //把刚才的结果送EAX。
0043C292  |. C1F8 10        SAR EAX,10                        //EAX右移10h次,即16位。
0043C295  |. 25 FF7F0000    AND EAX,7FFF                      //EAX和7FFF进行与运算,取最低15位。
0043C29A  |. 8BE5           MOV ESP,EBP
0043C29C  |. 5D             POP EBP
0043C29D  \. C3             RETN
============================================================================
下面分析(2)处的函数,这个函数对注册码进行比较。
00409650  /$ 55             PUSH EBP
00409651  |. 8BEC           MOV EBP,ESP
00409653  |. 8B4D 0C        MOV ECX,DWORD PTR SS:[EBP+C]
00409656  |. E8 552E0000    CALL QUIKSYNC.0040C4B0
0040965B  |. 50             PUSH EAX
0040965C  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
0040965F  |. E8 7CD2FFFF    CALL QUIKSYNC.004068E0          //这个函数通往真正比较的地方。(5)
00409664  |. F7D8           NEG EAX
00409666  |. 1BC0           SBB EAX,EAX
00409668  |. 40             INC EAX
00409669  |. 5D             POP EBP
0040966A  \. C2 0800        RETN 8
============================================================================
下面分析(5)处的函数,这个函数对注册码进行比较。
004068E0  /$ 55             PUSH EBP
004068E1  |. 8BEC           MOV EBP,ESP
004068E3  |. 51             PUSH ECX
004068E4  |. 894D FC        MOV DWORD PTR SS:[EBP-4],ECX
004068E7  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]
004068EA  |. 50             PUSH EAX
004068EB  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004068EE  |. 8B11           MOV EDX,DWORD PTR DS:[ECX]
004068F0  |. 52             PUSH EDX
004068F1  |. E8 0A000000    CALL QUIKSYNC.00406900         //在这个函数里进行。           (6)
004068F6  |. 83C4 08        ADD ESP,8
004068F9  |. 8BE5           MOV ESP,EBP
004068FB  |. 5D             POP EBP
004068FC  \. C2 0400        RETN 4
(6)处函数调用下面代码。
00406900  /$ 55             PUSH EBP
00406901  |. 8BEC           MOV EBP,ESP
00406903  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00406906  |. 50             PUSH EAX
00406907  |. 8B4D 08        MOV ECX,DWORD PTR SS:[EBP+8]
0040690A  |. 51             PUSH ECX
0040690B  |. E8 308B0600    CALL QUIKSYNC.0046F440        //我们找的"兔子"在这里藏着啦。   (7)
00406910  |. 83C4 08        ADD ESP,8
00406913  |. 5D             POP EBP
00406914  \. C3             RETN
============================================================================
下面分析(7)处的函数,这个函数对注册码进行比较。
*省去多行*
0046F46F  |> 66:0FB60F      /MOVZX CX,BYTE PTR DS:[EDI]   //假码字符依次送CX。
0046F473  |. 0FB6C1         |MOVZX EAX,CL                 //CL送EAX。
0046F476  |. 47             |INC EDI                      //EDI地址增1。
0046F477  |. 894D 0C        |MOV DWORD PTR SS:[EBP+C],ECX  //把假码送内存单元保存。
0046F47A  |. F680 C1354B00 >|TEST BYTE PTR DS:[EAX+4B35C1],4
0046F481  |. 74 16          |JE SHORT QUIKSYNC.0046F499
0046F483  |. 8A07           |MOV AL,BYTE PTR DS:[EDI]      //取0送AL。
0046F485  |. 84C0           |TEST AL,AL
0046F487  |. 75 06          |JNZ SHORT QUIKSYNC.0046F48F   //如果为0则不跳。
0046F489  |. 8365 0C 00     |AND DWORD PTR SS:[EBP+C],0 
0046F48D  |. EB 0A          |JMP SHORT QUIKSYNC.0046F499   //这里跳。
0046F48F  |> 33D2           |XOR EDX,EDX
0046F491  |. 47             |INC EDI
0046F492  |. 8AF1           |MOV DH,CL
0046F494  |. 8AD0           |MOV DL,AL
0046F496  |. 8955 0C        |MOV DWORD PTR SS:[EBP+C],EDX
0046F499  |> 66:0FB61E      |MOVZX BX,BYTE PTR DS:[ESI]    //真码送BX。
0046F49D  |. 0FB6C3         |MOVZX EAX,BL                  //然后送EAX。
0046F4A0  |. 46             |INC ESI                       //ESI增1。
0046F4A1  |. F680 C1354B00 >|TEST BYTE PTR DS:[EAX+4B35C1],4  //EAX作为偏移地址取一个数与4“与”运算。
0046F4A8  |. 74 13          |JE SHORT QUIKSYNC.0046F4BD       //这里自动跳。
0046F4AA  |. 8A06           |MOV AL,BYTE PTR DS:[ESI]   
0046F4AC  |. 84C0           |TEST AL,AL
0046F4AE  |. 75 04          |JNZ SHORT QUIKSYNC.0046F4B4
0046F4B0  |. 33DB           |XOR EBX,EBX
0046F4B2  |. EB 09          |JMP SHORT QUIKSYNC.0046F4BD
0046F4B4  |> 33C9           |XOR ECX,ECX
0046F4B6  |. 46             |INC ESI
0046F4B7  |. 8AEB           |MOV CH,BL
0046F4B9  |. 8AC8           |MOV CL,AL
0046F4BB  |. 8BD9           |MOV EBX,ECX
0046F4BD  |> 66:395D 0C     |CMP WORD PTR SS:[EBP+C],BX    //[EBP+C]里的假码跟BX内的真码比较。
0046F4C1  |. 75 09          |JNZ SHORT QUIKSYNC.0046F4CC   //不相等就OVER。
0046F4C3  |. 66:837D 0C 00  |CMP WORD PTR SS:[EBP+C],0     //假码与0比较。
0046F4C8  |. 74 16          |JE SHORT QUIKSYNC.0046F4E0    //相等时则结束。
0046F4CA  |.^EB A3          \JMP SHORT QUIKSYNC.0046F46F   //否则继续循环。
0046F4CC  |> 6A 19          PUSH 19
0046F4CE  |. E8 283C0000    CALL QUIKSYNC.004730FB
0046F4D3  |. 66:3B5D 0C     CMP BX,WORD PTR SS:[EBP+C]
0046F4D7  |. 59             POP ECX
0046F4D8  |. 1BC0           SBB EAX,EAX
0046F4DA  |. 83E0 02        AND EAX,2
0046F4DD  |. 48             DEC EAX
0046F4DE  |. EB 0A          JMP SHORT QUIKSYNC.0046F4EA
0046F4E0  |> 6A 19          PUSH 19
0046F4E2  |. E8 143C0000    CALL QUIKSYNC.004730FB
0046F4E7  |. 59             POP ECX
0046F4E8  |. 33C0           XOR EAX,EAX        //EAX清0。
0046F4EA  |> 5F             POP EDI
0046F4EB  |. 5E             POP ESI
0046F4EC  |. 5B             POP EBX
0046F4ED  |. 5D             POP EBP
0046F4EE  \. C3             RETN
============================================================================
后记:
通过30分钟的跟踪分析出注册码产生机制了。但是没有时间写出注册机,原理搞明白了,写注册机也是水到渠成的事情了。写这

篇破文却花了俺1个小时的时间呢。为了给广大坛友提供一点帮助,助坛友一臂之力,再苦再累也值得了!因为身后有许多坛友给

予我极大支持和关注!所以,我的每篇破文里面应该都包含了看雪论坛各位坛友的无形的帮助,也有你的一份功劳在里面的!如

果没有各位的支持,相信我是坚持不下来的。非常高兴跟大家分享我的快乐!^_*

结论:随便给出几组注册码,注册码的产生只与前4位有关:

1111t-lWRRF-eRKxH-546nm   (第6位是小写的L)
7878A-4j8PF-TlSzl-8dZDe   (第2段内第12、15位是小写的L,不是数字1.)
5211z-tUYrx-p2xv7-1Ia5o   (最后一位不是数字0,而是小写的字符O)

注册成功后在H.C.U\Software\Iomega QuickSync 3\Sync键下面建立Init子键,里面是注册码的16进制明码形式。



鸣谢:感谢看雪给予本菜鸟的宽容帮助和支持!感谢各位关心我的破文的坛友们!祝愿各位在看雪论坛里迅速成长!


qduwg

qduwg@163.com

2006年2月2日晚完稿