中学CAI课件、积件管理 V1.0的注册
【破文作者】 Rdsnow【 E-mail 】 [email protected]
【 作者QQ 】 83757177
【文章题目】 中学CAI课件、积件管理 V1.0的注册
【软件名称】 中学CAI课件、积件管理 V1.0
【下载地址】 http://www.softreg.com.cn/shareware_view.aspx?id=/65FB0BC4-A791-45A4-8545-45CEAC8CDE5F/
----------------------------------------------------------------------------------------------
【加密方式】 注册码
【破解工具】 FLYOD V1.10、W32DASM V8.93
【软件限制】 功能限制
【破解平台】 XP SP2
----------------------------------------------------------------------------------------------
【软件简介】
该软件提供了易用的课件(积件)收集、分类、浏览、调用等功能,通过它就可以将分散的课件、积件很好地管理起来,使广大教师能够充分地利用这些课件和积件资源。
【文章简介】
作者为这个软件的注册写了很多代码,但是却采用了明码比较,这就可以让破解者在短短几分钟内得到注册码!这是软件作者的失误,另外,注册时虽然有注册信息码,而且计算过程中也有对信息码的处理,但是却不影响到最后的注册码!让我们来看看这个软件的注册。
----------------------------------------------------------------------------------------------
【破解过程】
OD载入,输入用户名"Rdsnow",假注册码"987A-8765B-7654C",来到这里:
004F60EA|> \8D55 E4 LEA EDX,DWORD PTR SS:
004F60ED|.8B83 14030000 MOV EAX,DWORD PTR DS:
004F60F3|.E8 4C5AF5FF CALL Unpacked.0044BB44 ;取得注册信息码
004F60F8|.8B45 E4 MOV EAX,DWORD PTR SS:
004F60FB|.50 PUSH EAX
004F60FC|.8D55 E0 LEA EDX,DWORD PTR SS:
004F60FF|.8B83 10030000 MOV EAX,DWORD PTR DS:
004F6105|.E8 3A5AF5FF CALL Unpacked.0044BB44 ;取得用户名
004F610A|.8B45 E0 MOV EAX,DWORD PTR SS:
004F610D|.8D4D E8 LEA ECX,DWORD PTR SS:
004F6110|.5A POP EDX
004F6111|.E8 42F4FFFF CALL Unpacked.004F5558 ;算注册码
004F6116|.8B45 E8 MOV EAX,DWORD PTR SS:
004F6119|.50 PUSH EAX
004F611A|.8D55 D8 LEA EDX,DWORD PTR SS:
004F611D|.8B83 18030000 MOV EAX,DWORD PTR DS:
004F6123|.E8 1C5AF5FF CALL Unpacked.0044BB44 ;取出输入的假注册码的第一段
004F6128|.FF75 D8 PUSH DWORD PTR SS:
004F612B|.8D55 D4 LEA EDX,DWORD PTR SS:
004F612E|.8B83 1C030000 MOV EAX,DWORD PTR DS:
004F6134|.E8 0B5AF5FF CALL Unpacked.0044BB44 ;取出输入的假注册码的第二段
004F6139|.FF75 D4 PUSH DWORD PTR SS:
004F613C|.8D55 D0 LEA EDX,DWORD PTR SS:
004F613F|.8B83 20030000 MOV EAX,DWORD PTR DS:
004F6145|.E8 FA59F5FF CALL Unpacked.0044BB44 ;取出输入的假注册码的第三段
004F614A|.FF75 D0 PUSH DWORD PTR SS:
004F614D|.8D45 DC LEA EAX,DWORD PTR SS:
004F6150|.BA 03000000 MOV EDX,3
004F6155|.E8 5EEBF0FF CALL Unpacked.00404CB8 ;连接三段假码(不包括'-')
004F615A|.8B45 DC MOV EAX,DWORD PTR SS:
004F615D|.5A POP EDX
004F615E|.E8 E12DF1FF CALL Unpacked.00408F44 ;比较真假注册码
004F6163|.85C0 TEST EAX,EAX
004F6165|.0F85 6D010000 JNZ Unpacked.004F62D8 ;不相等就跳
如果不想分析注册代码,在004F615E地址上中断,做内存注册机,或者将004F6165 JNZ 004F62D8直接NOP掉就可以爆破了
----------------------------------------------------------------------------------------------
想看注册代码,进入004F6111 CALL 004F5558
004F5558$55 PUSH EBP
004F5559|.8BEC MOV EBP,ESP
004F555B|.51 PUSH ECX
004F555C|.B9 0D000000 MOV ECX,0D
004F5561|>6A 00 PUSH 0
004F5563|.6A 00 |PUSH 0
004F5565|.49 |DEC ECX
004F5566|.^ 75 F9 \JNZ SHORT Unpacked.004F5561
004F5568|.51 PUSH ECX
004F5569|.874D FC XCHG DWORD PTR SS:,ECX
004F556C|.53 PUSH EBX
004F556D|.56 PUSH ESI
004F556E|.57 PUSH EDI
004F556F|.894D F4 MOV DWORD PTR SS:,ECX
004F5572|.8955 F8 MOV DWORD PTR SS:,EDX
004F5575|.8945 FC MOV DWORD PTR SS:,EAX
004F5578|.8B45 FC MOV EAX,DWORD PTR SS:
004F557B|.E8 60F8F0FF CALL Unpacked.00404DE0
004F5580|.8B45 F8 MOV EAX,DWORD PTR SS:
004F5583|.E8 58F8F0FF CALL Unpacked.00404DE0
004F5588|.33C0 XOR EAX,EAX
004F558A|.55 PUSH EBP
004F558B|.68 66584F00 PUSH Unpacked.004F5866
004F5590|.64:FF30 PUSH DWORD PTR FS:
004F5593|.64:8920 MOV DWORD PTR FS:,ESP
004F5596|.8D45 E4 LEA EAX,DWORD PTR SS:
004F5599|.E8 A2F3F0FF CALL Unpacked.00404940
004F559E|.8D45 D4 LEA EAX,DWORD PTR SS:
004F55A1|.50 PUSH EAX
004F55A2|.8B45 FC MOV EAX,DWORD PTR SS:
004F55A5|.E8 4EF6F0FF CALL Unpacked.00404BF8 ;取得用户名"Rdsnow"的长度
004F55AA|.8BC8 MOV ECX,EAX
004F55AC|.83E9 03 SUB ECX,3
004F55AF|.BA 04000000 MOV EDX,4
004F55B4|.8B45 FC MOV EAX,DWORD PTR SS:
004F55B7|.E8 94F8F0FF CALL Unpacked.00404E50 ;从第四个字符开始取用户名后面的字符,得到"now"
004F55BC|.8B45 D4 MOV EAX,DWORD PTR SS:
004F55BF|.50 PUSH EAX
004F55C0|.8D45 CC LEA EAX,DWORD PTR SS:
004F55C3|.8B55 FC MOV EDX,DWORD PTR SS:
004F55C6|.8A12 MOV DL,BYTE PTR DS:
004F55C8|.8850 01 MOV BYTE PTR DS:,DL
004F55CB|.C600 01 MOV BYTE PTR DS:,1
004F55CE|.8D55 CC LEA EDX,DWORD PTR SS:
004F55D1|.8D45 C8 LEA EAX,DWORD PTR SS:
004F55D4|.E8 A7D9F0FF CALL Unpacked.00402F80
004F55D9|.BA 74584F00 MOV EDX,Unpacked.004F5874
004F55DE|.8D45 C8 LEA EAX,DWORD PTR SS:
004F55E1|.B1 02 MOV CL,2
004F55E3|.E8 68D9F0FF CALL Unpacked.00402F50
004F55E8|.8D55 C8 LEA EDX,DWORD PTR SS:
004F55EB|.8D45 C4 LEA EAX,DWORD PTR SS:
004F55EE|.E8 8DD9F0FF CALL Unpacked.00402F80
004F55F3|.8D45 C0 LEA EAX,DWORD PTR SS:
004F55F6|.8B55 FC MOV EDX,DWORD PTR SS:
004F55F9|.8A52 01 MOV DL,BYTE PTR DS:
004F55FC|.8850 01 MOV BYTE PTR DS:,DL
004F55FF|.C600 01 MOV BYTE PTR DS:,1
004F5602|.8D55 C0 LEA EDX,DWORD PTR SS:
004F5605|.8D45 C4 LEA EAX,DWORD PTR SS:
004F5608|.B1 03 MOV CL,3
004F560A|.E8 41D9F0FF CALL Unpacked.00402F50
004F560F|.8D55 C4 LEA EDX,DWORD PTR SS:
004F5612|.8D45 B8 LEA EAX,DWORD PTR SS:
004F5615|.E8 66D9F0FF CALL Unpacked.00402F80
004F561A|.BA 78584F00 MOV EDX,Unpacked.004F5878
004F561F|.8D45 B8 LEA EAX,DWORD PTR SS:
004F5622|.B1 04 MOV CL,4
004F5624|.E8 27D9F0FF CALL Unpacked.00402F50
004F5629|.8D55 B8 LEA EDX,DWORD PTR SS:
004F562C|.8D45 B0 LEA EAX,DWORD PTR SS:
004F562F|.E8 4CD9F0FF CALL Unpacked.00402F80
004F5634|.8D45 C0 LEA EAX,DWORD PTR SS:
004F5637|.8B55 FC MOV EDX,DWORD PTR SS:
004F563A|.8A52 02 MOV DL,BYTE PTR DS:
004F563D|.8850 01 MOV BYTE PTR DS:,DL
004F5640|.C600 01 MOV BYTE PTR DS:,1
004F5643|.8D55 C0 LEA EDX,DWORD PTR SS:
004F5646|.8D45 B0 LEA EAX,DWORD PTR SS:
004F5649|.B1 05 MOV CL,5
004F564B|.E8 00D9F0FF CALL Unpacked.00402F50
004F5650|.8D55 B0 LEA EDX,DWORD PTR SS:
004F5653|.8D45 A8 LEA EAX,DWORD PTR SS:
004F5656|.E8 25D9F0FF CALL Unpacked.00402F80
004F565B|.BA 7C584F00 MOV EDX,Unpacked.004F587C
004F5660|.8D45 A8 LEA EAX,DWORD PTR SS:
004F5663|.B1 06 MOV CL,6
004F5665|.E8 E6D8F0FF CALL Unpacked.00402F50
004F566A|.8D55 A8 LEA EDX,DWORD PTR SS:
004F566D|.8D45 D0 LEA EAX,DWORD PTR SS:
004F5670|.E8 27F5F0FF CALL Unpacked.00404B9C ;以上用户名前三个字符"Rds"中依次插入字符'z'、'j'、'y'得到"Rzdjsy"
004F5675|.8B55 D0 MOV EDX,DWORD PTR SS:
004F5678|.8D45 EC LEA EAX,DWORD PTR SS:
004F567B|.59 POP ECX
004F567C|.E8 C3F5F0FF CALL Unpacked.00404C44 ;再跟后面的"now"合并得到变形的用户名"Rzdjsynow"
004F5681|.8B45 FC MOV EAX,DWORD PTR SS:
004F5684|.E8 6FF5F0FF CALL Unpacked.00404BF8 ;取得原用户名"Rdsnow"的长度
004F5689|.8BF8 MOV EDI,EAX
004F568B|.57 PUSH EDI
004F568C|.8D45 F0 LEA EAX,DWORD PTR SS:
004F568F|.B9 01000000 MOV ECX,1
004F5694|.8B15 38554F00 MOV EDX,DWORD PTR DS: ;Unpacked.004F553C
004F569A|.E8 890AF1FF CALL Unpacked.00406128
004F569F|.83C4 04 ADD ESP,4
004F56A2|.8BF7 MOV ESI,EDI ;以原用户名的长度作为循环次数
004F56A4|.85F6 TEST ESI,ESI
004F56A6|.7E 32 JLE SHORT Unpacked.004F56DA
004F56A8|.BB 01000000 MOV EBX,1 ;i=1,准备循环
004F56AD|>8D45 A0 LEA EAX,DWORD PTR SS:
004F56B0|.8B55 EC |MOV EDX,DWORD PTR SS:
004F56B3|.8A541A FF |MOV DL,BYTE PTR DS:
004F56B7|.E8 64F4F0FF |CALL Unpacked.00404B20
004F56BC|.8B45 A0 |MOV EAX,DWORD PTR SS:
004F56BF|.8D55 A4 |LEA EDX,DWORD PTR SS:
004F56C2|.E8 B5F3FFFF |CALL Unpacked.004F4A7C
004F56C7|.8B55 A4 |MOV EDX,DWORD PTR SS:
004F56CA|.8B45 F0 |MOV EAX,DWORD PTR SS:
004F56CD|.8D4498 FC |LEA EAX,DWORD PTR DS:
004F56D1|.E8 BEF2F0FF |CALL Unpacked.00404994
004F56D6|.43 |INC EBX
004F56D7|.4E |DEC ESI
004F56D8|.^ 75 D3 \JNZ SHORT Unpacked.004F56AD ;以上循环把"Rzdjsynow"去掉后面三位的各个字符去查表,每个字符对应四位数字
004F56DA|>8BF7 MOV ESI,EDI
004F56DC|.4E DEC ESI
004F56DD|.85F6 TEST ESI,ESI
004F56DF|.7C 15 JL SHORT Unpacked.004F56F6
004F56E1|.46 INC ESI
004F56E2|.33DB XOR EBX,EBX
004F56E4|>8D45 E4 LEA EAX,DWORD PTR SS:
004F56E7|.8B55 F0 |MOV EDX,DWORD PTR SS:
004F56EA|.8B149A |MOV EDX,DWORD PTR DS:
004F56ED|.E8 0EF5F0FF |CALL Unpacked.00404C00
004F56F2|.43 |INC EBX
004F56F3|.4E |DEC ESI
004F56F4|.^ 75 EE \JNZ SHORT Unpacked.004F56E4 ;以上循环把刚才查到的数字连接成一个字符串,得到"859953476317764394215669"
004F56F6|>8D45 E0 LEA EAX,DWORD PTR SS:
004F56F9|.E8 42F2F0FF CALL Unpacked.00404940
004F56FE|.8B45 E4 MOV EAX,DWORD PTR SS:
004F5701|.E8 F2F4F0FF CALL Unpacked.00404BF8 ;取字符串的长度
004F5706|.8BF0 MOV ESI,EAX
004F5708|.85F6 TEST ESI,ESI
004F570A|.7E 3D JLE SHORT Unpacked.004F5749
004F570C|.BB 01000000 MOV EBX,1
004F5711|>FF75 E0 PUSH DWORD PTR SS:
004F5714|.8D45 9C |LEA EAX,DWORD PTR SS:
004F5717|.8B55 E4 |MOV EDX,DWORD PTR SS:
004F571A|.8A541A FF |MOV DL,BYTE PTR DS:
004F571E|.E8 FDF3F0FF |CALL Unpacked.00404B20
004F5723|.FF75 9C |PUSH DWORD PTR SS:
004F5726|.8D45 98 |LEA EAX,DWORD PTR SS:
004F5729|.8B55 F8 |MOV EDX,DWORD PTR SS:
004F572C|.8A541A FF |MOV DL,BYTE PTR DS:
004F5730|.E8 EBF3F0FF |CALL Unpacked.00404B20
004F5735|.FF75 98 |PUSH DWORD PTR SS:
004F5738|.8D45 E0 |LEA EAX,DWORD PTR SS:
004F573B|.BA 03000000 |MOV EDX,3
004F5740|.E8 73F5F0FF |CALL Unpacked.00404CB8
004F5745|.43 |INC EBX
004F5746|.4E |DEC ESI
004F5747|.^ 75 C8 \JNZ SHORT Unpacked.004F5711 ;以上循环把机器码的各个数字依次插入字符串,并且去掉后面多余部分得到"85589998533044706"不过这个后面也没有用到,这个循环这儿做什么用,偶也不太清楚
004F5749|>8D55 DC LEA EDX,DWORD PTR SS:
004F574C|.8B45 E4 MOV EAX,DWORD PTR SS:
004F574F|.E8 10FEF4FF CALL Unpacked.00445564 ;将没有插入机器码前的字符串倒序
004F5754|.8D45 D8 LEA EAX,DWORD PTR SS:
004F5757|.E8 E4F1F0FF CALL Unpacked.00404940
004F575C|.8B45 DC MOV EAX,DWORD PTR SS:
004F575F|.E8 94F4F0FF CALL Unpacked.00404BF8 ;取得位数
004F5764|.8BF0 MOV ESI,EAX
004F5766|.85F6 TEST ESI,ESI
004F5768|.7E 7E JLE SHORT Unpacked.004F57E8
004F576A|.BB 01000000 MOV EBX,1 ;i=1,准备循环
004F576F|>8D45 94 LEA EAX,DWORD PTR SS:
004F5772|.8B55 DC |MOV EDX,DWORD PTR SS:
004F5775|.8A541A FF |MOV DL,BYTE PTR DS:
004F5779|.E8 A2F3F0FF |CALL Unpacked.00404B20
004F577E|.8B45 94 |MOV EAX,DWORD PTR SS:
004F5781|.E8 163DF1FF |CALL Unpacked.0040949C ;取出各位数字St,转换为整数
004F5786|.8BC8 |MOV ECX,EAX
004F5788|.8BC1 |MOV EAX,ECX
004F578A|.F7E9 |IMUL ECX
004F578C|.F7E9 |IMUL ECX ;St的三次方
004F578E|.8D51 14 |LEA EDX,DWORD PTR DS: ;St+20
004F5791|.8BFA |MOV EDI,EDX
004F5793|.99 |CDQ
004F5794|.F7FF |IDIV EDI ;相除,取得余数
004F5796|.8BFA |MOV EDI,EDX
004F5798|.03F9 |ADD EDI,ECX ;再加上St得到结果一
004F579A|.8BC1 |MOV EAX,ECX
004F579C|.F7E9 |IMUL ECX ;St的平方
004F579E|.8D51 0A |LEA EDX,DWORD PTR DS: ;St+10
004F57A1|.51 |PUSH ECX
004F57A2|.8BCA |MOV ECX,EDX
004F57A4|.99 |CDQ
004F57A5|.F7F9 |IDIV ECX ;相除,取得余数
004F57A7|.59 |POP ECX
004F57A8|.03FA |ADD EDI,EDX ;与结果一相加得到结果二
004F57AA|.8D0449 |LEA EAX,DWORD PTR DS:
004F57AD|.03F8 |ADD EDI,EAX
004F57AF|.03FB |ADD EDI,EBX ;再加上St*3+i
004F57B1|.83FF 30 |CMP EDI,30
004F57B4|.7C 05 |JL SHORT Unpacked.004F57BB
004F57B6|.83FF 39 |CMP EDI,39
004F57B9|.7E 14 |JLE SHORT Unpacked.004F57CF
004F57BB|>83FF 41 |CMP EDI,41
004F57BE|.7C 05 |JL SHORT Unpacked.004F57C5
004F57C0|.83FF 5A |CMP EDI,5A
004F57C3|.7E 0A |JLE SHORT Unpacked.004F57CF
004F57C5|>83FF 60 |CMP EDI,60
004F57C8|.7C 1A |JL SHORT Unpacked.004F57E4
004F57CA|.83FF 7F |CMP EDI,7F
004F57CD|.7F 15 |JG SHORT Unpacked.004F57E4 ;以上是看看结果是不是数字或字母的ASC,不是就抛弃
004F57CF|>8D45 90 |LEA EAX,DWORD PTR SS:
004F57D2|.8BD7 |MOV EDX,EDI
004F57D4|.E8 47F3F0FF |CALL Unpacked.00404B20
004F57D9|.8B55 90 |MOV EDX,DWORD PTR SS:
004F57DC|.8D45 E8 |LEA EAX,DWORD PTR SS:
004F57DF|.E8 1CF4F0FF |CALL Unpacked.00404C00 ;是字母或数字就保留
004F57E4|>43 |INC EBX
004F57E5|.4E |DEC ESI
004F57E6|.^ 75 87 \JNZ SHORT Unpacked.004F576F
004F57E8|>8B45 E8 MOV EAX,DWORD PTR SS: ;经过以上循环得到"5JK4O42BC5J"
004F57EB|.E8 08F4F0FF CALL Unpacked.00404BF8
004F57F0|.83F8 10 CMP EAX,10 ;检查结果有没有16位
004F57F3|.7D 0D JGE SHORT Unpacked.004F5802
004F57F5|.8D45 E8 LEA EAX,DWORD PTR SS:
004F57F8|.BA 88584F00 MOV EDX,Unpacked.004F5888 ;ASCII "ZFJSYZGNYEJDSUFOHYOJUZDZ"
004F57FD|.E8 FEF3F0FF CALL Unpacked.00404C00 ;没有就跟以上字符串相连
004F5802|>8D45 D8 LEA EAX,DWORD PTR SS:
004F5805|.50 PUSH EAX
004F5806|.B9 0F000000 MOV ECX,0F
004F580B|.BA 02000000 MOV EDX,2
004F5810|.8B45 E8 MOV EAX,DWORD PTR SS:
004F5813|.E8 38F6F0FF CALL Unpacked.00404E50 ;从第二位开始取15的字符,得到"JK4O42BC5JZFJSY",加上'-'就是注册码了
004F5818|.8B45 F4 MOV EAX,DWORD PTR SS:
004F581B|.8B55 D8 MOV EDX,DWORD PTR SS:
004F581E|.E8 71F1F0FF CALL Unpacked.00404994
004F5823|.33C0 XOR EAX,EAX
004F5825|.5A POP EDX
004F5826|.59 POP ECX
004F5827|.59 POP ECX
004F5828|.64:8910 MOV DWORD PTR FS:,EDX
004F582B|.68 6D584F00 PUSH Unpacked.004F586D
004F5830|>8D45 90 LEA EAX,DWORD PTR SS:
004F5833|.BA 06000000 MOV EDX,6
004F5838|.E8 27F1F0FF CALL Unpacked.00404964
004F583D|.8D45 D0 LEA EAX,DWORD PTR SS:
004F5840|.BA 08000000 MOV EDX,8
004F5845|.E8 1AF1F0FF CALL Unpacked.00404964
004F584A|.8D45 F0 LEA EAX,DWORD PTR SS:
004F584D|.8B15 38554F00 MOV EDX,DWORD PTR DS: ;Unpacked.004F553C
004F5853|.E8 F009F1FF CALL Unpacked.00406248
004F5858|.8D45 F8 LEA EAX,DWORD PTR SS:
004F585B|.BA 02000000 MOV EDX,2
004F5860|.E8 FFF0F0FF CALL Unpacked.00404964
004F5865\.C3 RETN
004F5866 .^ E9 1DEAF0FF JMP Unpacked.00404288
004F586B .^ EB C3 JMP SHORT Unpacked.004F5830
004F586D .5F POP EDI
004F586E .5E POP ESI
004F586F .5B POP EBX
004F5870 .8BE5 MOV ESP,EBP
004F5872 .5D POP EBP
004F5873 .C3 RETN
----------------------------------------------------------------------------------------------
【破解心得】
注册代码写得再好,计算在复杂,如果采用了明码比较,等于把注册码送给别人;另外既然注册信息码已经插入字符串,为什么不用,让人觉得很费解(看上面代码的红字处);
?????????????????????????????????????????
注册码是这样生成的:用户名长度大于5,小于13
"Rdsnow" 插入字符得到 "Rzdjsynow"
然后去掉最后三位查表,对照表如下:好像都是一些质数
1-1697 2-1699 3-1709 4-1721 5-1723 6-1733 7-1741 8-1747 9-1759 0-1777 Aa-6299 Bb-6301 Cc-6311 Dd-6317 Ee-6323 Ff-6329 Gg-7591 Hh-7621 Ii-7639 Jj-7643 Kk-7649 Ll-7669 Mm-8543 Nn-8563 Oo-8573 Pp-8581 Qq-8597 Rr-8599 Ss-9421 Tt-9431 Uu-9437 Vv-9439 Ww-9461 Xx-9463 Yy-5669 Zz-5347
查表得到 "859953476317764394215669"
对个数字采用公式 St(i)^3mod(St(i)+20) + St(i)^2mod(St(i)+10) + St(i)*4 + i + 1
(重新写的公式,i初值为0)得到ASC留下字母数字。
最后接上"ZFJSYZGNYEJDSUFOHYOJUZDZ"从第二位开始取十五个字符,每五个插入'-',就是注册码了。
注册码分三段保存在注册表中:
第一段存在HKCU\Control Panel\Keyboard\CAI_m1
第二段:HKCU\SOFTWARE\Microsoft\Shared\HTML\Old Default Editor\shell\CAI_m2
第三段:HKLM\SYSTEM\ControlSet001\Hardware Profiles\0001\SOFTWARE\Microsoft\WAB\Export\PAB\CAI_m3
删除其中的任何一段程序就改为未注册版了
【注册机源码】
编程偶不会,不知道怎样提高代码的效率,希望高手能指点一二
void CKEYDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
//变量定义
char cTable={"1777-1697-1699-1709-1721-1723-1733-1741-1747-1759-0000-0000-0000-0000-0000-0000-0000-6299-6301-6311-6317-6323-6329-7591-7621-7639-7643-7649-7669-8543-8563-8573-8581-8597-8599-9421-9431-9437-9439-9461-9463-5669-5347"};
int i,j,n;
CString sUsename;
char cUsename,cNumber,cSn;
UpdateData(true);
m_Edit2="";
sUsename=m_Edit1;
sUsename.MakeUpper ();//注册码跟大小写无关,转为大写是为了便于查表
//检查用户名的长度
n=sUsename.GetLength ();
if (n<6 || n>12) {
MessageBox("用户名的长度必须在6到12之间","提示",MB_OK);
return;
}
//插入字符,检查用户名是否全失字母数字
sUsename.Insert (1,'Z');
sUsename.Insert (3,'J');
sUsename.Insert (5,'Y');
strcpy(cUsename,sUsename);
for (i=0;i<n+3;i++){
if(cUsename(i)<0x30||(cUsename(i)>0x39 && cUsename(i)<0x41)||cUsename(i)>0x5A){
MessageBox("用户名只能由A-Z,a-z,0-9组成,请不要使用其它字符","提示",MB_OK);
return;
}
}
//查表
for (i=0;i<n;i++){
j=cUsename(i)-0x30;
cNumber=cTable;
cNumber=cTable;
cNumber=cTable;
cNumber=cTable;
cNumber=0;
}
//运用公式将数字逆序运算,取出有用的字符
for (i=4*n;i>0;i--){
j=cNumber-0x30;
j=(j*j*j)%(j+20)+(j*j)%(j+10)+j*4+4*n-i+1;
if((j>0x2F && j<0x3A)||(j>0x40 && j<0x5B)||(j>0x60 && j<0x7B)){
cSn=j;
m_Edit2 += cSn;
}
}
//最终形成注册码
m_Edit2 += "ZFJSYZGNYEJDSUFOHYOJUZDZ";
m_Edit2=m_Edit2.Mid (1,15);
m_Edit2.Insert (5,'-');
m_Edit2.Insert (11,'-');
UpdateData(false);
}
注册机就不贴上来了。
----------------------------------------------------------------------------------------------
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
----------------------------------------------------------------------------------------------
文章写于2005-5-2 22:56:20
[ Last edited by rdsnow on 2005-5-12 at 07:49 AM ] 好文,学习~~~
页:
[1]