题目:电影剪辑软件“VCDCutterV4.0”注册码分析
软件功能:此软件为国人开发的小软件,才400KB,非常小巧玲珑。不必安装直接运行。系MPEG,VCD媒体播放器。本版本的播放器可以播放MPEG,VCD和其它媒体文件(诸如MPG,DAT,AVI,MOV,WAV)。可以从MPG或VCD碟片截取媒体画面和MPG片段(你可以选择截取MPG系统流,视频流或音频流).未注册版只可以剪辑7秒钟的电影,而且最大片段是2段(2个7秒!!)。太那个了点吧!!
工具:SOFTICE,PEID
引子:今天到一台隔壁机房电脑上查找Microsot Encarta资料,非常有名的大百科全书。结果发现几个小软件,没有注册。顺便拷贝到U盘,带回宿舍研究了一下。首先就是这个国人开发的小工具,可能是印度老师安装上去的,因为界面全部是英语的,所以外国人也能够使用。分析了1个小时就得出结论了。赶紧把破解过程撰写出来,以便分享俺的快乐!!首先拿PEID查看,没有加壳,便于倒出代码写文章了。是VC写的。启动程序,打开help菜单,单击Register,弹出注册窗口,输入用户名wanggang,注册码654321,注意窗口上显示出了一个根据CMOS信息计算得到的ID号。调出SOFTICE,设断点bpx hmemcpy,(用getwindowtexta无效),F5退出,单击OK,被拦住。按一阵F12,来到主程序空间。代码分析如下:
0042A244 > 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0042A248 . 6A 40 PUSH 40
0042A24A . 50 PUSH EAX
0042A24B . 68 01040000 PUSH 401
0042A250 . 56 PUSH ESI
0042A251 . FFD5 CALL EBP //取用户名。
0042A253 . 8D4C24 50 LEA ECX,DWORD PTR SS:[ESP+50] //我们返回到这里。
0042A257 . 6A 40 PUSH 40
0042A259 . 51 PUSH ECX
0042A25A . 68 02040000 PUSH 402
0042A25F . 56 PUSH ESI
0042A260 . FFD5 CALL EBP //取注册码。
0042A262 . 8D5424 50 LEA EDX,DWORD PTR SS:[ESP+50] //注册码地址送EDX。
0042A266 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] //用户名地址送EDX。
0042A26A . 52 PUSH EDX
0042A26B . 50 PUSH EAX
0042A26C . E8 0F3CFFFF CALL VCDCUT.0041DE80 //注册码产生与比较的函数。 (1)
0042A271 . 83C4 08 ADD ESP,8
0042A274 . 85C0 TEST EAX,EAX //EAX返回0则错,返回1则成功。
0042A276 . 0F84 83000000 JE VCDCUT.0042A2FF
0042A27C . 8B0D 280D4900 MOV ECX,DWORD PTR DS:[490D28]
0042A282 . 51 PUSH ECX
0042A283 . FF15 DC744900 CALL DWORD PTR DS:[<&GDI32.DeleteObject>]
0042A289 . 8B15 840C4900 MOV EDX,DWORD PTR DS:[490C84]
0042A28F . 6A 7B PUSH 7B
0042A291 . 52 PUSH EDX
0042A292 . FF15 64764900 CALL DWORD PTR DS:[<&USER32.LoadBitmapA>]
0042A298 . A3 280D4900 MOV DWORD PTR DS:[490D28],EAX
0042A29D . 8D4424 50 LEA EAX,DWORD PTR SS:[ESP+50]
0042A2A1 . 6A 01 PUSH 1
0042A2A3 . 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
0042A2A7 . 50 PUSH EAX
0042A2A8 . 51 PUSH ECX
0042A2A9 . E8 4236FFFF CALL VCDCUT.0041D8F0
0042A2AE . 83C4 0C ADD ESP,0C
0042A2B1 . 6A 01 PUSH 1
0042A2B3 . 56 PUSH ESI
0042A2B4 . FF15 E8764900 CALL DWORD PTR DS:[<&USER32.EndDialog>]
0042A2BA . 8B15 58CA4700 MOV EDX,DWORD PTR DS:[47CA58]
0042A2C0 . 52 PUSH EDX
0042A2C1 . FF15 EC764900 CALL DWORD PTR DS:[<&USER32.SetActiveWindow>]
0042A2C7 . 8B0D 58CA4700 MOV ECX,DWORD PTR DS:[47CA58]
0042A2CD . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0042A2D1 . 6A 00 PUSH 0
0042A2D3 . 50 PUSH EAX
0042A2D4 . 68 C4294400 PUSH VCDCUT.004429C4 ; ASCII "Thanks for your support !!!Registeration is succeed !!!"
0042A2D9 . 51 PUSH ECX
0042A2DA . FFD3 CALL EBX //显示成功对话框。
0042A2DC . 8B15 58CA4700 MOV EDX,DWORD PTR DS:[47CA58]
0042A2E2 . 6A 00 PUSH 0
0042A2E4 . 6A 00 PUSH 0
0042A2E6 . 52 PUSH EDX
0042A2E7 . FF15 68764900 CALL DWORD PTR DS:[<&USER32.InvalidateRect>]
0042A2ED . B8 01000000 MOV EAX,1
0042A2F2 . 5F POP EDI
0042A2F3 . 5E POP ESI
0042A2F4 . 5D POP EBP
0042A2F5 . 5B POP EBX
0042A2F6 . 81C4 80030000 ADD ESP,380
0042A2FC . C2 1000 RETN 10
==========================================================================================
下面分析(1)处的函数代码:
0041DE80 /$ 81EC 08020000 SUB ESP,208
0041DE86 |. 83C9 FF OR ECX,FFFFFFFF
0041DE89 |. 33C0 XOR EAX,EAX
0041DE8B |. 8D5424 08 LEA EDX,DWORD PTR SS:[ESP+8]
0041DE8F |. 53 PUSH EBX
0041DE90 |. 56 PUSH ESI
0041DE91 |. 57 PUSH EDI
0041DE92 |. BF 10144400 MOV EDI,VCDCUT.00441410 ; ASCII "abmz0129"
0041DE97 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI] //把 "abmz0129"串拷贝到另外地方。记为S1。
0041DE99 |. F7D1 NOT ECX
0041DE9B |. 2BF9 SUB EDI,ECX
0041DE9D |. 8BC1 MOV EAX,ECX
0041DE9F |. 8BF7 MOV ESI,EDI
0041DEA1 |. 8BFA MOV EDI,EDX
0041DEA3 |. 33D2 XOR EDX,EDX
0041DEA5 |. C1E9 02 SHR ECX,2
0041DEA8 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0041DEAA |. 8BC8 MOV ECX,EAX
0041DEAC |. 83E1 03 AND ECX,3
0041DEAF |. F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0041DEB1 |. 8BB424 18020000 MOV ESI,DWORD PTR SS:[ESP+218]
0041DEB8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
0041DEBC |. 8BDE MOV EBX,ESI
0041DEBE |. 2BD9 SUB EBX,ECX
0041DEC0 |> 8BFE /MOV EDI,ESI
0041DEC2 |. 83C9 FF |OR ECX,FFFFFFFF
0041DEC5 |. 33C0 |XOR EAX,EAX
0041DEC7 |. F2:AE |REPNE SCAS BYTE PTR ES:[EDI] //扫描用户名,计算长度。
0041DEC9 |. F7D1 |NOT ECX
0041DECB |. 49 |DEC ECX
0041DECC |. 83F9 08 |CMP ECX,8
0041DECF |. 76 07 |JBE SHORT VCDCUT.0041DED8 //小于等于8位跳走。
0041DED1 |. B9 08000000 |MOV ECX,8
0041DED6 |. EB 0C |JMP SHORT VCDCUT.0041DEE4
0041DED8 |> 8BFE |MOV EDI,ESI
0041DEDA |. 83C9 FF |OR ECX,FFFFFFFF
0041DEDD |. 33C0 |XOR EAX,EAX
0041DEDF |. F2:AE |REPNE SCAS BYTE PTR ES:[EDI]
0041DEE1 |. F7D1 |NOT ECX
0041DEE3 |. 49 |DEC ECX
0041DEE4 |> 3BD1 |CMP EDX,ECX
0041DEE6 |. 73 0E |JNB SHORT VCDCUT.0041DEF6
0041DEE8 |. 8D4414 14 |LEA EAX,DWORD PTR SS:[ESP+EDX+14] //S1串地址送EAX。
0041DEEC |. 42 |INC EDX
0041DEED |. 8A0C18 |MOV CL,BYTE PTR DS:[EAX+EBX] //用户名字符送CL。
0041DEF0 |. 884C14 13 |MOV BYTE PTR SS:[ESP+EDX+13],CL //用户名覆盖掉串S1。
0041DEF4 |.^EB CA \JMP SHORT VCDCUT.0041DEC0
0041DEF6 |> C64414 14 00 MOV BYTE PTR SS:[ESP+EDX+14],0
0041DEFB |. 6A 01 PUSH 1
0041DEFD |. 68 B8FC4400 PUSH VCDCUT.0044FCB8
0041DF02 |. 8D5424 1C LEA EDX,DWORD PTR SS:[ESP+1C] //用户名地址送EDX。
0041DF06 |. 6A 08 PUSH 8
0041DF08 |. 52 PUSH EDX
0041DF09 |. 68 98134400 PUSH VCDCUT.00441398
0041DF0E |. E8 AD8AFFFF CALL VCDCUT.004169C0 //注册码计算就在这个函数内了。(2)
0041DF13 |. 83C4 14 ADD ESP,14
0041DF16 |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14]
0041DF1A |. 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0041DF1E |. 6A 04 PUSH 4
0041DF20 |. 50 PUSH EAX
0041DF21 |. 51 PUSH ECX
0041DF22 |. E8 49680100 CALL <JMP.&MSVCRT.memmove>
0041DF27 |. 83C4 0C ADD ESP,0C
0041DF2A |. 8D5424 18 LEA EDX,DWORD PTR SS:[ESP+18]
0041DF2E |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0041DF32 |. 6A 04 PUSH 4
0041DF34 |. 52 PUSH EDX
0041DF35 |. 50 PUSH EAX
0041DF36 |. E8 35680100 CALL <JMP.&MSVCRT.memmove>
0041DF3B |. 83C4 0C ADD ESP,0C
0041DF3E |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
0041DF42 |. 6A 00 PUSH 0
0041DF44 |. 68 B8FC4400 PUSH VCDCUT.0044FCB8
0041DF49 |. 6A 08 PUSH 8
0041DF4B |. 51 PUSH ECX
0041DF4C |. 68 98134400 PUSH VCDCUT.00441398
0041DF51 |. E8 6A8AFFFF CALL VCDCUT.004169C0
0041DF56 |. 8B5424 24 MOV EDX,DWORD PTR SS:[ESP+24] //4字节的16进制数送EDX,逐位转换为ASSIC码作为注册码的第二部分。
0041DF5A |. 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20] //4字节的16进制数送EAX,逐位转换为ASSIC码作为注册码的第一部分。
0041DF5E |. 83C4 14 ADD ESP,14
0041DF61 |. 8D8C24 14010000 LEA ECX,DWORD PTR SS:[ESP+114]
0041DF68 |. 52 PUSH EDX
0041DF69 |. 50 PUSH EAX
0041DF6A |. 68 EC134400 PUSH VCDCUT.004413EC
0041DF6F |. 51 PUSH ECX
0041DF70 |. FF15 24774900 CALL DWORD PTR DS:[<&USER32.wsprintfA>] //把上述得到的16个ASSIC码按8字符一组,分2组,用'-'连接起来。这就是真正的注册码了。
0041DF76 |. 8BB424 2C020000 MOV ESI,DWORD PTR SS:[ESP+22C]
0041DF7D |. 83C4 10 ADD ESP,10
0041DF80 |. 8D8424 14010000 LEA EAX,DWORD PTR SS:[ESP+114]
0041DF87 |> 8A10 /MOV DL,BYTE PTR DS:[EAX] //真码逐位送DL,循环比较。
0041DF89 |. 8A1E |MOV BL,BYTE PTR DS:[ESI] //假码逐位送BL,循环比较。
0041DF8B |. 8ACA |MOV CL,DL
0041DF8D |. 3AD3 |CMP DL,BL //真假码比较。
0041DF8F |. 75 2F |JNZ SHORT VCDCUT.0041DFC0
0041DF91 |. 84C9 |TEST CL,CL
0041DF93 |. 74 16 |JE SHORT VCDCUT.0041DFAB
0041DF95 |. 8A50 01 |MOV DL,BYTE PTR DS:[EAX+1] //下位真码。
0041DF98 |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1] //下位假码。
0041DF9B |. 8ACA |MOV CL,DL
0041DF9D |. 3AD3 |CMP DL,BL
0041DF9F |. 75 1F |JNZ SHORT VCDCUT.0041DFC0
0041DFA1 |. 83C0 02 |ADD EAX,2
0041DFA4 |. 83C6 02 |ADD ESI,2
0041DFA7 |. 84C9 |TEST CL,CL
0041DFA9 |.^75 DC \JNZ SHORT VCDCUT.0041DF87 //未完继续循环。
0041DFAB |> 33C0 XOR EAX,EAX //EAX清0。
0041DFAD |. 33C9 XOR ECX,ECX //ECX清0。
0041DFAF |. 85C0 TEST EAX,EAX //测试EAX是否0。
0041DFB1 |. 0F94C1 SETE CL //如果EAX为0,则置ECX为1,成功标志位。
0041DFB4 |. 8BC1 MOV EAX,ECX //ECX的值送EAX。
0041DFB6 |. 5F POP EDI
0041DFB7 |. 5E POP ESI
0041DFB8 |. 5B POP EBX
0041DFB9 |. 81C4 08020000 ADD ESP,208
0041DFBF |. C3 RETN
0041DFC0 |> 1BC0 SBB EAX,EAX
0041DFC2 |. 5F POP EDI
0041DFC3 |. 83D8 FF SBB EAX,-1
0041DFC6 |. 33C9 XOR ECX,ECX
0041DFC8 |. 85C0 TEST EAX,EAX
0041DFCA |. 0F94C1 SETE CL
0041DFCD |. 5E POP ESI
0041DFCE |. 8BC1 MOV EAX,ECX
0041DFD0 |. 5B POP EBX
0041DFD1 |. 81C4 08020000 ADD ESP,208
0041DFD7 \. C3 RETN
==========================================================================================
下面分析(2)处的函数:
004169C0 /$ 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
004169C4 |. 53 PUSH EBX
004169C5 |. 99 CDQ
004169C6 |. 83E2 07 AND EDX,7
004169C9 |. 55 PUSH EBP
004169CA |. 03C2 ADD EAX,EDX
004169CC |. 8B6C24 10 MOV EBP,DWORD PTR SS:[ESP+10]
004169D0 |. 56 PUSH ESI
004169D1 |. 8BF0 MOV ESI,EAX
004169D3 |. 8B4424 20 MOV EAX,DWORD PTR SS:[ESP+20]
004169D7 |. 57 PUSH EDI
004169D8 |. C1FE 03 SAR ESI,3 //用户名长度右移3次。
004169DB |. C1E6 03 SHL ESI,3 //用户名长度左移3次。
004169DE |. 85C0 TEST EAX,EAX
004169E0 |. C705 A89A4400 FFFF>MOV DWORD PTR DS:[449AA8],-1 //把FFFFFFFFh常量送此地址保存。
004169EA |. 74 18 JE SHORT VCDCUT.00416A04
004169EC |. 33FF XOR EDI,EDI
004169EE |. 85F6 TEST ESI,ESI
004169F0 |. 7E 12 JLE SHORT VCDCUT.00416A04 //此处未跳。
004169F2 |> 0FBE042F /MOVSX EAX,BYTE PTR DS:[EDI+EBP] //用户名字符依次送EAX。
004169F6 |. 50 |PUSH EAX
004169F7 |. E8 94FFFFFF |CALL VCDCUT.00416990 //对用户名查表计算。 (3)
004169FC |. 83C4 04 |ADD ESP,4
004169FF |. 47 |INC EDI //计数器增1。
00416A00 |. 3BFE |CMP EDI,ESI
00416A02 |.^7C EE \JL SHORT VCDCUT.004169F2 //未到用户名长度,则继续。
00416A04 |> 8B5424 14 MOV EDX,DWORD PTR SS:[ESP+14] //根据CMOS信息得到的ID串的地址送EDX。比如247fcfab。
00416A08 |. 83C9 FF OR ECX,FFFFFFFF
00416A0B |. 8BFA MOV EDI,EDX
00416A0D |. 33C0 XOR EAX,EAX
00416A0F |. F2:AE REPNE SCAS BYTE PTR ES:[EDI] //扫描上述ID串,得长度。
00416A11 |. F7D1 NOT ECX
00416A13 |. 49 DEC ECX
00416A14 |. 83F9 09 CMP ECX,9
00416A17 |. 76 03 JBE SHORT VCDCUT.00416A1C //小于9则跳走。
00416A19 |. 8842 08 MOV BYTE PTR DS:[EDX+8],AL
00416A1C |> 52 PUSH EDX
00416A1D |. E8 5EF9FFFF CALL VCDCUT.00416380 //查表计算。 (4)
00416A22 |. 83C4 04 ADD ESP,4
00416A25 |. 85F6 TEST ESI,ESI
00416A27 |. 7D 08 JGE SHORT VCDCUT.00416A31 //此处跳走。
00416A29 |. 83C8 FF OR EAX,FFFFFFFF
00416A2C |. 5F POP EDI
00416A2D |. 5E POP ESI
00416A2E |. 5D POP EBP
00416A2F |. 5B POP EBX
00416A30 |. C3 RETN
00416A31 |> 85F6 TEST ESI,ESI
00416A33 |. 8BFD MOV EDI,EBP
00416A35 |. 7E 25 JLE SHORT VCDCUT.00416A5C //此处未跳。
00416A37 |. 8D5E 07 LEA EBX,DWORD PTR DS:[ESI+7]
00416A3A |. C1EB 03 SHR EBX,3
00416A3D |> 8B4424 24 /MOV EAX,DWORD PTR SS:[ESP+24]
00416A41 |. 57 |PUSH EDI
00416A42 |. 85C0 |TEST EAX,EAX
00416A44 |. 57 |PUSH EDI
00416A45 |. 74 07 |JE SHORT VCDCUT.00416A4E
00416A47 |. E8 54F7FFFF |CALL VCDCUT.004161A0 //EAX为0,则用此函数进行用户名计算。 (5)
00416A4C |. EB 05 |JMP SHORT VCDCUT.00416A53
00416A4E |> E8 FDF7FFFF |CALL VCDCUT.00416250 //EAX为非0,则用此函数进行用户名计算。
00416A53 |> 83C4 08 |ADD ESP,8
00416A56 |. 83C7 08 |ADD EDI,8
00416A59 |. 4B |DEC EBX
00416A5A |.^75 E1 \JNZ SHORT VCDCUT.00416A3D
00416A5C |> 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24]
00416A60 |. 85C0 TEST EAX,EAX
00416A62 |. 75 18 JNZ SHORT VCDCUT.00416A7C
00416A64 |. 33FF XOR EDI,EDI
00416A66 |. 85F6 TEST ESI,ESI
00416A68 |. 7E 12 JLE SHORT VCDCUT.00416A7C
00416A6A |> 0FBE0C2F /MOVSX ECX,BYTE PTR DS:[EDI+EBP]
00416A6E |. 51 |PUSH ECX
00416A6F |. E8 1CFFFFFF |CALL VCDCUT.00416990 //再次查表计算。参考(3)。
00416A74 |. 83C4 04 |ADD ESP,4
00416A77 |. 47 |INC EDI
00416A78 |. 3BFE |CMP EDI,ESI
00416A7A |.^7C EE \JL SHORT VCDCUT.00416A6A
00416A7C |> A1 A89A4400 MOV EAX,DWORD PTR DS:[449AA8] //用户名计算后得到的结果送EAX。
00416A81 |. 8B5424 20 MOV EDX,DWORD PTR SS:[ESP+20]
00416A85 |. A3 A8FB4400 MOV DWORD PTR DS:[44FBA8],EAX //EAX送[44FBA8]处。
00416A8A |. 5F POP EDI
00416A8B |. F7D0 NOT EAX //EAX取反。
00416A8D |. A3 A89A4400 MOV DWORD PTR DS:[449AA8],EAX //覆盖原来的数值。
00416A92 |. A3 AC9A4400 MOV DWORD PTR DS:[449AAC],EAX //EAX送[449AAC]。
00416A97 |. 5E POP ESI
00416A98 |. 8902 MOV DWORD PTR DS:[EDX],EAX
00416A9A |. 5D POP EBP
00416A9B |. 33C0 XOR EAX,EAX
00416A9D |. 5B POP EBX
00416A9E \. C3 RETN
==========================================================================================
下面简单看看(3)处的函数:
00416990 /$ 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4] //用户名字符逐位送ECX。
00416994 |. A1 A89A4400 MOV EAX,DWORD PTR DS:[449AA8] //[449AA8]内存内的值送EAX。初始值为FFFFFFFFh.
00416999 |. 33C8 XOR ECX,EAX //ECX与EAX异或。
0041699B |. 81E1 FF000000 AND ECX,0FF //取最低字节。
004169A1 |. C1E8 08 SHR EAX,8 //EAX右移8次。
004169A4 |. 8B148D F8EF4300 MOV EDX,DWORD PTR DS:[ECX*4+43EFF8] //根据得到的ECX查表得一个数,送EDX。
004169AB |. 33D0 XOR EDX,EAX //EDX与EAX异或。
004169AD |. B8 01000000 MOV EAX,1 //EAX置1。
004169B2 |. 8915 A89A4400 MOV DWORD PTR DS:[449AA8],EDX //EDX送[449AA8]内存。
004169B8 \. C3 RETN
==========================================================================================
下面简单分析(4)处的函数:
00416380 /$ 68 B0EC4300 PUSH VCDCUT.0043ECB0
00416385 |. 68 40EB4400 PUSH VCDCUT.0044EB40
0041638A |. E8 31020000 CALL VCDCUT.004165C0 //强度非常大的计算。 (6)
0041638F |. 83C4 08 ADD ESP,8
00416392 |. 68 F0EC4300 PUSH VCDCUT.0043ECF0
00416397 |. 68 A8F34400 PUSH VCDCUT.0044F3A8
0041639C |. E8 1F020000 CALL VCDCUT.004165C0
004163A1 |. 8B4424 0C MOV EAX,DWORD PTR SS:[ESP+C]
004163A5 |. 83C4 08 ADD ESP,8
004163A8 |. 50 PUSH EAX
004163A9 |. E8 B2000000 CALL VCDCUT.00416460 //强度非常大的计算。 (7)
004163AE |. 83C4 04 ADD ESP,4
004163B1 |. E8 1A000000 CALL VCDCUT.004163D0 //强度非常大的计算。 (8)
004163B6 |. E8 75010000 CALL VCDCUT.00416530 //强度非常大的计算。 (9)
004163BB |. B8 01000000 MOV EAX,1
004163C0 \. C3 RETN
==========================================================================================
下面简单分析(5)处的函数:
004161A0 /$ 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
004161A4 |. 81EC 90000000 SUB ESP,90
004161AA |. 8D4424 08 LEA EAX,DWORD PTR SS:[ESP+8]
004161AE |. 56 PUSH ESI
004161AF |. 57 PUSH EDI
004161B0 |. 50 PUSH EAX
004161B1 |. 68 40EB4400 PUSH VCDCUT.0044EB40
004161B6 |. 51 PUSH ECX
004161B7 |. E8 54010000 CALL VCDCUT.00416310 //根据用户名计算得到8字节数。 (10)
004161BC |. 83C4 0C ADD ESP,0C
004161BF |. 33F6 XOR ESI,ESI
004161C1 |. 8D7C24 10 LEA EDI,DWORD PTR SS:[ESP+10]
004161C5 |> 8D57 08 /LEA EDX,DWORD PTR DS:[EDI+8]
004161C8 |. 52 |PUSH EDX
004161C9 |. 57 |PUSH EDI
004161CA |. 56 |PUSH ESI
004161CB |. E8 80040000 |CALL VCDCUT.00416650
004161D0 |. 83C4 0C |ADD ESP,0C
004161D3 |. 46 |INC ESI
004161D4 |. 83C7 08 |ADD EDI,8
004161D7 |. 83FE 10 |CMP ESI,10
004161DA |.^7C E9 \JL SHORT VCDCUT.004161C5
004161DC |. 8B8424 94000000 MOV EAX,DWORD PTR SS:[ESP+94]
004161E3 |. 8A8C24 91000000 MOV CL,BYTE PTR SS:[ESP+91]
004161EA |. 8A9424 92000000 MOV DL,BYTE PTR SS:[ESP+92]
004161F1 |. 884424 08 MOV BYTE PTR SS:[ESP+8],AL
004161F5 |. 886424 09 MOV BYTE PTR SS:[ESP+9],AH
004161F9 |. 66:8B8424 96000000 MOV AX,WORD PTR SS:[ESP+96]
00416201 |. 884424 0A MOV BYTE PTR SS:[ESP+A],AL
00416205 |. 8A8424 90000000 MOV AL,BYTE PTR SS:[ESP+90]
0041620C |. 884C24 0D MOV BYTE PTR SS:[ESP+D],CL
00416210 |. 8B8C24 A0000000 MOV ECX,DWORD PTR SS:[ESP+A0]
00416217 |. 885424 0E MOV BYTE PTR SS:[ESP+E],DL
0041621B |. 884424 0C MOV BYTE PTR SS:[ESP+C],AL
0041621F |. 8A8424 93000000 MOV AL,BYTE PTR SS:[ESP+93]
00416226 |. 51 PUSH ECX
00416227 |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
0041622B |. 68 A8F34400 PUSH VCDCUT.0044F3A8
00416230 |. 52 PUSH EDX
00416231 |. 886424 17 MOV BYTE PTR SS:[ESP+17],AH
00416235 |. 884424 1B MOV BYTE PTR SS:[ESP+1B],AL
00416239 |. E8 D2000000 CALL VCDCUT.00416310
0041623E |. 83C4 0C ADD ESP,0C
00416241 |. B8 01000000 MOV EAX,1
00416246 |. 5F POP EDI
00416247 |. 5E POP ESI
00416248 |. 81C4 90000000 ADD ESP,90
0041624E \. C3 RETN
==========================================================================================
下面简单分析(6)处的函数:
004165C0 /$ 53 PUSH EBX
004165C1 |. 55 PUSH EBP
004165C2 |. 8B6C24 0C MOV EBP,DWORD PTR SS:[ESP+C]
004165C6 |. 56 PUSH ESI
004165C7 |. 57 PUSH EDI
004165C8 |. B9 00020000 MOV ECX,200
004165CD |. 33C0 XOR EAX,EAX
004165CF |. 8BFD MOV EDI,EBP
004165D1 |. F3:AB REP STOS DWORD PTR ES:[EDI]
004165D3 |. 33FF XOR EDI,EDI
004165D5 |. 897C24 14 MOV DWORD PTR SS:[ESP+14],EDI //EDI=0,送ESP+14地址。作为计数器。
004165D9 |> 33F6 /XOR ESI,ESI //下面这个三重循环次数达到40h*10h*10h次=16384次。
004165DB |> 33C9 |/XOR ECX,ECX //功能就是查表
004165DD |> 8B4424 18 ||/MOV EAX,DWORD PTR SS:[ESP+18]
004165E1 |. 8B5C24 14 |||MOV EBX,DWORD PTR SS:[ESP+14] //计数器值送EBX。
004165E5 |. 0FBE0401 |||MOVSX EAX,BYTE PTR DS:[ECX+EAX] //根据EAX查表,结果送EAX。
004165E9 |. 48 |||DEC EAX //EAX减1。
004165EA |. 8BD0 |||MOV EDX,EAX //EAX送EDX。
004165EC |. C1FA 02 |||SAR EDX,2 //EDX右移2次。
004165EF |. 3BD3 |||CMP EDX,EBX //比较EDX和EBX。
004165F1 |. 75 2D |||JNZ SHORT VCDCUT.00416620 //比较结果不为0,则跳走。
004165F3 |. 83E0 03 |||AND EAX,3
004165F6 |. 853485 E8EF4300 |||TEST DWORD PTR DS:[EAX*4+43EFE8],ESI //根据EAX查表得结果跟ESI相与。
004165FD |. 74 21 |||JE SHORT VCDCUT.00416620 //测试结果为0,则跳走。
004165FF |. 8BD1 |||MOV EDX,ECX
00416601 |. 8BDD |||MOV EBX,EBP
00416603 |. C1FA 03 |||SAR EDX,3
00416606 |. 8D043E |||LEA EAX,DWORD PTR DS:[ESI+EDI] //EAX=ESI+EDI。ESI和EDI分别都是计数器。
00416609 |. 03DA |||ADD EBX,EDX
0041660B |. 8BD1 |||MOV EDX,ECX
0041660D |. 8D04C3 |||LEA EAX,DWORD PTR DS:[EBX+EAX*8] //EAX=EBX+8*EAX。形成一个地址。
00416610 |. 83E2 07 |||AND EDX,7
00416613 |. 8A1495 C8EF4300 |||MOV DL,BYTE PTR DS:[EDX*4+43EFC8] //根据EDX查表,结果送DL。
0041661A |. 8A18 |||MOV BL,BYTE PTR DS:[EAX] //根据EAX查表,结果送BL。
0041661C |. 0ADA |||OR BL,DL //BL跟DL或运算。
0041661E |. 8818 |||MOV BYTE PTR DS:[EAX],BL //结果送[EAX]处。
00416620 |> 41 |||INC ECX
00416621 |. 83F9 40 |||CMP ECX,40
00416624 |.^7C B7 ||\JL SHORT VCDCUT.004165DD
00416626 |. 46 ||INC ESI
00416627 |. 83FE 10 ||CMP ESI,10
0041662A |.^7C AF |\JL SHORT VCDCUT.004165DB
0041662C |. 8B5424 14 |MOV EDX,DWORD PTR SS:[ESP+14]
00416630 |. 83C7 10 |ADD EDI,10
00416633 |. 42 |INC EDX
00416634 |. 81FF 00010000 |CMP EDI,100
0041663A |. 895424 14 |MOV DWORD PTR SS:[ESP+14],EDX
0041663E |.^7C 99 \JL SHORT VCDCUT.004165D9
00416640 |. 5F POP EDI
00416641 |. 5E POP ESI
00416642 |. 5D POP EBP
00416643 |. B8 01000000 MOV EAX,1
00416648 |. 5B POP EBX
00416649 \. C3 RETN
==========================================================================================
下面简单分析(7)处的函数:
00416460 /$ 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00416464 |. 53 PUSH EBX
00416465 |. 55 PUSH EBP
00416466 |. 56 PUSH ESI
00416467 |. 57 PUSH EDI
00416468 |. 33C9 XOR ECX,ECX
0041646A |> 0FBE81 30ED4300 /MOVSX EAX,BYTE PTR DS:[ECX+43ED30] //下面这个循环也是查表。
00416471 |. 48 |DEC EAX
00416472 |. 8BF0 |MOV ESI,EAX //EAX送ESI。
00416474 |. C1F8 03 |SAR EAX,3 //EAX右移3次。
00416477 |. 83E6 07 |AND ESI,7 //ESI跟7相与。
0041647A |. 0FBE0410 |MOVSX EAX,BYTE PTR DS:[EAX+EDX] //根据EAX查表,结果送EAX。
0041647E |. 8B1CB5 C8EF4300 |MOV EBX,DWORD PTR DS:[ESI*4+43EFC8] //根据ESI查表,结果送EBX。
00416485 |. 23D8 |AND EBX,EAX //EAX跟EBX相与。
00416487 |. F7DB |NEG EBX //EBX求补。
00416489 |. 1BDB |SBB EBX,EBX //EBX自减。
0041648B |. F7DB |NEG EBX
0041648D |. 8899 D0EA4400 |MOV BYTE PTR DS:[ECX+44EAD0],BL //BL结果送内存。
00416493 |. 41 |INC ECX
00416494 |. 83F9 38 |CMP ECX,38
00416497 |.^7C D1 \JL SHORT VCDCUT.0041646A //循环38h次。
00416499 |. B9 18000000 MOV ECX,18
0041649E |. 33C0 XOR EAX,EAX
004164A0 |. BF 48F34400 MOV EDI,VCDCUT.0044F348
004164A5 |. 33ED XOR EBP,EBP
004164A7 |. F3:AB REP STOS DWORD PTR ES:[EDI] //指定内存区域清0。
004164A9 |. 33FF XOR EDI,EDI
004164AB |> 0FBE8D 68ED4300 /MOVSX ECX,BYTE PTR SS:[EBP+43ED68] //查表结果送ECX。
004164B2 |. 33C0 |XOR EAX,EAX
004164B4 |> 33D2 |/XOR EDX,EDX //EDX清0。
004164B6 |. 83F8 1C ||CMP EAX,1C //EAX与1C比较。
004164B9 |. 0F9DC2 ||SETGE DL //EAX大于等于1C则DL置1。
004164BC |. 4A ||DEC EDX //DL减1。
004164BD |. 8BF1 ||MOV ESI,ECX //ECX送ESI。
004164BF |. 83E2 E4 ||AND EDX,FFFFFFE4 //EDX与这个常数相与。
004164C2 |. 83C2 38 ||ADD EDX,38 //EDX加38h。
004164C5 |. 3BCA ||CMP ECX,EDX //ECX跟EDX比较。
004164C7 |. 7C 03 ||JL SHORT VCDCUT.004164CC //ECX小于EDX则跳。
004164C9 |. 8D71 E4 ||LEA ESI,DWORD PTR DS:[ECX-1C] //否则ESI=ECX-1Ch。
004164CC |> 8A96 D0EA4400 ||MOV DL,BYTE PTR DS:[ESI+44EAD0] //根据ESI查表,结果送DL。
004164D2 |. 8890 08EB4400 ||MOV BYTE PTR DS:[EAX+44EB08],DL //DL送内存。
004164D8 |. 40 ||INC EAX
004164D9 |. 41 ||INC ECX
004164DA |. 83F8 38 ||CMP EAX,38 //循环38h次。
004164DD |.^7C D5 |\JL SHORT VCDCUT.004164B4
004164DF |. 33C0 |XOR EAX,EAX
004164E1 |> 0FBE88 78ED4300 |/MOVSX ECX,BYTE PTR DS:[EAX+43ED78] //查表结果送ECX。
004164E8 |. 8A91 07EB4400 ||MOV DL,BYTE PTR DS:[ECX+44EB07] //查表结果送DL。
004164EE |. 84D2 ||TEST DL,DL
004164F0 |. 74 23 ||JE SHORT VCDCUT.00416515 //DL为0则跳。
004164F2 |. 8BD0 ||MOV EDX,EAX //EAX送EDX。
004164F4 |. C1FA 03 ||SAR EDX,3 //EDX右移3次。
004164F7 |. 8A9C3A 48F34400 ||MOV BL,BYTE PTR DS:[EDX+EDI+44F348] //根据EDX和EDI查表,结果送BL。
004164FE |. 8D8C3A 48F34400 ||LEA ECX,DWORD PTR DS:[EDX+EDI+44F348] //构造的地址送ECX。
00416505 |. 8BD0 ||MOV EDX,EAX //EAX送EDX。
00416507 |. 83E2 07 ||AND EDX,7 //EDX跟7相与。
0041650A |. 8A1495 C8EF4300 ||MOV DL,BYTE PTR DS:[EDX*4+43EFC8] //根据EDX查表,结果送DL。
00416511 |. 0ADA ||OR BL,DL //BL跟DL或运算。
00416513 |. 8819 ||MOV BYTE PTR DS:[ECX],BL //结果送[ECX]处。
00416515 |> 40 ||INC EAX
00416516 |. 83F8 30 ||CMP EAX,30
00416519 |.^7C C6 |\JL SHORT VCDCUT.004164E1 //循环30h次。
0041651B |. 83C7 06 |ADD EDI,6
0041651E |. 45 |INC EBP
0041651F |. 83FF 60 |CMP EDI,60
00416522 |.^7C 87 \JL SHORT VCDCUT.004164AB //EDI为循环变量,步长为6,共10次循环。
00416524 |. 5F POP EDI
00416525 |. 5E POP ESI
00416526 |. 5D POP EBP
00416527 |. B8 01000000 MOV EAX,1
0041652C |. 5B POP EBX
0041652D \. C3 RETN
==========================================================================================
下面简单分析(8)处的函数:
004163D0 /$ 53 PUSH EBX
004163D1 |. 55 PUSH EBP
004163D2 |. 56 PUSH ESI
004163D3 |. 57 PUSH EDI
004163D4 |. 33FF XOR EDI,EDI //EDI清0。
004163D6 |. BD B0AA4400 MOV EBP,VCDCUT.0044AAB0
004163DB |> 33F6 /XOR ESI,ESI //ESI清0。循环开始。
004163DD |> 8BC6 |/MOV EAX,ESI //ESI送EAX。内层循环开始。
004163DF |. 83E0 3F ||AND EAX,3F //EAX与3Fh相与。
004163E2 |. 50 ||PUSH EAX //参数进栈。
004163E3 |. 8D47 01 ||LEA EAX,DWORD PTR DS:[EDI+1] //EAX=EDI+1。
004163E6 |. 50 ||PUSH EAX //参数进栈。
004163E7 |. E8 44000000 ||CALL VCDCUT.00416430 //根据参数形成新数。 (11)
004163EC |. 8BCE ||MOV ECX,ESI
004163EE |. 83C4 08 ||ADD ESP,8
004163F1 |. C1F9 06 ||SAR ECX,6
004163F4 |. 8BD8 ||MOV EBX,EAX //前面函数返回结果送EBX。
004163F6 |. 51 ||PUSH ECX //参数进栈。
004163F7 |. 57 ||PUSH EDI //参数进栈。
004163F8 |. 80E3 0F ||AND BL,0F
004163FB |. E8 30000000 ||CALL VCDCUT.00416430 //根据参数形成新数。
00416400 |. C0E0 04 ||SHL AL,4 //得到AL左移4次。
00416403 |. 0AD8 ||OR BL,AL //两个函数的返回结果合并为一个字节。
00416405 |. 83C4 08 ||ADD ESP,8
00416408 |. 881C2E ||MOV BYTE PTR DS:[ESI+EBP],BL //保存结果。
0041640B |. 46 ||INC ESI
0041640C |. 81FE 00100000 ||CMP ESI,1000
00416412 |.^7C C9 |\JL SHORT VCDCUT.004163DD //内循环是1000h次。
00416414 |. 81C5 00100000 |ADD EBP,1000
0041641A |. 83C7 02 |ADD EDI,2
0041641D |. 81FD B0EA4400 |CMP EBP,VCDCUT.0044EAB0 //外循环4次。
00416423 |.^7C B6 \JL SHORT VCDCUT.004163DB
00416425 |. 5F POP EDI
00416426 |. 5E POP ESI
00416427 |. 5D POP EBP
00416428 |. B8 01000000 MOV EAX,1
0041642D |. 5B POP EBX
0041642E \. C3 RETN
==========================================================================================
下面简单分析(9)处的函数:
00416530 /$ 53 PUSH EBX
00416531 |. 55 PUSH EBP
00416532 |. 56 PUSH ESI
00416533 |. 57 PUSH EDI
00416534 |. B9 00040000 MOV ECX,400
00416539 |. 33C0 XOR EAX,EAX
0041653B |. BF B09A4400 MOV EDI,VCDCUT.00449AB0
00416540 |. 33ED XOR EBP,EBP
00416542 |. F3:AB REP STOS DWORD PTR ES:[EDI] //指定内存区域清0。
00416544 |. 33FF XOR EDI,EDI
00416546 |> 33F6 /XOR ESI,ESI
00416548 |> 33C9 |/XOR ECX,ECX
0041654A |> 0FBE81 A8EF4300 ||/MOVSX EAX,BYTE PTR DS:[ECX+43EFA8] //查表结果送EAX。
00416551 |. 48 |||DEC EAX //EAX减1。
00416552 |. 8BD0 |||MOV EDX,EAX //EAX送EDX。
00416554 |. C1FA 03 |||SAR EDX,3 //EDX右移3次。
00416557 |. 3BD5 |||CMP EDX,EBP
00416559 |. 75 32 |||JNZ SHORT VCDCUT.0041658D //不为0则跳。
0041655B |. 83E0 07 |||AND EAX,7 //否则EAX跟7相与。
0041655E |. 853485 C8EF4300 |||TEST DWORD PTR DS:[EAX*4+43EFC8],ESI //根据EAX取数与ESI相与。
00416565 |. 74 26 |||JE SHORT VCDCUT.0041658D //为0则跳。
00416567 |. 8BD1 |||MOV EDX,ECX //否则ECX送EDX。
00416569 |. 8D043E |||LEA EAX,DWORD PTR DS:[ESI+EDI] //EAX=ESI+EDI,ESI和EDI分别为计数器。
0041656C |. C1FA 03 |||SAR EDX,3 //EDX右移3次。
0041656F |. 8A9C82 B09A4400 |||MOV BL,BYTE PTR DS:[EDX+EAX*4+449AB0] //根据EDX和EAX,查表取结果送BL。
00416576 |. 8D8482 B09A4400 |||LEA EAX,DWORD PTR DS:[EDX+EAX*4+449AB0] //EAX=EDX+EAX*4+449AB0,是一个地址。
0041657D |. 8BD1 |||MOV EDX,ECX
0041657F |. 83E2 07 |||AND EDX,7
00416582 |. 8A1495 C8EF4300 |||MOV DL,BYTE PTR DS:[EDX*4+43EFC8] //根据EDX取结果送DL。
00416589 |. 0ADA |||OR BL,DL //BL与DL相或。
0041658B |. 8818 |||MOV BYTE PTR DS:[EAX],BL //结果保存到EAX所指地址。
0041658D |> 41 |||INC ECX
0041658E |. 83F9 20 |||CMP ECX,20
00416591 |.^7C B7 ||\JL SHORT VCDCUT.0041654A //循环20h次。
00416593 |. 46 ||INC ESI
00416594 |. 81FE 00010000 ||CMP ESI,100
0041659A |.^7C AC |\JL SHORT VCDCUT.00416548 //循环100h次。
0041659C |. 81C7 00010000 |ADD EDI,100
004165A2 |. 45 |INC EBP
004165A3 |. 81FF 00040000 |CMP EDI,400
004165A9 |.^7C 9B \JL SHORT VCDCUT.00416546 //循环4次。
004165AB |. 5F POP EDI
004165AC |. 5E POP ESI
004165AD |. 5D POP EBP
004165AE |. B8 01000000 MOV EAX,1
004165B3 |. 5B POP EBX
004165B4 \. C3 RETN
==========================================================================================
下面简单分析(10)处的函数:
00416310 /$ 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
00416314 |. 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00416318 |. 33C0 XOR EAX,EAX
0041631A |. 53 PUSH EBX
0041631B |. 55 PUSH EBP
0041631C |. 8901 MOV DWORD PTR DS:[ECX],EAX
0041631E |. 56 PUSH ESI
0041631F |. 57 PUSH EDI
00416320 |. 895424 14 MOV DWORD PTR SS:[ESP+14],EDX
00416324 |. 8B5424 18 MOV EDX,DWORD PTR SS:[ESP+18]
00416328 |. 8941 04 MOV DWORD PTR DS:[ECX+4],EAX
0041632B |. 33FF XOR EDI,EDI
0041632D |> 8B4424 14 /MOV EAX,DWORD PTR SS:[ESP+14] //取一地址送EAX。
00416331 |. 8B4C24 1C |MOV ECX,DWORD PTR SS:[ESP+1C] //取一地址送ECX。
00416335 |. BD 08000000 |MOV EBP,8 //EBP为循环计数器。
0041633A |. 0FBE00 |MOVSX EAX,BYTE PTR DS:[EAX] //取一数送EAX。
0041633D |. 8BF0 |MOV ESI,EAX
0041633F |. 83E0 0F |AND EAX,0F //EAX跟F相与。
00416342 |. C1FE 04 |SAR ESI,4 //ESI右移4次。
00416345 |. 83E6 0F |AND ESI,0F //ESI跟F相与。
00416348 |. 03F7 |ADD ESI,EDI //ESI=ESI+EDI。
0041634A |. 03C7 |ADD EAX,EDI //EAX=EAX+EDI
0041634C |. 8D34F2 |LEA ESI,DWORD PTR DS:[EDX+ESI*8] //ESI=EDX+8*ESI。形成地址。
0041634F |. 8D84C2 80000000 |LEA EAX,DWORD PTR DS:[EDX+EAX*8+80] //EAX=EDX+EAX*8+80。形成地址。
00416356 |> 8A1E |/MOV BL,BYTE PTR DS:[ESI] //ESI处的值送BL。
00416358 |. 0A18 ||OR BL,BYTE PTR DS:[EAX] //BL跟[EAX]处的值相或。
0041635A |. 0819 ||OR BYTE PTR DS:[ECX],BL //[ECX]处值跟BL相或。
0041635C |. 40 ||INC EAX
0041635D |. 46 ||INC ESI
0041635E |. 41 ||INC ECX
0041635F |. 4D ||DEC EBP
00416360 |.^75 F4 |\JNZ SHORT VCDCUT.00416356 //循环8次。
00416362 |. 8B4C24 14 |MOV ECX,DWORD PTR SS:[ESP+14]
00416366 |. 83C7 20 |ADD EDI,20
00416369 |. 41 |INC ECX
0041636A |. 81FF 00010000 |CMP EDI,100
00416370 |. 894C24 14 |MOV DWORD PTR SS:[ESP+14],ECX
00416374 |.^7C B7 \JL SHORT VCDCUT.0041632D //外循环为8次。
00416376 |. 5F POP EDI
00416377 |. 5E POP ESI
00416378 |. 5D POP EBP
00416379 |. B8 01000000 MOV EAX,1
0041637E |. 5B POP EBX
0041637F \. C3 RETN
==========================================================================================
下面简单分析(11)处的函数:
00416430 /$ 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] //取内存里的数到EAX。
00416434 |. 8BD0 MOV EDX,EAX //送EDX。
00416436 |. 8BC8 MOV ECX,EAX //送ECX。
00416438 |. C1FA 04 SAR EDX,4 //EDX右移4次。
0041643B |. 83E1 01 AND ECX,1 //ECX与1相与。
0041643E |. 83E2 02 AND EDX,2 //EDX与2相与。
00416441 |. 0BCA OR ECX,EDX //ECX与EDX相或。
00416443 |. 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4] //取一数到EDX。
00416447 |. D1F8 SAR EAX,1 //EAX右移1次。
00416449 |. 8D0C91 LEA ECX,DWORD PTR DS:[ECX+EDX*4] //ECX=ECX+EDX*4,形成偏移量。
0041644C |. 83E0 0F AND EAX,0F //EAX与F相与。
0041644F |. C1E1 04 SHL ECX,4 //ECX左移4次。
00416452 |. 0FBE8401 A8ED4300 MOVSX EAX,BYTE PTR DS:[ECX+EAX+43EDA8] //根据ECX,EAX取数到EAX。
0041645A \. C3 RETN
==========================================================================================
后记:终于花费了2个小时才把这篇文章写定,感到这个软件的保护跟我以前碰到的一个软件类似,我一时记不起来了。中间产生好多'0','1'串,根据这些串形成注册码。对这个软件的评价不敢恭维。我不厌其烦的把主要代码贴出来,目的就是想说一个问题,不要看软件保护看起来很强大,有时跟纸老虎一样,虽然用了如此繁杂的步骤来产生一个注册码,最终没有逃脱被跟踪的厄运。我建议开发者多研究软件本身的功能,而不是用这些花架子来保护所谓的成果。该软件作者收取的注册费是人民币50元,收取外国人是$20。我觉得不值。
注册成功后,单击HELP内的ABOUT可以看到“This copy is licensed to: wanggang”,同时也显示在程序主窗口内。但是一旦注册成功,REGISTER命令不好用了,无法进行二次注册。另外,我用REGMON监视它,发现这个软件没有在注册表内或者文件内写入东西,真是纳闷!想修改为未注册也不可能了!! 随便给出我机器上的注册码:69844664-81238d99。 感谢您的支持和阅读!!浪费您宝贵时间!非常抱歉!! qduwg
qduwg@163.com 2006年2月11日早ETHIOPIA
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课