- UID
- 6257
注册时间2006-1-2
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
发表于 2006-1-14 08:31:58
|
显示全部楼层
【破文标题】CrackMe By ErShu算法分析
【破文作者】Busheler
【作者邮箱】[email protected]
【作者主页】
【破解工具】odbg110,win32dasm,PEiD v0.94
【破解平台】Windows2000
【软件名称】CrackMe By ErShu
【软件大小】20.0KB
【原版下载】https://www.chinapyg.com/attachment.php?aid=51
【保护方式】
【软件简介】一个很简单的CRACKME,此为算法CRACKME,如果只找注册码没什么难度~~~~~~
------------------------------------------------------------------------
一、脱壳:
PEiD v0.94查壳无发现,Microsoft Visual C++ 6.0,无马甲。
二、找资源:
win32dasm载入找到如下信息:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004015BB(C)
|
:004015DD 8D542404 lea edx, dword ptr [esp+04]
:004015E1 50 push eax
:004015E2 52 push edx
:004015E3 8BCE mov ecx, esi
:004015E5 E866000000 call 00401650
:004015EA 8B4664 mov eax, dword ptr [esi+64]
:004015ED C744241000000000 mov [esp+10], 00000000
:004015F5 50 push eax
:004015F6 8B442408 mov eax, dword ptr [esp+08]
:004015FA 50 push eax
* Reference To: MSVCRT._mbscmp, Ord:0159h
|
:004015FB FF15C8214000 Call dword ptr [004021C8]
:00401601 83C408 add esp, 00000008
:00401604 85C0 test eax, eax
:00401606 6A00 push 00000000
:00401608 6A00 push 00000000
:0040160A 750E jne 0040161A
* Possible StringData Ref from Data Obj ->"Great! pf! pf!"
|
:0040160C 6828304000 push 00403028
:00401611 8BCE mov ecx, esi
* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:00401613 E8FC040000 Call 00401B14
:00401618 EB15 jmp 0040162F
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040160A(C)
|
* Possible StringData Ref from Data Obj ->"fail!"
|
:0040161A 6820304000 push 00403020
:0040161F 8BCE mov ecx, esi
* Reference To: MFC42.Ordinal:1080, Ord:1080h
|
:00401621 E8EE040000 Call 00401B14
:00401626 6A00 push 00000000
:00401628 8BCE mov ecx, esi
* Reference To: MFC42.Ordinal:18BE, Ord:18BEh
三、踏上破解之路:
odbg110载入:
很容易找到要点:在401590处F2下断
用户名:busheler
试验码:123456789
确定,即被断下
00401590 . 6A FF PUSH -1
00401592 . 68 381E4000 PUSH Crack_Me.00401E38 ; SE handler installation
00401597 . 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040159D . 50 PUSH EAX
0040159E . 64:8925 000000>MOV DWORD PTR FS:[0],ESP
004015A5 . 51 PUSH ECX
004015A6 . 56 PUSH ESI
004015A7 . 8BF1 MOV ESI,ECX
004015A9 . 6A 01 PUSH 1
004015AB . E8 6A050000 CALL <JMP.&MFC42.#6334>
004015B0 . 8B4E 60 MOV ECX,DWORD PTR DS:[ESI+60] ; 用户名入ECX
004015B3 . 8D46 60 LEA EAX,DWORD PTR DS:[ESI+60]
004015B6 . 8B51 F8 MOV EDX,DWORD PTR DS:[ECX-8] ; 用户名长度入EDX
004015B9 . 85D2 TEST EDX,EDX
004015BB . 75 20 JNZ SHORT Crack_Me.004015DD ; 用户名不为0跳
004015BD . 6A 00 PUSH 0
004015BF . 6A 00 PUSH 0
004015C1 . 68 38304000 PUSH Crack_Me.00403038 ; ASCII "User Name is empty!"
004015C6 . 8BCE MOV ECX,ESI
004015C8 . E8 47050000 CALL <JMP.&MFC42.#4224>
004015CD . 5E POP ESI
004015CE . 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4]
004015D2 . 64:890D 000000>MOV DWORD PTR FS:[0],ECX
004015D9 . 83C4 10 ADD ESP,10
004015DC . C3 RET
004015DD > 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]
004015E1 . 50 PUSH EAX ; /Arg2
004015E2 . 52 PUSH EDX ; |Arg1
004015E3 . 8BCE MOV ECX,ESI ; |
004015E5 . E8 66000000 CALL Crack_Me.00401650 ; \去计算注册码!!!
004015EA . 8B46 64 MOV EAX,DWORD PTR DS:[ESI+64] ; 试练码入EAX
004015ED . C74424 10 0000>MOV DWORD PTR SS:[ESP+10],0
004015F5 . 50 PUSH EAX ; /s2
004015F6 . 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] ; |真注册码入EAX
004015FA . 50 PUSH EAX ; |s1
004015FB . FF15 C8214000 CALL DWORD PTR DS:[<&MSVCRT._mbscmp>] ; \注册码对比!在这里下断点可直接看到注册码了,可是现在
的软件有几个有这等好事啊?
00401601 . 83C4 08 ADD ESP,8
00401604 . 85C0 TEST EAX,EAX
00401606 . 6A 00 PUSH 0
00401608 . 6A 00 PUSH 0
0040160A . 75 0E JNZ SHORT Crack_Me.0040161A ; 不等跳!
0040160C . 68 28304000 PUSH Crack_Me.00403028 ; ASCII "Great! pf! pf!"
00401611 . 8BCE MOV ECX,ESI
00401613 . E8 FC040000 CALL <JMP.&MFC42.#4224>
00401618 . EB 15 JMP SHORT Crack_Me.0040162F
0040161A > 68 20304000 PUSH Crack_Me.00403020 ; ASCII "fail!"
0040161F . 8BCE MOV ECX,ESI
00401621 . E8 EE040000 CALL <JMP.&MFC42.#4224>
00401626 . 6A 00 PUSH 0
00401628 . 8BCE MOV ECX,ESI
0040162A . E8 EB040000 CALL <JMP.&MFC42.#6334>
0040162F > 8D4C24 04 LEA ECX,DWORD PTR SS:[ESP+4]
00401633 . C74424 10 FFFF>MOV DWORD PTR SS:[ESP+10],-1
0040163B . E8 C0030000 CALL <JMP.&MFC42.#800>
00401640 . 8B4C24 08 MOV ECX,DWORD PTR SS:[ESP+8]
00401644 . 5E POP ESI
00401645 . 64:890D 000000>MOV DWORD PTR FS:[0],ECX
0040164C . 83C4 10 ADD ESP,10
0040164F . C3 RET
--------------
跟随CALL Crack_Me.00401650进取看看注册码是如何炼成的......哇这么厉害,好长一段代码啊!
00401650 /$ 6A FF PUSH -1
00401652 |. 68 6F1E4000 PUSH Crack_Me.00401E6F ; SE handler installation
00401657 |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040165D |. 50 PUSH EAX
0040165E |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP
00401665 |. 83EC 34 SUB ESP,34
00401668 |. 33C0 XOR EAX,EAX
0040166A |. 53 PUSH EBX
0040166B |. 894424 21 MOV DWORD PTR SS:[ESP+21],EAX
0040166F |. 55 PUSH EBP
00401670 |. 894424 29 MOV DWORD PTR SS:[ESP+29],EAX
00401674 |. 56 PUSH ESI
00401675 |. 894424 31 MOV DWORD PTR SS:[ESP+31],EAX
00401679 |. 33DB XOR EBX,EBX
0040167B |. 894424 35 MOV DWORD PTR SS:[ESP+35],EAX
0040167F |. 57 PUSH EDI
00401680 |. 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
00401684 |. 895C24 20 MOV DWORD PTR SS:[ESP+20],EBX
00401688 |. 885C24 2C MOV BYTE PTR SS:[ESP+2C],BL
0040168C |. 894424 3D MOV DWORD PTR SS:[ESP+3D],EAX
00401690 |. E8 55040000 CALL <JMP.&MFC42.#540>
00401695 |. 6A 0A PUSH 0A ; /pFileSystemNameSize = 0000000A
00401697 |. 53 PUSH EBX ; |pFileSystemNameBuffer
00401698 |. 53 PUSH EBX ; |pFileSystemFlags
00401699 |. 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C] ; |
0040169D |. 53 PUSH EBX ; |pMaxFilenameLength
0040169E |. 51 PUSH ECX ; |pVolumeSerialNumber
0040169F |. 6A 0C PUSH 0C ; |MaxVolumeNameSize = C (12.)
004016A1 |. BE 01000000 MOV ESI,1 ; |
004016A6 |. 53 PUSH EBX ; |VolumeNameBuffer
004016A7 |. 68 50304000 PUSH Crack_Me.00403050 ; |RootPathName = "C:\"
004016AC |. 897424 6C MOV DWORD PTR SS:[ESP+6C],ESI ; |
004016B0 |. 895C24 34 MOV DWORD PTR SS:[ESP+34],EBX ; |
004016B4 |. 33ED XOR EBP,EBP ; |
004016B6 |. 895C24 30 MOV DWORD PTR SS:[ESP+30],EBX ; |
004016BA |. FF15 00204000 CALL DWORD PTR DS:[<&KERNEL32.GetVolumeI>; \GetVolumeInformationA
004016C0 |. 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; 磁盘信息:即C盘序列号A40D9506入EAX
004016C4 |. 8B5424 58 MOV EDX,DWORD PTR SS:[ESP+58]
004016C8 |. 35 26038319 XOR EAX,19830326 ; C盘序列号与19830326做异或运算,结果入EAX ,也就是第四
段基础数据
004016CD |. 83C9 FF OR ECX,FFFFFFFF
004016D0 |. 8B12 MOV EDX,DWORD PTR DS:[EDX] ; 用户名入EDX
004016D2 |. 894424 10 MOV DWORD PTR SS:[ESP+10],EAX
004016D6 |. 8BFA MOV EDI,EDX
004016D8 |. 33C0 XOR EAX,EAX
004016DA |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
004016DC |. F7D1 NOT ECX
004016DE |. 49 DEC ECX
004016DF |. 895424 1C MOV DWORD PTR SS:[ESP+1C],EDX
004016E3 |. 8BF9 MOV EDI,ECX
004016E5 |. 0F84 BC010000 JE Crack_Me.004018A7
004016EB |. 3BFE CMP EDI,ESI
004016ED |. 897424 58 MOV DWORD PTR SS:[ESP+58],ESI
004016F1 |. 0F8C AF000000 JL Crack_Me.004017A6
004016F7 |. DD05 30254000 FLD QWORD PTR DS:[402530] ; ST(0)=0
004016FD |. EB 04 JMP SHORT Crack_Me.00401703
004016FF |> 8B5424 1C /MOV EDX,DWORD PTR SS:[ESP+1C] ; 第一段基础数据开始:用户名入EDX
00401703 |> 8A5C32 FF MOV BL,BYTE PTR DS:[EDX+ESI-1] ; 用户名ASCII码入BL
00401707 |. DB4424 58 |FILD DWORD PTR SS:[ESP+58] ; 用户名位数入ST(0)
0040170B |. 0FBEC3 |MOVSX EAX,BL ; EAX=BL
0040170E |. DD5C24 24 |FSTP QWORD PTR SS:[ESP+24] ; 用户名位数入ST(7)
00401712 |. 894424 58 |MOV DWORD PTR SS:[ESP+58],EAX ; 用户名ASCII入SS:[ESP+58]
00401716 |. DB4424 58 |FILD DWORD PTR SS:[ESP+58] ; 用户名入ST(0) 10进制
0040171A |. 0FBECB |MOVSX ECX,BL ; ECX=BL
0040171D |. D9FA |FSQRT ; ST(0)开平方
0040171F |. 0FAFCE |IMUL ECX,ESI ; 用户名位数与其对应注册码ASCII码相乘
00401722 |. DC4C24 24 |FMUL QWORD PTR SS:[ESP+24] ; 用户名位数与其对应注册码ASCII码(10进制)平方根相乘
00401726 |. DC05 28254000 |FADD QWORD PTR DS:[402528] ; 乘积+1
0040172C |. 0FAFCE |IMUL ECX,ESI ; 40171F乘积与用户名位数相乘
0040172F |. 894C24 58 |MOV DWORD PTR SS:[ESP+58],ECX
00401733 |. DB4424 58 |FILD DWORD PTR SS:[ESP+58] ; 用户名入ST(0) 10进制
00401737 |. DEC9 |FMULP ST(1),ST ; ST(0)*ST(1)结果入ST(0)
00401739 |. D8C1 |FADD ST,ST(1) ; ST(0)+ST(1)结果入ST(7)
0040173B |. E8 36040000 |CALL <JMP.&MSVCRT._ftol>
00401740 |. 99 |CDQ
00401741 |. DDD8 |FSTP ST
00401743 |. B9 A0860100 |MOV ECX,186A0
00401748 |. F7F9 |IDIV ECX ; 求前面求出数除以100000的余数,第一段基础数据
0040174A |. 895424 14 |MOV DWORD PTR SS:[ESP+14],EDX
0040174E |. 0FBED3 |MOVSX EDX,BL ; 第二段基础数据开始:
00401751 |. 895424 58 |MOV DWORD PTR SS:[ESP+58],EDX
00401755 |. DB4424 58 |FILD DWORD PTR SS:[ESP+58]
00401759 |. DD05 20254000 |FLD QWORD PTR DS:[402520]
0040175F |. E8 0C040000 |CALL <JMP.&MSVCRT._CIpow> ; 用户名ASCII码平方
00401764 |. DC4C24 24 |FMUL QWORD PTR SS:[ESP+24] ; 再乘以位数
00401768 |. E8 09040000 |CALL <JMP.&MSVCRT._ftol>
0040176D |. DB4424 14 |FILD DWORD PTR SS:[ESP+14]
00401771 |. 8BCE |MOV ECX,ESI
00401773 |. 0FAFCD |IMUL ECX,EBP ; 上次算出本段算出值乘以用户名位数
00401776 |. D9C0 |FLD ST
00401778 |. D9FA |FSQRT ; 求开方
0040177A |. 03C1 |ADD EAX,ECX
0040177C |. B9 A0860100 |MOV ECX,186A0
00401781 |. 99 |CDQ
00401782 |. F7F9 |IDIV ECX ; 求前面求出数除以100000的余数,第二段基础数据
00401784 |. 8BEA |MOV EBP,EDX
00401786 |. E8 EB030000 |CALL <JMP.&MSVCRT._ftol> ; 第三段基础数据开始:
0040178B |. 03C5 |ADD EAX,EBP
0040178D |. B9 A0860100 |MOV ECX,186A0
00401792 |. 99 |CDQ
00401793 |. F7F9 |IDIV ECX ; 求前面求出数除以100000的余数,第三段基础数据
00401795 |. 46 |INC ESI
00401796 |. 3BF7 |CMP ESI,EDI
00401798 |. 897424 58 |MOV DWORD PTR SS:[ESP+58],ESI
0040179C |. 8BDA |MOV EBX,EDX
0040179E |.^0F8E 5BFFFFFF \JLE Crack_Me.004016FF ; 循环次数小于等于用户名位数继续循环
004017A4 |. DDD8 FSTP ST
004017A6 |> 33C0 XOR EAX,EAX ; 置循环头0
004017A8 |> 8BD0 /MOV EDX,EAX ; 循环5次:0--4
004017AA |. 8B4C24 14 |MOV ECX,DWORD PTR SS:[ESP+14]
004017AE |. 0FAFD0 |IMUL EDX,EAX
004017B1 |. 0FAFD0 |IMUL EDX,EAX
004017B4 |. 8D540A 1F |LEA EDX,DWORD PTR DS:[EDX+ECX+1F] ; EAX^3+第一段数据+31
004017B8 |. 81E2 7F000080 |AND EDX,8000007F
004017BE |. 79 05 |JNS SHORT Crack_Me.004017C5
004017C0 |. 4A |DEC EDX
004017C1 |. 83CA 80 |OR EDX,FFFFFF80
004017C4 |. 42 |INC EDX
004017C5 |> 885404 2C |MOV BYTE PTR SS:[ESP+EAX+2C],DL ; DL入 SS:[ESP+EAX+2C],后面用来计算1-5位注册码用。
004017C9 |. 40 |INC EAX ; EAX+1
004017CA |. 83F8 05 |CMP EAX,5
004017CD |.^7C D9 \JL SHORT Crack_Me.004017A8
004017CF |. B8 05000000 MOV EAX,5 ; 置循环头
004017D4 |> 8BC8 /MOV ECX,EAX ; 循环5次:5--9
004017D6 |. 0FAFC8 |IMUL ECX,EAX
004017D9 |. 0FAFC8 |IMUL ECX,EAX
004017DC |. 8D5429 1F |LEA EDX,DWORD PTR DS:[ECX+EBP+1F] ; EAX^3+第二段基础数据数据+31
004017E0 |. 81E2 7F000080 |AND EDX,8000007F
004017E6 |. 79 05 |JNS SHORT Crack_Me.004017ED
004017E8 |. 4A |DEC EDX
004017E9 |. 83CA 80 |OR EDX,FFFFFF80
004017EC |. 42 |INC EDX
004017ED |> 885404 2C |MOV BYTE PTR SS:[ESP+EAX+2C],DL ; DL入 SS:[ESP+EAX+2C],后面用来计算6-10位注册码用
004017F1 |. 40 |INC EAX ; EAX+1
004017F2 |. 83F8 0A |CMP EAX,0A
004017F5 |.^7C DD \JL SHORT Crack_Me.004017D4
004017F7 |. B8 0A000000 MOV EAX,0A ; 置循环头
004017FC |> 8BC8 /MOV ECX,EAX ; 循环5次:10--14
004017FE |. 0FAFC8 |IMUL ECX,EAX
00401801 |. 0FAFC8 |IMUL ECX,EAX
00401804 |. 8D5419 1F |LEA EDX,DWORD PTR DS:[ECX+EBX+1F] ; EAX^3+第三段基础数据数据+31
00401808 |. 81E2 7F000080 |AND EDX,8000007F
0040180E |. 79 05 |JNS SHORT Crack_Me.00401815
00401810 |. 4A |DEC EDX
00401811 |. 83CA 80 |OR EDX,FFFFFF80
00401814 |. 42 |INC EDX
00401815 |> 885404 2C |MOV BYTE PTR SS:[ESP+EAX+2C],DL ; DL入 SS:[ESP+EAX+2C],后面用来计算11-15位注册码用
00401819 |. 40 |INC EAX ; EAX+1
0040181A |. 83F8 0F |CMP EAX,0F
0040181D |.^7C DD \JL SHORT Crack_Me.004017FC
0040181F |. B8 0F000000 MOV EAX,0F ; 置循环头
00401824 |> 8BC8 /MOV ECX,EAX ; 循环5次:15--19
00401826 |. 8B5424 10 |MOV EDX,DWORD PTR SS:[ESP+10]
0040182A |. 0FAFC8 |IMUL ECX,EAX
0040182D |. 0FAFC8 |IMUL ECX,EAX
00401830 |. 8D4C11 1F |LEA ECX,DWORD PTR DS:[ECX+EDX+1F] ; EAX^3+第四段基础数据+31
00401834 |. 81E1 7F000080 |AND ECX,8000007F
0040183A |. 79 05 |JNS SHORT Crack_Me.00401841
0040183C |. 49 |DEC ECX
0040183D |. 83C9 80 |OR ECX,FFFFFF80
00401840 |. 41 |INC ECX
00401841 |> 884C04 2C |MOV BYTE PTR SS:[ESP+EAX+2C],CL ; DL入 SS:[ESP+EAX+2C],后面用来计算15-20位注册码用
00401845 |. 40 |INC EAX ; EAX+1
00401846 |. 83F8 14 |CMP EAX,14
00401849 |.^7C D9 \JL SHORT Crack_Me.00401824
0040184B |. 33D2 XOR EDX,EDX
0040184D |. 33C9 XOR ECX,ECX ; 计算注册码开始,循环头置0
0040184F |> 8A4414 2C /MOV AL,BYTE PTR SS:[ESP+EDX+2C] ;
00401853 |. 3C 30 |CMP AL,30
00401855 |. 7C 04 |JL SHORT Crack_Me.0040185B ; 小于跳
00401857 |. 3C 39 |CMP AL,39
00401859 |. 7E 29 |JLE SHORT Crack_Me.00401884 ; 小于等于跳
0040185B |> 3C 41 |CMP AL,41
0040185D |. 7C 04 |JL SHORT Crack_Me.00401863 ; 小于跳
0040185F |. 3C 5A |CMP AL,5A
00401861 |. 7E 21 |JLE SHORT Crack_Me.00401884 ; 小于等于跳
00401863 |> 3C 61 |CMP AL,61
00401865 |. 7C 04 |JL SHORT Crack_Me.0040186B ; 小于跳
00401867 |. 3C 7A |CMP AL,7A
00401869 |. 7E 19 |JLE SHORT Crack_Me.00401884 ; 小于等于跳
0040186B |> 0FBEC0 |MOVSX EAX,AL
0040186E |. 8D4408 1F |LEA EAX,DWORD PTR DS:[EAX+ECX+1F]
00401872 |. 25 7F000080 |AND EAX,8000007F
00401877 |. 79 05 |JNS SHORT Crack_Me.0040187E
00401879 |. 48 |DEC EAX
0040187A |. 83C8 80 |OR EAX,FFFFFF80
0040187D |. 40 |INC EAX
0040187E |> 884414 2C |MOV BYTE PTR SS:[ESP+EDX+2C],AL
00401882 |.^EB CB |JMP SHORT Crack_Me.0040184F
00401884 |> 83C1 07 |ADD ECX,7 ; ECX循环加7
00401887 |. 42 |INC EDX
00401888 |. 81F9 8C000000 |CMP ECX,8C ; ECX和140比较小于继续循环,大于等于跳出循环,也就是循
环20次俄!
0040188E |.^7C BF \JL SHORT Crack_Me.0040184F
00401890 |. 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C] ; 计算注册码结束,来这里,注册码入ECX
00401894 |. 8D5424 18 LEA EDX,DWORD PTR SS:[ESP+18]
00401898 |. 51 PUSH ECX
00401899 |. 68 4C304000 PUSH Crack_Me.0040304C ; ASCII "%s"
0040189E |. 52 PUSH EDX
0040189F |. E8 82020000 CALL <JMP.&MFC42.#2818>
004018A4 |. 83C4 0C ADD ESP,0C
004018A7 |> 8B7424 54 MOV ESI,DWORD PTR SS:[ESP+54]
004018AB |. 8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18]
004018AF |. 50 PUSH EAX
004018B0 |. 8BCE MOV ECX,ESI
004018B2 |. E8 69020000 CALL <JMP.&MFC42.#535>
004018B7 |. C74424 20 0100>MOV DWORD PTR SS:[ESP+20],1
004018BF |. 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
004018C3 |. C64424 4C 00 MOV BYTE PTR SS:[ESP+4C],0
004018C8 |. E8 33010000 CALL <JMP.&MFC42.#800>
004018CD |. 8B4C24 44 MOV ECX,DWORD PTR SS:[ESP+44]
004018D1 |. 8BC6 MOV EAX,ESI
004018D3 |. 5F POP EDI
004018D4 |. 5E POP ESI
004018D5 |. 5D POP EBP
004018D6 |. 5B POP EBX
004018D7 |. 64:890D 000000>MOV DWORD PTR FS:[0],ECX
004018DE |. 83C4 40 ADD ESP,40
004018E1 \. C2 0800 RET 8
四、算法分析总结
注册码的计算分为三个阶段:
1、计算四段基础数据,前三段是用用户名计算出,第四组是用C盘序列号计算出。
2、分别用前面四组基础数据分别计算出5组数据码,总为20组数据码,用以计算注册码。
3、用20组数据码计算出20位注册码。
五、注册算法
用户名:busheler
注册码:G0kXIDhnGvowqm0vN2AR
好繁哪!!做个注册机可能比写算法简单多了。
贴上易语言注册机过程码(我正在学习易语言中。。。。),因代码没有优化,显得有点乱,但不影响理解。
可以对照上面的注册分析看。
===================================================
.版本 2
.程序集 窗口程序集1
.子程序 _取消_被单击
销毁 ()
.子程序 _确定_被单击
.局部变量 用户名, 文本型
.局部变量 用户名长度, 长整数型
用户名 = 删全部空 (输入编辑框.内容)
用户名长度 = 取文本长度 (用户名)
.如果 (用户名长度 < 1)
结果编辑框.内容 = “请输入用户名!”
.否则
结果编辑框.内容 = 注册码 (用户名, 用户名长度)
返回 ()
.如果结束
返回 ()
.子程序 __启动窗口_创建完毕
结果编辑框.内容 = busheler@****.com
.子程序 注册码, 文本型
.参数 用户名, 文本型
.参数 用户名长度, 长整数型
.局部变量 c盘序列号, 文本型
.局部变量 异或值, 长整数型
.局部变量 a, 整数型
.局部变量 基础1, 长整数型
.局部变量 基础2, 长整数型
.局部变量 基础3, 长整数型
.局部变量 基础4, 长整数型
.局部变量 数据码, 文本型
.局部变量 数据码1, 文本型
.局部变量 数据码2, 文本型
.局部变量 数据码3, 文本型
.局部变量 数据码4, 文本型
.局部变量 注册码, 文本型
.局部变量 中间码, 文本型
.局部变量 n, 整数型
.局部变量 最后注册码, 文本型
.局部变量 aa, 整数型
.局部变量 bb, 长整数型
.局部变量 cc, 长整数型
.局部变量 ee, 文本型
' 程序第一部分:计算四段基础数据:
基础1 = 0
基础2 = 0
基础3 = 0
基础4 = 0
' 取C盘序列号。
c盘序列号 = 取磁盘序列号 ()
' C盘序列号与19830326做异或运算,并是第四段基础数据。
异或值 = 位异或 (428016422, 到数值 (取十进制文本 (c盘序列号, 16)))
' 开始用用户名计算出四段基础数据:
.变量循环首 (1, 用户名长度, 1, n)
a = 取代码 (用户名, n)
基础1 = 取整 ((求次方 (a, 1 ÷ 2) × n + 1) × a × n × n + 基础1) % 100000
基础2 = (求次方 (a, 2) × n + 基础2 × n) % 100000
基础3 = (基础2 + 取整 (求次方 (基础1, 1 ÷ 2))) % 100000
.变量循环尾 ()
基础4 = 异或值
' 计算结束!
' 程序第二部分,计算出20组数据码:
数据码 = “”
数据码1 = “”
数据码2 = “”
数据码3 = “”
数据码4 = “”
' 计算第一组1-5组数据码:
数据码1 = 计算数据码 (基础1, 0, 4)
' 计算第二组5-10组数据码:
数据码2 = 计算数据码 (基础2, 5, 9)
' 计算第三组10-15组数据码:
数据码3 = 计算数据码 (基础3, 10, 14)
' 计算第四组15-20组数据码:
数据码4 = 计算数据码 (基础4, 15, 19)
数据码 = 数据码1 + 数据码2 + 数据码3 + 数据码4
' 程序第三部分,计算注册码:
注册码 = 计算注册码 (数据码, 0, 133)
返回 (注册码)
.子程序 取磁盘序列号, 文本型, , 读取磁盘序列号,你可以更改盘符来取不同盘的序列号
.局部变量 pos, 整数型
.局部变量 HiWord, 整数型
.局部变量 LoWord, 长整数型
.局部变量 VolumeSN, 整数型
.局部变量 MaxFNLen, 整数型
.局部变量 Temp1, 文本型
.局部变量 Temp2, 文本型
.局部变量 DriveVolume, 文本型
DriveVolume = “C:\”
Temp1 = 取空白文本 (255)
Temp2 = 取空白文本 (255)
pos = GetVolumeInformation (DriveVolume, Temp1, 255, VolumeSN, 0, 0, Temp2, 255)
返回 (到文本 (取十六进制文本 (VolumeSN)))
.子程序 计算数据码, 文本型
.参数 基础, 长整数型
.参数 x1, 整数型
.参数 x2, 整数型
.局部变量 y, 整数型
.局部变量 a1, 长整数型
.局部变量 a2, 长整数型
.局部变量 aa, 整数型
.局部变量 ab, 整数型
.局部变量 数据码, 文本型
数据码 = “”
.变量循环首 (x1, x2, 1, y)
a1 = y × y × y + 基础 + 31
aa = 位与 (a1, -2147483521)
.如果 (aa < 0)
aa = 位或 (aa - 1, -128) + 1
.否则
.如果结束
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (aa)), 2)) = 1)
数据码 = 数据码 + “0”
.否则
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (aa)), 2)) = 0)
数据码 = 数据码 + “00”
.否则
.如果结束
.如果结束
数据码 = 数据码 + 取文本右边 (到文本 (取十六进制文本 (aa)), 2)
.变量循环尾 ()
返回 (数据码)
.子程序 计算注册码, 文本型
.参数 数据码, 文本型
.参数 x1, 整数型
.参数 x2, 整数型
.局部变量 n, 整数型
.局部变量 a, 长整数型
.局部变量 b, 长整数型
.局部变量 c, 长整数型
.局部变量 f, 文本型
.局部变量 xunhuan, 整数型
.局部变量 zhucema, 文本型
.局部变量 g, 长整数型
zhucema = “”
f = “”
xunhuan = 0
x1 = 0
x2 = 133
.变量循环首 (x1, x2, 7, n)
a = 到数值 (取十进制文本 (取文本中间 (数据码, n ÷ 7 × 2 + 1, 2), 16))
' 输出调试文本 (到文本 (a))
g = a
.循环判断首 ()
输出调试文本 (到文本 (g))
.如果 (g ≥ 48)
.如果 (g > 57)
.如果 (g ≥ 65)
.如果 (g > 90)
.如果 (g ≥ 97)
.如果 (g > 122)
b = g + n + 31
c = 位与 (b, -2147483521)
.如果 (c < 0)
c = 位或 (c - 1, -128) + 1
.否则
.如果结束
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.如果结束
.如果结束
g = 到数值 (取十进制文本 (f, 16))
到循环尾 ()
.否则
跳出循环 ()
.如果结束
.否则
b = g + n + 31
c = 位与 (b, -2147483521)
.如果 (c < 0)
c = 位或 (c - 1, -128) + 1
.否则
.如果结束
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.如果结束
.如果结束
g = 到数值 (取十进制文本 (f, 16))
到循环尾 ()
.如果结束
.否则
跳出循环 ()
.如果结束
.否则
b = g + n + 31
c = 位与 (b, -2147483521)
.如果 (c < 0)
c = 位或 (c - 1, -128) + 1
.否则
.如果结束
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.如果结束
.如果结束
g = 到数值 (取十进制文本 (f, 16))
到循环尾 ()
.如果结束
.否则
跳出循环 ()
.如果结束
.否则
b = g + n + 31
c = 位与 (b, -2147483521)
.如果 (c < 0)
c = 位或 (c - 1, -128) + 1
.否则
.如果结束
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 1)
f = “0” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
.如果 (取文本长度 (取文本右边 (到文本 (取十六进制文本 (c)), 2)) = 0)
f = “00” + 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.否则
f = 取文本右边 (到文本 (取十六进制文本 (c)), 2)
.如果结束
.如果结束
g = 到数值 (取十进制文本 (f, 16))
到循环尾 ()
.如果结束
.循环判断尾 (xunhuan = 0)
' 输出调试文本 (到文本 (字符 (g)))
zhucema = zhucema + 到文本 (字符 (g))
.变量循环尾 ()
返回 (zhucema)
-------------------------------------------------------------------------
【版权声明】交流学习,非商业应用,转载时请保证其完整!
[ 本帖最后由 busheler 于 2006-1-31 00:41 编辑 ] |
评分
-
查看全部评分
|