屏幕监督软件V3.54注册算法分析
声明:本文章只为交流技术,请不要用于其它目的,本文章版权归DFCG组织所有,这个软件是我的湖南
老乡做的,本来注册机在软件发布的当天晚上我就做了,照顾老乡的面子我没有放出来,今天看见网上又
出了它的3.55版,其实是在3.54的基础上加了telock的壳,算法没有改变。
破解作者:
yzez[DFCG]
破解工具:
DEDE3.5、0llydbg1.09
破解目的:
本不为破解而破解,只为技术而破解。
1、用DEDE找关键断点,这里我不多说明,自己可以试一试,运行软件,输入注册信息,下面是我的机子上
的信息:
注册者姓名:YZEZDFCG; 注册申请码:8YZEZDFCG652270141802; 输入假码:12345678,不要点确定,
还没有设置好!打开OD,点Fill--Atteach,加载要破解的程序,然后在004E64FE设置好断点,这里我直接
把断点设在关键CALL了,你也可以把断点往前设。按F9程序运行,这时我们按下注册认证,看下面:
004E64E5 CALL BoTaPMJD.00445258
004E64EA MOV EDX, DWORD PTR SS:[EBP-10]
004E64ED MOV EAX, DWORD PTR DS:[4EDBAC]
004E64F2 CALL BoTaPMJD.00404900
004E64F7 MOV EAX, DWORD PTR DS:[4EE180]
004E64FC MOV EAX, DWORD PTR DS:[EAX]
004E64FE CALL BoTaPMJD.004DE368************在此CALL设断,关键CALL(1)按F7跟进!
004E6503 MOV EDX, DWORD PTR DS:[4EDC40]
004E6509 MOV BYTE PTR DS:[EDX], AL********把AL的值赋给DS:[EDX],成功赋值为1,反之则为0
004E650B MOV EAX, DWORD PTR DS:[4EDC40]
004E6510 CMP BYTE PTR DS:[EAX], 0*********成功DS:[EAX]的值为1,否则为0。比较是否为0
004E6513 JNZ SHORT BoTaPMJD.004E6550******不相等就跳,一跳你就乐哈哈,一定要跳!
004E6515 MOV EAX, DWORD PTR DS:[4EE180]***不跳就往下,你就等着哭吧!
004E651A MOV EDX, DWORD PTR SS:[EBP-4]
004E651D CALL BoTaPMJD.00404900
004E6522 MOV EAX, DWORD PTR DS:[4EDBAC]
004E6527 MOV EDX, DWORD PTR SS:[EBP-8]
004E652A CALL BoTaPMJD.00404900
004E652F PUSH 0
004E6531 PUSH BoTaPMJD.004E6624
004E6536 PUSH BoTaPMJD.004E662C
004E653B MOV EAX, DWORD PTR DS:[4EDF24]
004E6540 MOV EAX, DWORD PTR DS:[EAX]
004E6542 MOV EAX, DWORD PTR DS:[EAX+30]
004E6545 PUSH EAX
004E6546 CALL <JMP.&user32.MessageBoxA>***此CALL出现失败窗口!
004E654B JMP BoTaPMJD.004E65D4
004E6550 MOV EAX, DWORD PTR DS:[4EDAA0]***如果注册码正确,跳到这里!下面是写入相关的正确注册信息
004E6555 MOV EAX, DWORD PTR DS:[EAX] 有兴趣自己去看吧!
004E6557 MOV EBX, DWORD PTR DS:[EAX+58]
004E655A MOV EAX, EBX
004E655C CALL BoTaPMJD.0049F438
004E6561 MOV EAX, EBX
004E6563 CALL BoTaPMJD.004A17DC
004E6568 MOV EAX, EBX
004E656A CALL BoTaPMJD.004A1BE8
004E656F MOV EDX, BoTaPMJD.004E6640
; ASCII "USER"
004E6574 MOV EAX, EBX
004E6576 CALL BoTaPMJD.004A044C
004E657B MOV EDX, DWORD PTR DS:[4EE180]
; BoTaPMJD.004EFE5C
004E6581 MOV EDX, DWORD PTR DS:[EDX]
004E6583 MOV ECX, DWORD PTR DS:[EAX]
004E6585 CALL DWORD PTR DS:[ECX+B0]
004E658B MOV EDX, BoTaPMJD.004E6650
; ASCII "REGIST"
004E6590 MOV EAX, EBX
004E6592 CALL BoTaPMJD.004A044C
004E6597 MOV EDX, DWORD PTR DS:[4EDBAC]
; BoTaPMJD.004EFE60
004E659D MOV EDX, DWORD PTR DS:[EDX]
004E659F MOV ECX, DWORD PTR DS:[EAX]
004E65A1 CALL DWORD PTR DS:[ECX+B0]
004E65A7 MOV EAX, EBX
004E65A9 MOV EDX, DWORD PTR DS:[EAX]
004E65AB CALL DWORD PTR DS:[EDX+248]
004E65B1 MOV EAX, EBX
004E65B3 CALL BoTaPMJD.0049F444
004E65B8 PUSH 0
004E65BA PUSH BoTaPMJD.004E6608
004E65BF PUSH BoTaPMJD.004E6658
004E65C4 MOV EAX, DWORD PTR DS:[4EDF24]
004E65C9 MOV EAX, DWORD PTR DS:[EAX]
004E65CB MOV EAX, DWORD PTR DS:[EAX+30]
004E65CE PUSH EAX
004E65CF CALL <JMP.&user32.MessageBoxA>
004E65D4 XOR EAX, EAX
004E65D6 POP EDX
004E65D7 POP ECX
004E65D8 POP ECX
004E65D9 MOV DWORD PTR FS:[EAX], EDX
004E65DC PUSH BoTaPMJD.004E6603
004E65E1 LEA EAX, DWORD PTR SS:[EBP-10]
004E65E4 MOV EDX, 2
004E65E9 CALL BoTaPMJD.004048D0
004E65EE LEA EAX, DWORD PTR SS:[EBP-8]
004E65F1 MOV EDX, 2
004E65F6 CALL BoTaPMJD.004048
=============================================
下面是关键CALL(1)的代码:
004DE368 PUSH EBP
004DE369 MOV EBP, ESP
004DE36B PUSH 0
004DE36D PUSH 0
004DE36F PUSH 0
004DE371 PUSH EBX
004DE372 MOV DWORD PTR SS:[EBP-4], EAX
004DE375 MOV EAX, DWORD PTR SS:[EBP-4]
004DE378 CALL BoTaPMJD.00404D4C
004DE37D XOR EAX, EAX
004DE37F PUSH EBP
004DE380 PUSH BoTaPMJD.004DE3F2
004DE385 PUSH DWORD PTR FS:[EAX]
004DE388 MOV DWORD PTR FS:[EAX], ESP
004DE38B LEA EAX, DWORD PTR SS:[EBP-8]
004DE38E CALL BoTaPMJD.004DE238************此CALL按F7跟进!这个CALL不进,你就找不到算法所在!
004DE393 MOV EAX, DWORD PTR SS:[EBP-8]****把运算后得到的注册码移入EAX中!
004DE396 CALL BoTaPMJD.00404B64
004DE39B MOV EBX, EAX*********************注册码的位数移入EBX中,这里是9
004DE39D CMP DWORD PTR SS:[EBP-4], 0******输入用户名了吗?用户名没有输入直接跳走!
004DE3A1 JE SHORT BoTaPMJD.004DE3D1
004DE3A3 MOV EAX, DWORD PTR DS:[4EDBAC]
004DE3A8 CMP DWORD PTR DS:[EAX], 0********输入注册码了吗?没有直接跳走!
004DE3AB JE SHORT BoTaPMJD.004DE3D1
004DE3AD LEA EAX, DWORD PTR SS:[EBP-C]
004DE3B0 PUSH EAX
004DE3B1 MOV EAX, DWORD PTR DS:[4EDBAC]
004DE3B6 MOV EAX, DWORD PTR DS:[EAX]
004DE3B8 MOV ECX, EBX
004DE3BA MOV EDX, 1
004DE3BF CALL BoTaPMJD.00404DBC
004DE3C4 MOV EDX, DWORD PTR SS:[EBP-C]
004DE3C7 MOV EAX, DWORD PTR SS:[EBP-8]
004DE3CA CALL BoTaPMJD.00404CA8*************此CALL比较注册码与输入的假码!关键比较!
004DE3CF JE SHORT BoTaPMJD.004DE3D5*******相等就跳,一定要跳!爆破点在此!
004DE3D1 XOR EBX, EBX
004DE3D3 JMP SHORT BoTaPMJD.004DE3D7
004DE3D5 MOV BL, 1*************************如果跳就跳到这里,赋BL的值为1
004DE3D7 XOR EAX, EAX
004DE3D9 POP EDX
004DE3DA POP ECX
004DE3DB POP ECX
004DE3DC MOV DWORD PTR FS:[EAX], EDX
004DE3DF PUSH BoTaPMJD.004DE3F9
004DE3E4 LEA EAX, DWORD PTR SS:[EBP-C]
004DE3E7 MOV EDX, 3
004DE3EC CALL BoTaPMJD.004048D0
004DE3F1 RETN
004DE3F2 ^\JMP BoTaPMJD.004042D4*************如果注册成功就会来到这里!
004DE3F7 ^ JMP SHORT BoTaPMJD.004DE3E4
004DE3F9 MOV EAX, EBX**********************把EBX的值移入EAX中,EBX的值为1,所以这里
004DE3FB POP EBX
赋成功标志为1。
004DE3FC MOV ESP, EBP
004DE3FE POP EBP
004DE3FF RETN
上面的程序结束!
===========================================================================================
============================================================================================
下面是004DE38E CALL BoTaPMJD.004DE238这个关键CALL(2)的代码:
004DE239 8BEC
MOV EBP, ESP
004DE23B 33C9 XOR
ECX, ECX
004DE23D 51 PUSH
ECX
004DE23E 51 PUSH
ECX
004DE23F 51 PUSH
ECX
004DE240 51 PUSH
ECX
004DE241 51 PUSH
ECX
004DE242 51 PUSH
ECX
004DE243 51 PUSH
ECX
004DE244 51 PUSH
ECX
004DE245 53 PUSH
EBX
004DE246 56 PUSH
ESI
004DE247 57 PUSH
EDI
004DE248 8945 FC MOV
DWORD PTR SS:[EBP-4], EAX
004DE24B 33C0 XOR
EAX, EAX
004DE24D 55 PUSH
EBP
004DE24E 68 58E34D00 PUSH BoTaPMJD.004DE358
004DE253 64:FF30 PUSH DWORD
PTR FS:[EAX]
004DE256 64:8920 MOV
DWORD PTR FS:[EAX], ESP
004DE259 A1 80E14E00 MOV EAX, DWORD
PTR DS:[4EE180]
004DE25E 8338 00 CMP
DWORD PTR DS:[EAX], 0
004DE261 74 0A JE
SHORT BoTaPMJD.004DE26D
004DE263 A1 ACDB4E00 MOV EAX, DWORD
PTR DS:[4EDBAC]
004DE268 8338 00 CMP
DWORD PTR DS:[EAX], 0
004DE26B 75 0D JNZ
SHORT BoTaPMJD.004DE27A
004DE26D 8B45 FC MOV
EAX, DWORD PTR SS:[EBP-4]
004DE270 E8 3766F2FF CALL BoTaPMJD.004048AC
004DE275 E9 B6000000 JMP BoTaPMJD.004DE330
004DE27A 8D45 F8 LEA
EAX, DWORD PTR SS:[EBP-8]
004DE27D 8B15 80E14E00 MOV EDX, DWORD PTR
DS:[4EE180]
004DE283 8B12 MOV
EDX, DWORD PTR DS:[EDX]
004DE285 CALL BoTaPMJD.00404944
004DE28A LEA EDX, DWORD PTR SS:[EBP-C]
004DE28D MOV EAX, DWORD PTR SS:[EBP-8]***申请码中的用户名入EAX,即把YZEZDFCG入EAX
004DE290 CALL BoTaPMJD.004DDE14***********算法CALL1,此CALL是对申请码中包含的用户名计算!
004DE295 MOV EAX, DWORD PTR SS:[EBP-C]
004DE298 CALL BoTaPMJD.00404B64
004DE29D MOV DWORD PTR SS:[EBP-18], EAX
004DE2A0 LEA EAX, DWORD PTR SS:[EBP-8]
004DE2A3 CALL BoTaPMJD.004DDFC0
004DE2A8 LEA EDX, DWORD PTR SS:[EBP-10]
004DE2AB MOV EAX, DWORD PTR SS:[EBP-8]***把申请码的后几位入EAX,第二次运算!
004DE2AE CALL BoTaPMJD.004DDE14***********算法CALL2,此CALL对根据用户名产生的申请码的
************************************后几位计算,因为调用同一个子程序,所以不多例举!所谓后几
************************************位是指申请码中包含用户名后的几位!如我的是:652270141802
004DE2B3 MOV EAX, DWORD PTR SS:[EBP-10]
004DE2B6 CALL BoTaPMJD.00404B64
004DE2BB MOV EDI, EAX
004DE2BD 8D45 F8 LEA
EAX, DWORD PTR SS:[EBP-8]
004DE2C0 E8 E765F2FF CALL BoTaPMJD.004048AC
004DE2C5 8B45 E8 MOV
EAX, DWORD PTR SS:[EBP-18]
004DE2C8 3BF8 CMP
EDI, EAX
004DE2CA 7E 02 JLE
SHORT BoTaPMJD.004DE2CE
004DE2CC 8BC7 MOV
EAX, EDI
004DE2CE 8BF0 MOV
ESI, EAX
004DE2D0 85F6 TEST
ESI, ESI
004DE2D2 7E 46 JLE
SHORT BoTaPMJD.004DE31A
004DE2D4 BB 01000000 MOV EBX, 1************************EBX做计数器,赋计数器的值为1
004DE2D9 3B5D E8 CMP
EBX, DWORD PTR SS:[EBP-18]****SS:[EBP-18]存放第一轮运算后结果的位数
004DE2DC 7F 1A JG
SHORT BoTaPMJD.004DE2F8*******大于就跳走!
004DE2DE 8D45 E4 LEA
EAX, DWORD PTR SS:[EBP-1C]
004DE2E1 8B55 F4 MOV
EDX, DWORD PTR SS:[EBP-C]***把第一轮运算后的值:ESJWG入EDX
004DE2E4 8A541A FF MOV DL,
BYTE PTR DS:[EDX+EBX-1]**第一位E入DL!
004DE2E8 E8 9F67F2FF CALL BoTaPMJD.00404A8C
004DE2ED 8B55 E4 MOV
EDX, DWORD PTR SS:[EBP-1C]
004DE2F0 8D45 F8 LEA
EAX, DWORD PTR SS:[EBP-8]
004DE2F3 E8 7468F2FF CALL BoTaPMJD.00404B6C
004DE2F8 3BFB CMP
EDI, EBX*********************EDI存放第二轮运算后的值的位数!比较
004DE2FA 7C 1A JL
SHORT BoTaPMJD.004DE316******小于就跳走!
004DE2FC 8D45 E0 LEA
EAX, DWORD PTR SS:[EBP-20]
004DE2FF 8B55 F0 MOV
EDX, DWORD PTR SS:[EBP-10]****把第二轮运算后的值:DY2A入EDX
004DE302 8A541A FF MOV DL,
BYTE PTR DS:[EDX+EBX-1]***把第一位D入DL
004DE306 E8 8167F2FF CALL BoTaPMJD.00404A8C
004DE30B 8B55 E0 MOV
EDX, DWORD PTR SS:[EBP-20]
004DE30E 8D45 F8 LEA
EAX, DWORD PTR SS:[EBP-8]
004DE311 E8 5668F2FF CALL BoTaPMJD.00404B6C
004DE316 43 INC
EBX***************************EBX加1
004DE317 4E DEC
ESI***************************ESI减1
004DE318 ^ 75 BF JNZ
SHORT BoTaPMJD.004DE2D9*******不等跳回再来,构成一个循环,这个循环
*******就是组合注册码,注册码的组合是这样:先取第一轮运算后的值的第一位,再取第二轮运算后的值的第二位,
*******第三次取第一轮值的第二位,第四次取第二轮值的第二位,以下类推!其结果是:EDSYJ2WAG
004DE31A 8D45 EC LEA
EAX, DWORD PTR SS:[EBP-14]
004DE31D 8B55 F8 MOV
EDX, DWORD PTR SS:[EBP-8]
004DE320 E8 1F66F2FF CALL BoTaPMJD.00404944
004DE325 8B45 FC MOV
EAX, DWORD PTR SS:[EBP-4]
004DE328 8B55 EC MOV
EDX, DWORD PTR SS:[EBP-14]
004DE32B E8 D065F2FF CALL BoTaPMJD.00404900
004DE330 33C0 XOR
EAX, EAX
004DE332 5A POP
EDX
004DE333 59 POP
ECX
004DE334 59 POP
ECX
004DE335 64:8910 MOV
DWORD PTR FS:[EAX], EDX
004DE338 68 5FE34D00 PUSH BoTaPMJD.004DE35F
004DE33D 8D45 E0 LEA
EAX, DWORD PTR SS:[EBP-20]
004DE340 BA 02000000 MOV EDX, 2
004DE345 E8 8665F2FF CALL BoTaPMJD.004048D0
004DE34A 8D45 EC LEA
EAX, DWORD PTR SS:[EBP-14]
004DE34D BA 04000000 MOV EDX, 4
004DE352 E8 7965F2FF CALL BoTaPMJD.004048D0
004DE357 C3 RETN
上面的CALL结束!
============================================================================================
下面是算法CALL,因为算法CALL1和算法CALL2调用的是同一个子程序,所以我只放了第一个:
004DDE13 ADD BYTE PTR SS:[EBP-75], DL
004DDE17 MOV ECX, 5
004DDE1C PUSH 0
004DDE1E PUSH 0
004DDE20 DEC ECX
004DDE21 ^ JNZ SHORT BoTaPMJD.004DDE1C
004DDE23 PUSH EBX
004DDE24 PUSH ESI
004DDE25 PUSH EDI
004DDE26 MOV DWORD PTR SS:[EBP-8], EDX
004DDE29 MOV DWORD PTR SS:[EBP-4], EAX
004DDE2C MOV EAX, DWORD PTR SS:[EBP-4]
004DDE2F CALL BoTaPMJD.00404D4C
004DDE34 XOR EAX, EAX
004DDE36 PUSH EBP
004DDE37 PUSH BoTaPMJD.004DDFAF
004DDE3C PUSH DWORD PTR FS:[EAX]
004DDE3F MOV DWORD PTR FS:[EAX], ESP
004DDE42 LEA EAX, DWORD PTR SS:[EBP-10]
004DDE45 MOV EDX, DWORD PTR SS:[EBP-4]
004DDE48 CALL BoTaPMJD.00404944
004DDE4D MOV EAX, DWORD PTR SS:[EBP-10]
004DDE50 CALL BoTaPMJD.00404B64
004DDE55 MOV EDI, EAX
004DDE57 XOR EAX, EAX
004DDE59 MOV DWORD PTR SS:[EBP-C], EAX
004DDE5C MOV EAX, EDI
004DDE5E TEST EAX, EAX
004DDE60 JLE SHORT BoTaPMJD.004DDE7C
004DDE62 MOV ESI, 1**********************把1移入ESI,ESI做计数器!
004DDE67 MOV EDX, DWORD PTR SS:[EBP-10]**SS:[EBP-10]存放输入的用户名,用户名入EDX!
004DDE6A XOR EBX, EBX********************EBX清0!准备计算!
004DDE6C MOV BL, BYTE PTR DS:[EDX+ESI-1]**逐位取用户名,这里先取第一位:Y,取各位用户
*************************************************名的ASCII码移入BL,所以这里先把Y的ASCII码59入BL!
004DDE70 MOV EDX, EBX*********************EBX的值入EDX,EBX的值是Y的ASCII码59!
004DDE72 IMUL EDX, EBX*********************有符号位乘,EDX=EDX*EBX=59*59=1EF1
004DDE75 ADD DWORD PTR SS:[EBP-C], EDX****相加,SS:[EBP-C]初始值为0,加后:其值变为1EF1
004DDE78 INC ESI**************************ESI加1
004DDE79 DEC EAX**************************EAX减1,EAX存放用户名的位数!用户名位数是8
004DDE7A ^ JNZ SHORT BoTaPMJD.004DDE67******取完了吗!没完跳回!这是一个循环!循环次数由用户
*************************************************名位数控制,每次循环,把用户名的ASCII码自身相乘,
**********************************************再把结果加上上一个用户名运算的值,结果存入:SS:[EBP-C]
004DDE7C LEA EDX, DWORD PTR SS:[EBP-1C]
004DDE7F MOV EAX, DWORD PTR SS:[EBP-C]****把上述循环运算的结果移入EAX中!结果是:BB40
004DDE82 CALL BoTaPMJD.00409148************此CALL把上述结果转化为十进制值输出:47936
004DDE87 MOV EAX, DWORD PTR SS:[EBP-1C]
004DDE8A LEA EDX, DWORD PTR SS:[EBP-10]
004DDE8D CALL BoTaPMJD.00408F94
004DDE92 MOV EAX, DWORD PTR SS:[EBP-10]
004DDE95 CALL BoTaPMJD.00404B64
004DDE9A MOV EDI, EAX
004DDE9C LEA EAX, DWORD PTR SS:[EBP-18]
004DDE9F CALL BoTaPMJD.004048AC
004DDEA4 MOV ESI, 1
004DDEA9 CMP EDI, ESI
004DDEAB JL BoTaPMJD.004DDF81
004DDEB1 LEA EAX, DWORD PTR SS:[EBP-14]
004DDEB4 PUSH EAX
004DDEB5 MOV ECX, 2
004DDEBA MOV EDX, ESI
004DDEBC MOV EAX, DWORD PTR SS:[EBP-10]
004DDEBF CALL BoTaPMJD.00404DBC
004DDEC4 MOV EAX, DWORD PTR SS:[EBP-14]***取47936的前两位入EAX,即EAX的值为47
004DDEC7 CALL BoTaPMJD.004091AC************此CALL把EAX的值再转化为十六进制值:47为2F!
004DDECC MOV EBX, EAX*********************2F入EBX
004DDECE CMP EBX, 30**********************EBX与30比较!
004DDED1 JL SHORT BoTaPMJD.004DDED8******小于就跳!
004DDED3 CMP EBX, 39**********************EBX与39比较!
004DDED6 JLE SHORT BoTaPMJD.004DDEEC******小于等于就跳!
004DDED8 CMP EBX, 41**********************与41比较!
004DDEDB JL SHORT BoTaPMJD.004DDEE2******小于就跳!
004DDEDD CMP EBX, 5A**********************与5A比较!
004DDEE0 JLE SHORT BoTaPMJD.004DDEEC******小于等于就跳!
004DDEE2 CMP EBX, 61**********************与61比较!
004DDEE5 JL SHORT BoTaPMJD.004DDF03******小于就跳!
004DDEE7 CMP EBX, 7A**********************与7A比较!
004DDEEA JG SHORT BoTaPMJD.004DDF03******大于就跳!从上述片段我们可以看出!注册码的取值
*********************************************范围应是:0-9;A-Z;a-z之间!在这里确定注册码范围!
004DDEEC LEA EAX, DWORD PTR SS:[EBP-20]
004DDEEF MOV EDX, EBX
004DDEF1 CALL BoTaPMJD.00404A8C
004DDEF6 MOV EDX, DWORD PTR SS:[EBP-20]
004DDEF9 LEA EAX, DWORD PTR SS:[EBP-18]
004DDEFC CALL BoTaPMJD.00404B6C
004DDF01 JMP SHORT BoTaPMJD.004DDF76
004DDF03 LEA EAX, DWORD PTR SS:[EBP-14]
004DDF06 PUSH EAX
004DDF07 MOV ECX, 1***********************1入ECX!
004DDF0C MOV EDX, ESI*********************ESI的值为1,赋EDX的值为1
004DDF0E MOV EAX, DWORD PTR SS:[EBP-10]***47936送入EAX
004DDF11 CALL BoTaPMJD.00404DBC
004DDF16 MOV EAX, DWORD PTR SS:[EBP-14]
004DDF19 CALL BoTaPMJD.004091AC************此CALL取47的第一位值为4存放在EAX
004DDF1E MOV EBX, EAX*********************EAX的值(4)入EBX
004DDF20 ADD EBX, 41**********************EBX加上常数:41,EBX=41+4=45(E的ASCII码)
004DDF23 LEA EAX, DWORD PTR SS:[EBP-24]
004DDF26 MOV EDX, EBX
004DDF28 CALL BoTaPMJD.00404A8C
004DDF2D MOV EDX, DWORD PTR SS:[EBP-24]
004DDF30 LEA EAX, DWORD PTR SS:[EBP-18]
004DDF33 CALL BoTaPMJD.00404B6C
004DDF38 LEA EBX, DWORD PTR DS:[ESI+1]
004DDF3B CMP EDI, EBX
004DDF3D JL SHORT BoTaPMJD.004DDF76
004DDF3F LEA EAX, DWORD PTR SS:[EBP-14]
004DDF42 PUSH EAX
004DDF43 MOV EDX, EBX
004DDF45 MOV ECX, 1
004DDF4A MOV EAX, DWORD PTR SS:[EBP-10]
004DDF4D CALL BoTaPMJD.00404DBC
004DDF52 MOV EAX, DWORD PTR SS:[EBP-14]
004DDF55 CALL BoTaPMJD.004091AC************此CALL取47的第二位7存放在EAX
004DDF5A MOV EBX, 5A**********************把5A入EBX
004DDF5F SUB EBX, EAX*********************EBX=EBX-EAX=5A-7=53(S的ASCII码)
004DDF61 LEA EAX, DWORD PTR SS:[EBP-28]
004DDF64 MOV EDX, EBX*********************53入EDX
004DDF66 CALL BoTaPMJD.00404A8C************47936的前两位47运算后,转变成为:ES
004DDF6B MOV EDX, DWORD PTR SS:[EBP-28]
004DDF6E LEA EAX, DWORD PTR SS:[EBP-18]
004DDF71 CALL BoTaPMJD.00404B6C
004DDF76 ADD ESI, 2***********************ESI+2
004DDF79 CMP EDI, ESI*********************EDI为47936的位数,比较EDI和ESI
004DDF7B ^ JGE BoTaPMJD.004DDEB1************EDI的值大于ESI的值就跳回:004DDEB1,再取两位
*************************************************计算,直至取完为止!取完后得到的值是:ESJWG
004DDF81 MOV EAX, DWORD PTR SS:[EBP-8]
004DDF84 MOV EDX, DWORD PTR SS:[EBP-18]
004DDF87 CALL BoTaPMJD.00404900
004DDF8C XOR EAX, EAX
004DDF8E POP EDX
004DDF8F POP ECX
004DDF90 POP ECX
004DDF91 MOV DWORD PTR FS:[EAX], EDX
004DDF94 PUSH BoTaPMJD.004DDFB6
004DDF99 LEA EAX, DWORD PTR SS:[EBP-28]
004DDF9C MOV EDX, 7
004DDFA1 CALL BoTaPMJD.004048D0
004DDFA6 LEA EAX, DWORD PTR SS:[EBP-4]
004DDFA9 CALL BoTaPMJD.004048AC
================================================
2、算法总结:
A、第一步取注册申请码中的用户名计算,把用户名的每一位ASCII码自身相乘,再相加,用户名最多是8位
,设用户名为ABCDEFGH对应的ASCII码为:stuvwxyz,其计算如下:s*s+t*t+u*u+v*v+w*w+x*x+y*y+z*z=X(1)
,这里的X(1)为十六进制值,再把它转化为十进制值,进一步运算,在得到的十进值(为简单我们设为s1s2s3s4
s5),每次取两位t1t2,t1+41=p(和的结果是某个字符的ASCII码,这里我们直接转化了),前面还有一步是转化
成十六进制值。5A-t2=q(差的结果是某个字符的ASCII码,这里我们也直接转化了),如果是奇数位,最后一位
直接加上41。
B、第二步取申请码的最后余下的几位同上运算,省略!
C、经过上两步运算,得到两组值,再进行第三步运算,把它组合成注册码,我们假定第一次的结果为:pq
p1q1p2,第二步运算的值为:mnm1n1m2,其方法是:第一次取第一组的第一位p,第二次取第二组的第一位m,
第三次取第一组的第二位q,第四次取第二组的第二位n,以下类推,最后的值是:pmqnp1m1q1n1p2m2.
D、特殊说明:如果上述取值转化为十六进值时,是某个字符的ASCII码时不用加和减,直接取出这个字符
就行了,举例说明:如取两位:50,转化成十六进值为32,32是2的ASCII码,这里就直接取2,不用进行后面
的加减操作,再如:66,转化为十六进值为:42,42是B的ASCII码,这里就直接取B。上述转化为十六进值
就是处理这种特殊情况。
3、举例说明:我的注册申请码:8YZEZDFCG652270141802,先取中间的用户名:YZEZDFCG,第一步运算:
59*59+5A*5A+------47*47=BB40(十进值为47936),转化:先取两位:47(十六进制值为2F),4+41=45(
(E的ASCII码),5A-7=53(S的ASCII码),经过处理后的值为:ESJWG。第二步运算:取余下的几位申请
码:652270141802,同上运算,得到的值:7B0C(十进值为31500),转化:41+3=44(D),5A-1=59(
Y),取第二组:50(这里是特殊情况所以我作说明)转化成十六进值为32(2的ASCII码,直接取2),最后
一位是0,0+41=41(A),最后的结果是:DY2A,第三步组合起来是:EDSYJ2WAG。