文章作者: busheler
附件:crack_me.rar
---------------------------------------------------------
【破文标题】CrackMeByErShu算法分析
【破文作者】Busheler
【作者邮箱】busheler@sohu.com
【作者主页】
【破解工具】odbg110,win32dasm,PEiDv0.94
【破解平台】Windows2000
【软件名称】CrackMeByErShu
【软件大小】20.0KB
【原版下载】http://www.chinapyg.cn/attachment.php?aid=51
【保护方式】
【软件简介】一个很简单的CRACKME,此为算法CRACKME,如果只找注册码没什么难度~~~~~~
------------------------------------------------------------------------
一、脱壳:
PEiDv0.94查壳无发现,MicrosoftVisualC++6.0,无马甲。
二、找资源:
win32dasm载入找到如下信息:
*Referencedbya(U)nconditionalor(C)onditionalJumpatAddress:
|:004015BB(C)
|
:004015DD8D542404leaedx,dwordptr[esp+04]
:004015E150pusheax
:004015E252pushedx
:004015E38BCEmovecx,esi
:004015E5E866000000call00401650
:004015EA8B4664moveax,dwordptr[esi+64]
:004015EDC744241000000000mov[esp+10],00000000
:004015F550pusheax
:004015F68B442408moveax,dwordptr[esp+08]
:004015FA50pusheax
*ReferenceTo:MSVCRT._mbscmp,Ord:0159h
|
:004015FBFF15C8214000Calldwordptr[004021C8]
:0040160183C408addesp,00000008
:0040160485C0testeax,eax
:004016066A00push00000000
:004016086A00push00000000
:0040160A750Ejne0040161A
*PossibleStringDataReffromDataObj->"Great!pf!pf!"
|
:0040160C6828304000push00403028
:004016118BCEmovecx,esi
*ReferenceTo:MFC42.Ordinal:1080,Ord:1080h
|
:00401613E8FC040000Call00401B14
:00401618EB15jmp0040162F
*Referencedbya(U)nconditionalor(C)onditionalJumpatAddress:
|:0040160A(C)
|
*PossibleStringDataReffromDataObj->"fail!"
|
:0040161A6820304000push00403020
:0040161F8BCEmovecx,esi
*ReferenceTo:MFC42.Ordinal:1080,Ord:1080h
|
:00401621E8EE040000Call00401B14
:004016266A00push00000000
:004016288BCEmovecx,esi
*ReferenceTo:MFC42.Ordinal:18BE,Ord:18BEh
三、踏上破解之路:
odbg110载入:
很容易找到要点:在401590处F2下断
用户名:busheler
试验码:123456789
确定,即被断下
00401590.6AFFPUSH-1
00401592.68381E4000PUSHCrack_Me.00401E38;SEhandlerinstallation
00401597.64:A100000000MOVEAX,DWORDPTRFS:[0]
0040159D.50PUSHEAX
0040159E.64:8925000000>MOVDWORDPTRFS:[0],ESP
004015A5.51PUSHECX
004015A6.56PUSHESI
004015A7.8BF1MOVESI,ECX
004015A9.6A01PUSH1
004015AB.E86A050000CALL
004015B0.8B4E60MOVECX,DWORDPTRDS:[ESI+60];用户名入ECX
004015B3.8D4660LEAEAX,DWORDPTRDS:[ESI+60]
004015B6.8B51F8MOVEDX,DWORDPTRDS:[ECX-8];用户名长度入EDX
004015B9.85D2TESTEDX,EDX
004015BB.7520JNZSHORTCrack_Me.004015DD;用户名不为0跳
004015BD.6A00PUSH0
004015BF.6A00PUSH0
004015C1.6838304000PUSHCrack_Me.00403038;ASCII"UserNameisempty!"
004015C6.8BCEMOVECX,ESI
004015C8.E847050000CALL
004015CD.5EPOPESI
004015CE.8B4C2404MOVECX,DWORDPTRSS:[ESP+4]
004015D2.64:890D000000>MOVDWORDPTRFS:[0],ECX
004015D9.83C410ADDESP,10
004015DC.C3RET
004015DD>8D542404LEAEDX,DWORDPTRSS:[ESP+4]
004015E1.50PUSHEAX;/Arg2
004015E2.52PUSHEDX;|Arg1
004015E3.8BCEMOVECX,ESI;|
004015E5.E866000000CALLCrack_Me.00401650;\去计算注册码!!!
004015EA.8B4664MOVEAX,DWORDPTRDS:[ESI+64];试练码入EAX
004015ED.C74424100000>MOVDWORDPTRSS:[ESP+10],0
004015F5.50PUSHEAX;/s2
004015F6.8B442408MOVEAX,DWORDPTRSS:[ESP+8];|真注册码入EAX
004015FA.50PUSHEAX;|s1
004015FB.FF15C8214000CALLDWORDPTRDS:[<&MSVCRT._mbscmp>];\注册码对比!在这里下断点可直接看到注册码了,可是现在
的软件有几个有这等好事啊?
00401601.83C408ADDESP,8
00401604.85C0TESTEAX,EAX
00401606.6A00PUSH0
00401608.6A00PUSH0
0040160A.750EJNZSHORTCrack_Me.0040161A;不等跳!
0040160C.6828304000PUSHCrack_Me.00403028;ASCII"Great!pf!pf!"
00401611.8BCEMOVECX,ESI
00401613.E8FC040000CALL
00401618.EB15JMPSHORTCrack_Me.0040162F
0040161A>6820304000PUSHCrack_Me.00403020;ASCII"fail!"
0040161F.8BCEMOVECX,ESI
00401621.E8EE040000CALL
00401626.6A00PUSH0
00401628.8BCEMOVECX,ESI
0040162A.E8EB040000CALL
0040162F>8D4C2404LEAECX,DWORDPTRSS:[ESP+4]
00401633.C7442410FFFF>MOVDWORDPTRSS:[ESP+10],-1
0040163B.E8C0030000CALL
00401640.8B4C2408MOVECX,DWORDPTRSS:[ESP+8]
00401644.5EPOPESI
00401645.64:890D000000>MOVDWORDPTRFS:[0],ECX
0040164C.83C410ADDESP,10
0040164F.C3RET
--------------
跟随CALLCrack_Me.00401650进取看看注册码是如何炼成的......哇这么厉害,好长一段代码啊!
00401650/$6AFFPUSH-1
00401652|.686F1E4000PUSHCrack_Me.00401E6F;SEhandlerinstallation
00401657|.64:A100000000MOVEAX,DWORDPTRFS:[0]
0040165D|.50PUSHEAX
0040165E|.64:8925000000>MOVDWORDPTRFS:[0],ESP
00401665|.83EC34SUBESP,34
00401668|.33C0XOREAX,EAX
0040166A|.53PUSHEBX
0040166B|.89442421MOVDWORDPTRSS:[ESP+21],EAX
0040166F|.55PUSHEBP
00401670|.89442429MOVDWORDPTRSS:[ESP+29],EAX
00401674|.56PUSHESI
00401675|.89442431MOVDWORDPTRSS:[ESP+31],EAX
00401679|.33DBXOREBX,EBX
0040167B|.89442435MOVDWORDPTRSS:[ESP+35],EAX
0040167F|.57PUSHEDI
00401680|.8D4C2418LEAECX,DWORDPTRSS:[ESP+18]
00401684|.895C2420MOVDWORDPTRSS:[ESP+20],EBX
00401688|.885C242CMOVBYTEPTRSS:[ESP+2C],BL
0040168C|.8944243DMOVDWORDPTRSS:[ESP+3D],EAX
00401690|.E855040000CALL
00401695|.6A0APUSH0A;/pFileSystemNameSize=0000000A
00401697|.53PUSHEBX;|pFileSystemNameBuffer
00401698|.53PUSHEBX;|pFileSystemFlags
00401699|.8D4C241CLEAECX,DWORDPTRSS:[ESP+1C];|
0040169D|.53PUSHEBX;|pMaxFilenameLength
0040169E|.51PUSHECX;|pVolumeSerialNumber
0040169F|.6A0CPUSH0C;|MaxVolumeNameSize=C(12.)
004016A1|.BE01000000MOVESI,1;|
004016A6|.53PUSHEBX;|VolumeNameBuffer
004016A7|.6850304000PUSHCrack_Me.00403050;|RootPathName="C:\"
004016AC|.8974246CMOVDWORDPTRSS:[ESP+6C],ESI;|
004016B0|.895C2434MOVDWORDPTRSS:[ESP+34],EBX;|
004016B4|.33EDXOREBP,EBP;|
004016B6|.895C2430MOVDWORDPTRSS:[ESP+30],EBX;|
004016BA|.FF1500204000CALLDWORDPTRDS:[<&KERNEL32.GetVolumeI>;\GetVolumeInformationA
004016C0|.8B442410MOVEAX,DWORDPTRSS:[ESP+10];磁盘信息:即C盘序列号A40D9506入EAX
004016C4|.8B542458MOVEDX,DWORDPTRSS:[ESP+58]
004016C8|.3526038319XOREAX,19830326;C盘序列号与19830326做异或运算,结果入EAX,也就是第四
段基础数据
004016CD|.83C9FFORECX,FFFFFFFF
004016D0|.8B12MOVEDX,DWORDPTRDS:[EDX];用户名入EDX
004016D2|.89442410MOVDWORDPTRSS:[ESP+10],EAX
004016D6|.8BFAMOVEDI,EDX
004016D8|.33C0XOREAX,EAX
004016DA|.F2:AEREPNESCASBYTEPTRES:[EDI]
004016DC|.F7D1NOTECX
004016DE|.49DECECX
004016DF|.8954241CMOVDWORDPTRSS:[ESP+1C],EDX
004016E3|.8BF9MOVEDI,ECX
004016E5|.0F84BC010000JECrack_Me.004018A7
004016EB|.3BFECMPEDI,ESI
004016ED|.89742458MOVDWORDPTRSS:[ESP+58],ESI
004016F1|.0F8CAF000000JLCrack_Me.004017A6
004016F7|.DD0530254000FLDQWORDPTRDS:[402530];ST(0)=0
004016FD|.EB04JMPSHORTCrack_Me.00401703
004016FF|>8B54241C/MOVEDX,DWORDPTRSS:[ESP+1C];第一段基础数据开始:用户名入EDX
00401703|>8A5C32FFMOVBL,BYTEPTRDS:[EDX+ESI-1];用户名ASCII码入DL
00401707|.DB442458|FILDDWORDPTRSS:[ESP+58];用户名位数入ST(0)
0040170B|.0FBEC3|MOVSXEAX,BL;EAX=BL
0040170E|.DD5C2424|FSTPQWORDPTRSS:[ESP+24];用户名位数入ST(7)
00401712|.89442458|MOVDWORDPTRSS:[ESP+58],EAX;用户名ASCII入SS:[ESP+58]
00401716|.DB442458|FILDDWORDPTRSS:[ESP+58];用户名入ST(0)10进制
0040171A|.0FBECB|MOVSXECX,BL;ECX=BL
0040171D|.D9FA|FSQRT;ST(0)开平方
0040171F|.0FAFCE|IMULECX,ESI;用户名位数与其对应注册码ASCII码相乘
00401722|.DC4C2424|FMULQWORDPTRSS:[ESP+24];用户名位数与其对应注册码ASCII码(10进制)平方根相乘
00401726|.DC0528254000|FADDQWORDPTRDS:[402528];乘积+1
0040172C|.0FAFCE|IMULECX,ESI;40171F乘积与用户名位数相乘
0040172F|.894C2458|MOVDWORDPTRSS:[ESP+58],ECX
00401733|.DB442458|FILDDWORDPTRSS:[ESP+58];用户名入ST(0)10进制
00401737|.DEC9|FMULPST(1),ST;ST(0)*ST(1)结果入ST(0)
00401739|.D8C1|FADDST,ST(1);ST(0)+ST(1)结果入ST(7)
0040173B|.E836040000|CALL
00401740|.99|CDQ
00401741|.DDD8|FSTPST
00401743|.B9A0860100|MOVECX,186A0
00401748|.F7F9|IDIVECX;求前面求出数除以100000的余数,第一段基础数据
0040174A|.89542414|MOVDWORDPTRSS:[ESP+14],EDX
0040174E|.0FBED3|MOVSXEDX,BL;第二段基础数据开始:
00401751|.89542458|MOVDWORDPTRSS:[ESP+58],EDX
00401755|.DB442458|FILDDWORDPTRSS:[ESP+58]
00401759|.DD0520254000|FLDQWORDPTRDS:[402520]
0040175F|.E80C040000|CALL;用户名ASCII码平方
00401764|.DC4C2424|FMULQWORDPTRSS:[ESP+24];再乘以位数
00401768|.E809040000|CALL
0040176D|.DB442414|FILDDWORDPTRSS:[ESP+14]
00401771|.8BCE|MOVECX,ESI
00401773|.0FAFCD|IMULECX,EBP;上次算出本段算出值乘以用户名位数
00401776|.D9C0|FLDST
00401778|.D9FA|FSQRT;求开方
0040177A|.03C1|ADDEAX,ECX
0040177C|.B9A0860100|MOVECX,186A0
00401781|.99|CDQ
00401782|.F7F9|IDIVECX;求前面求出数除以100000的余数,第二段基础数据
00401784|.8BEA|MOVEBP,EDX
00401786|.E8EB030000|CALL;第三段基础数据开始:
0040178B|.03C5|ADDEAX,EBP
0040178D|.B9A0860100|MOVECX,186A0
00401792|.99|CDQ
00401793|.F7F9|IDIVECX;求前面求出数除以100000的余数,第三段基础数据
00401795|.46|INCESI
00401796|.3BF7|CMPESI,EDI
00401798|.89742458|MOVDWORDPTRSS:[ESP+58],ESI
0040179C|.8BDA|MOVEBX,EDX
0040179E|.^0F8E5BFFFFFF\JLECrack_Me.004016FF;循环次数小于等于用户名位数继续循环
004017A4|.DDD8FSTPST
004017A6|>33C0XOREAX,EAX;置循环头0
004017A8|>8BD0/MOVEDX,EAX;循环5次:0--4
004017AA|.8B4C2414|MOVECX,DWORDPTRSS:[ESP+14]
004017AE|.0FAFD0|IMULEDX,EAX
004017B1|.0FAFD0|IMULEDX,EAX
004017B4|.8D540A1F|LEAEDX,DWORDPTRDS:[EDX+ECX+1F];EAX^3+第一段数据+31
004017B8|.81E27F000080|ANDEDX,8000007F
004017BE|.7905|JNSSHORTCrack_Me.004017C5
004017C0|.4A|DECEDX
004017C1|.83CA80|OREDX,FFFFFF80
004017C4|.42|INCEDX
004017C5|>8854042C|MOVBYTEPTRSS:[ESP+EAX+2C],DL;DL入SS:[ESP+EAX+2C],后面用来计算1-5位注册码用。
004017C9|.40|INCEAX;EAX+1
004017CA|.83F805|CMPEAX,5
004017CD|.^7CD9\JLSHORTCrack_Me.004017A8
004017CF|.B805000000MOVEAX,5;置循环头
004017D4|>8BC8/MOVECX,EAX;循环5次:5--9
004017D6|.0FAFC8|IMULECX,EAX
004017D9|.0FAFC8|IMULECX,EAX
004017DC|.8D54291F|LEAEDX,DWORDPTRDS:[ECX+EBP+1F];EAX^3+第二段基础数据数据+31
004017E0|.81E27F000080|ANDEDX,8000007F
004017E6|.7905|JNSSHORTCrack_Me.004017ED
004017E8|.4A|DECEDX
004017E9|.83CA80|OREDX,FFFFFF80
004017EC|.42|INCEDX
004017ED|>8854042C|MOVBYTEPTRSS:[ESP+EAX+2C],DL;DL入SS:[ESP+EAX+2C],后面用来计算6-10位注册码用
004017F1|.40|INCEAX;EAX+1
004017F2|.83F80A|CMPEAX,0A
004017F5|.^7CDD\JLSHORTCrack_Me.004017D4
004017F7|.B80A000000MOVEAX,0A;置循环头
004017FC|>8BC8/MOVECX,EAX;循环5次:10--14
004017FE|.0FAFC8|IMULECX,EAX
00401801|.0FAFC8|IMULECX,EAX
00401804|.8D54191F|LEAEDX,DWORDPTRDS:[ECX+EBX+1F];EAX^3+第三段基础数据数据+31
00401808|.81E27F000080|ANDEDX,8000007F
0040180E|.7905|JNSSHORTCrack_Me.00401815
00401810|.4A|DECEDX
00401811|.83CA80|OREDX,FFFFFF80
00401814|.42|INCEDX
00401815|>8854042C|MOVBYTEPTRSS:[ESP+EAX+2C],DL;DL入SS:[ESP+EAX+2C],后面用来计算11-15位注册码用
00401819|.40|INCEAX;EAX+1
0040181A|.83F80F|CMPEAX,0F
0040181D|.^7CDD\JLSHORTCrack_Me.004017FC
0040181F|.B80F000000MOVEAX,0F;置循环头
00401824|>8BC8/MOVECX,EAX;循环5次:15--19
00401826|.8B542410|MOVEDX,DWORDPTRSS:[ESP+10]
0040182A|.0FAFC8|IMULECX,EAX
0040182D|.0FAFC8|IMULECX,EAX
00401830|.8D4C111F|LEAECX,DWORDPTRDS:[ECX+EDX+1F];EAX^3+第四段基础数据+31
00401834|.81E17F000080|ANDECX,8000007F
0040183A|.7905|JNSSHORTCrack_Me.00401841
0040183C|.49|DECECX
0040183D|.83C980|ORECX,FFFFFF80
00401840|.41|INCECX
00401841|>884C042C|MOVBYTEPTRSS:[ESP+EAX+2C],CL;DL入SS:[ESP+EAX+2C],后面用来计算15-20位注册码用
00401845|.40|INCEAX;EAX+1
00401846|.83F814|CMPEAX,14
00401849|.^7CD9\JLSHORTCrack_Me.00401824
0040184B|.33D2XOREDX,EDX
0040184D|.33C9XORECX,ECX;计算注册码开始,循环头置0
0040184F|>8A44142C/MOVAL,BYTEPTRSS:[ESP+EDX+2C];
00401853|.3C30|CMPAL,30
00401855|.7C04|JLSHORTCrack_Me.0040185B;小于跳
00401857|.3C39|CMPAL,39
00401859|.7E29|JLESHORTCrack_Me.00401884;小于等于跳
0040185B|>3C41|CMPAL,41
0040185D|.7C04|JLSHORTCrack_Me.00401863;小于跳
0040185F|.3C5A|CMPAL,5A
00401861|.7E21|JLESHORTCrack_Me.00401884;小于等于跳
00401863|>3C61|CMPAL,61
00401865|.7C04|JLSHORTCrack_Me.0040186B;小于跳
00401867|.3C7A|CMPAL,7A
00401869|.7E19|JLESHORTCrack_Me.00401884;小于等于跳
0040186B|>0FBEC0|MOVSXEAX,AL
0040186E|.8D44081F|LEAEAX,DWORDPTRDS:[EAX+ECX+1F]
00401872|.257F000080|ANDEAX,8000007F
00401877|.7905|JNSSHORTCrack_Me.0040187E
00401879|.48|DECEAX
0040187A|.83C880|OREAX,FFFFFF80
0040187D|.40|INCEAX
0040187E|>8844142C|MOVBYTEPTRSS:[ESP+EDX+2C],AL
00401882|.^EBCB|JMPSHORTCrack_Me.0040184F
00401884|>83C107|ADDECX,7;ECX循环加7
00401887|.42|INCEDX
00401888|.81F98C000000|CMPECX,8C;ECX和140比较小于继续循环,大于等于跳出循环,也就是循
环20次俄!
0040188E|.^7CBF\JLSHORTCrack_Me.0040184F
00401890|.8D4C242CLEAECX,DWORDPTRSS:[ESP+2C];计算注册码结束,来这里,注册码入ECX
00401894|.8D542418LEAEDX,DWORDPTRSS:[ESP+18]
00401898|.51PUSHECX
00401899|.684C304000PUSHCrack_Me.0040304C;ASCII"%s"
0040189E|.52PUSHEDX
0040189F|.E882020000CALL
004018A4|.83C40CADDESP,0C
004018A7|>8B742454MOVESI,DWORDPTRSS:[ESP+54]
004018AB|.8D442418LEAEAX,DWORDPTRSS:[ESP+18]
004018AF|.50PUSHEAX
004018B0|.8BCEMOVECX,ESI
004018B2|.E869020000CALL
004018B7|.C74424200100>MOVDWORDPTRSS:[ESP+20],1
004018BF|.8D4C2418LEAECX,DWORDPTRSS:[ESP+18]
004018C3|.C644244C00MOVBYTEPTRSS:[ESP+4C],0
004018C8|.E833010000CALL
004018CD|.8B4C2444MOVECX,DWORDPTRSS:[ESP+44]
004018D1|.8BC6MOVEAX,ESI
004018D3|.5FPOPEDI
004018D4|.5EPOPESI
004018D5|.5DPOPEBP
004018D6|.5BPOPEBX
004018D7|.64:890D000000>MOVDWORDPTRFS:[0],ECX
004018DE|.83C440ADDESP,40
004018E1\.C20800RET8
四、算法分析总结
注册码的计算分为三个阶段:
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)
-------------------------------------------------------------------------
【版权声明】交流学习,非商业应用,转载时请保证其完整!