题目:备份工具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日晚完稿
[注意]APP应用上架合规检测服务,协助应用顺利上架!