KeyMake编写算法注册机学习之〖KeyGen For 钢琴曲大全 1.03〗
【破文标题】KeyMake编写算法注册机之〖KeyGen For 钢琴曲大全 1.03〗【破文作者】WildCatIII
【特别感谢】萧萧黄叶兄弟用易语言写了这个程序的KeyGen,本人抱着试试的态度而完成的这个汇编语言算法注册机,希望大家喜欢。在此感谢萧萧黄叶兄弟。
【破解工具】PEiD,OD,KeyMake
【破解平台】Windows XP
【软件名称】钢琴曲大全 1.03安装目录下的musicreg.exe
【软件大小】900KB
【原版下载】http://www.onlinedown.net/soft/69913.htm
【保护方式】注册码
【软件简介】钢琴曲大全(钢琴音乐大辞典)收集了从文艺复兴时期到现代3490首经典(古典)钢琴音乐、钢琴曲,并收集整理了作曲家、演奏家、写作年份、曲目类型、作品号,有清晰明了的目录(作曲家、演奏家、写作年份、曲目类型、作品号)、作曲家生平、中文与原文对照,非常方便的查询搜索系统能快速的查找作曲家、演奏家、写作年份、曲目类型、作品号。播放系统可以单/多首连续循环播放。试用版的曲库只有**的德国组曲中BWV.825下面的6个乐章!
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
------------------------------------------------------------------------
【破解过程】一、PEiD查无壳,用OD载入运行,输入机器码:ZXB-0001,假码:987点确定,软件报错。返回OD,F12暂停程序,观察到堆栈窗口友好提示:
0012FD60|0042923E返回到 musicreg.0042923E 来自 musicreg.00429148
0012FD64|FFFFFFFF
0012FD68|FFFFFFFF
0012FD6C|00000000
0012FD70|0042922B返回到 musicreg.0042922B 来自 musicreg.0042922C
0012FD74|00481E14返回到 musicreg.00481E14 来自 musicreg.00429220 //在这里返回
0012FD78|0012FDBC指向下一个 SEH 记录的指针
0012FD7C|00481E49SE处理程序
0012FD80|0012FDA4
0012FD84|00A6461C
0012FD88|00000000
0012FD8C|00000000
0012FD90|00A67214ASCII "987"
0012FD94|00A6D728ASCII "987"
0012FD98|00A6DC9CASCII "ZXB-0001"
0012FD9C|00A64C68ASCII "987"
0012FDA0|00A6C9A8ASCII "ZXB-0001"
0012FDA4]0012FDD4
0012FDA8|004379FE返回到 musicreg.004379FE
返回到这里:
00481E14|> \33C0 XOR EAX,EAX 看到EAX清零的操作,应该上面就有一些相关注册的提示,往上看:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00481D09|.55 PUSH EBP ;在这下断
00481D0A|.68 491E4800 PUSH musicreg.00481E49
00481D0F|.64:FF30 PUSH DWORD PTR FS:
00481D12|.64:8920 MOV DWORD PTR FS:,ESP
00481D15|.8D55 F4 LEA EDX,DWORD PTR SS:
00481D18|.8B83 00030000 MOV EAX,DWORD PTR DS:
00481D1E|.E8 4147FBFF CALL musicreg.00436464
00481D23|.8B45 F4 MOV EAX,DWORD PTR SS: ;机器码:ASCII "ZXB-0001"
00481D26|.8D55 FC LEA EDX,DWORD PTR SS:
00481D29|.E8 A662F8FF CALL musicreg.00407FD4
00481D2E|.8D55 F0 LEA EDX,DWORD PTR SS:
00481D31|.8B83 04030000 MOV EAX,DWORD PTR DS:
00481D37|.E8 2847FBFF CALL musicreg.00436464
00481D3C|.8B45 F0 MOV EAX,DWORD PTR SS: ;假码:ASCII "987"
00481D3F|.8D55 F8 LEA EDX,DWORD PTR SS:
00481D42|.E8 8D62F8FF CALL musicreg.00407FD4
00481D47|.8D55 EC LEA EDX,DWORD PTR SS:
00481D4A|.8B83 04030000 MOV EAX,DWORD PTR DS:
00481D50|.E8 0F47FBFF CALL musicreg.00436464
00481D55|.837D EC 00 CMP DWORD PTR SS:,0
00481D59|.75 0F JNZ SHORT musicreg.00481D6A ;假码有没有输,有就跳。
00481D5B|.B8 601E4800 MOV EAX,musicreg.00481E60
00481D60|.E8 BB74FAFF CALL musicreg.00429220
00481D65|.E9 AA000000 JMP musicreg.00481E14
00481D6A|>8B55 F8 MOV EDX,DWORD PTR SS: ;跳来这,假码放EDX
00481D6D|.8B45 FC MOV EAX,DWORD PTR SS: ;机器码放EAX
00481D70|.E8 FFF8FFFF CALL musicreg.00481674 ;关键CALL,跟进。
00481D75|.84C0 TEST AL,AL
00481D77|.0F84 8D000000 JE musicreg.00481E0A ;注册成功否?
00481D7D|.E8 3EF8FFFF CALL musicreg.004815C0
00481D82|.84C0 TEST AL,AL
00481D84|.74 78 JE SHORT musicreg.00481DFE
00481D86|.6A 04 PUSH 4
00481D88|.68 701E4800 PUSH musicreg.00481E70
00481D8D|.68 781E4800 PUSH musicreg.00481E78
00481D92|.8BC3 MOV EAX,EBX
00481D94|.E8 A7AEFBFF CALL musicreg.0043CC40
00481D99|.50 PUSH EAX ; |hOwner
00481D9A|.E8 C94BF8FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00481D9F|.83F8 06 CMP EAX,6
00481DA2|.75 70 JNZ SHORT musicreg.00481E14
00481DA4|.6A 01 PUSH 1
00481DA6|.68 981E4800 PUSH musicreg.00481E98
00481DAB|.68 981E4800 PUSH musicreg.00481E98
00481DB0|.8D55 E4 LEA EDX,DWORD PTR SS:
00481DB3|.A1 FC424800 MOV EAX,DWORD PTR DS:
00481DB8|.8B00 MOV EAX,DWORD PTR DS:
00481DBA|.E8 F145FDFF CALL musicreg.004563B0
00481DBF|.8B45 E4 MOV EAX,DWORD PTR SS:
00481DC2|.8D55 E8 LEA EDX,DWORD PTR SS:
00481DC5|.E8 8268F8FF CALL musicreg.0040864C
00481DCA|.8D45 E8 LEA EAX,DWORD PTR SS:
00481DCD|.BA A41E4800 MOV EDX,musicreg.00481EA4 ;ASCII "music.exe"
00481DD2|.E8 9924F8FF CALL musicreg.00404270
00481DD7|.8B45 E8 MOV EAX,DWORD PTR SS:
00481DDA|.E8 8926F8FF CALL musicreg.00404468
00481DDF|.50 PUSH EAX ; |FileName
00481DE0|.68 B01E4800 PUSH musicreg.00481EB0 ; |Operation = "open"
00481DE5|.E8 2E49F8FF CALL <JMP.&user32.GetActiveWindow> ; |[GetActiveWindow
00481DEA|.50 PUSH EAX ; |hWnd
00481DEB|.E8 A461FAFF CALL <JMP.&shell32.ShellExecuteA> ; \ShellExecuteA
00481DF0|.A1 FC424800 MOV EAX,DWORD PTR DS:
00481DF5|.8B00 MOV EAX,DWORD PTR DS:
00481DF7|.E8 9040FDFF CALL musicreg.00455E8C
00481DFC|.EB 16 JMP SHORT musicreg.00481E14
00481DFE|>B8 C01E4800 MOV EAX,musicreg.00481EC0
00481E03|.E8 1874FAFF CALL musicreg.00429220
00481E08|.EB 0A JMP SHORT musicreg.00481E14
00481E0A|>B8 FC1E4800 MOV EAX,musicreg.00481EFC
00481E0F|.E8 0C74FAFF CALL musicreg.00429220
00481E14|>33C0 XOR EAX,EAX ;返回这里
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
跟进算法CALL:
+++++++++++++
00481674/$55 PUSH EBP ;跟进关键CALL来到这里,接着分析。
00481675|.8BEC MOV EBP,ESP
00481677|.B9 0A000000 MOV ECX,0A
0048167C|>6A 00 /PUSH 0
0048167E|.6A 00 |PUSH 0
00481680|.49 |DEC ECX
00481681|.^ 75 F9 \JNZ SHORT musicreg.0048167C
00481683|.53 PUSH EBX
00481684|.56 PUSH ESI
00481685|.57 PUSH EDI
00481686|.8955 F8 MOV DWORD PTR SS:,EDX
00481689|.8945 FC MOV DWORD PTR SS:,EAX
0048168C|.8B45 FC MOV EAX,DWORD PTR SS:
0048168F|.E8 C42DF8FF CALL musicreg.00404458
00481694|.8B45 F8 MOV EAX,DWORD PTR SS:
00481697|.E8 BC2DF8FF CALL musicreg.00404458
0048169C|.33C0 XOR EAX,EAX
0048169E|.55 PUSH EBP ;这里F4一次略过上面代码。
0048169F|.68 591A4800 PUSH musicreg.00481A59
004816A4|.64:FF30 PUSH DWORD PTR FS:
004816A7|.64:8920 MOV DWORD PTR FS:,ESP
004816AA|.33DB XOR EBX,EBX
004816AC|.8D45 F4 LEA EAX,DWORD PTR SS:
004816AF|.8B55 FC MOV EDX,DWORD PTR SS: ;机器码,KeyMake里可以先使用MOV ,EAX把机器码放到的位置,在这里才可以调用。
004816B2|.E8 8929F8FF CALL musicreg.00404040
004816B7|.8B45 F4 MOV EAX,DWORD PTR SS: ;机器码ASCII "ZXB-0001"
004816BA|.E8 A92BF8FF CALL musicreg.00404268
004816BF|.8BF0 MOV ESI,EAX ;位数放ESI
004816C1|.85F6 TEST ESI,ESI ;检测小于或等于0不,也就是判定机器码存在不。
004816C3|.7E 33 JLE SHORT musicreg.004816F8 ;有就不跳。
004816C5|.BF 01000000 MOV EDI,1 ;初始EDI=1,接下来开始进入循环。
004816CA|>8D45 E0 /LEA EAX,DWORD PTR SS:
004816CD|.50 |PUSH EAX
004816CE|.B9 01000000 |MOV ECX,1 ;ECX=1
004816D3|.8BD7 |MOV EDX,EDI ;EDX=EDI
004816D5|.8B45 F4 |MOV EAX,DWORD PTR SS: ;机器码
004816D8|.E8 EB2DF8FF |CALL musicreg.004044C8
004816DD|.8B45 E0 |MOV EAX,DWORD PTR SS:
004816E0|.E8 832DF8FF |CALL musicreg.00404468
004816E5|.8A00 |MOV AL,BYTE PTR DS: ;逐位取ASCII,放到AL中
004816E7|.25 FF000000 |AND EAX,0FF ;EAX与0FFH,作用就是只保留AL的值,EAX前面的值清零
004816EC|.03D8 |ADD EBX,EAX ;EBX=EBX+EAX
004816EE|.81C3 04040000 |ADD EBX,404 ;EBX=EBX+404H,由此可见EBX累加的是最终值
004816F4|.47 |INC EDI ;指针开始指向下一位机器码
004816F5|.4E |DEC ESI ;ESI减一,作为这个循环的判断条件。
004816F6|.^ 75 D2 \JNZ SHORT musicreg.004816CA ;往回跳,直至循环完机器码才不跳。
004816F8|>D1EB SHR EBX,1 ;循环出来EBX=2202H,右移一位,也就是除以2,结果=1101H
004816FA|.81F3 DA870C00 XOR EBX,0C87DA ;EBX与0C87DAH异或,结果=0C96DBH
00481700|.03DB ADD EBX,EBX ;EBX=EBX+EBX=192DB6H
00481702|.81CB 94850C00 OR EBX,0C8594 ;EBX与0C8594H,结果=1DADB6H
00481708|.D1EB SHR EBX,1 ;EBX再右移一位,结果=0EDH6DBH
0048170A|.81C3 BA040000 ADD EBX,4BA ;EBX=EBX+4BAH=0EDB95H
00481710|.81F3 E0E00800 XOR EBX,8E0E0 ;EBX与8E0E0H=63B75H
00481716|.8D55 F0 LEA EDX,DWORD PTR SS: ;EDX指向
00481719|.8BC3 MOV EAX,EBX ;EAX=EBX
0048171B|.E8 B469F8FF CALL musicreg.004080D4 ;跟踪到下面,发现这个CALL就是把EAX的16进制值转成10进制,放到的位置。
00481720|.8B45 F0 MOV EAX,DWORD PTR SS: ;得到10进制值ASCII "408437"设为Str1,它是注册码的组成部分。现在放到EAX中,又开始新的运算。。。
00481723|.33DB XOR EBX,EBX ;以下运算略过,在KeyMake里照抄到00481829地址即可。
00481725|.8A58 05 MOV BL,BYTE PTR DS:
00481728|.8BC3 MOV EAX,EBX
0048172A|.8B55 F0 MOV EDX,DWORD PTR SS:
0048172D|.33C9 XOR ECX,ECX
0048172F|.8A4A 02 MOV CL,BYTE PTR DS:
00481732|.03C1 ADD EAX,ECX
00481734|.03C3 ADD EAX,EBX
00481736|.BE 05000000 MOV ESI,5
0048173B|.99 CDQ
0048173C|.F7FE IDIV ESI
0048173E|.80C2 61 ADD DL,61
00481741|.8855 E6 MOV BYTE PTR SS:,DL ;DL=62 ('b')注册码合成符,放在位置,以下类同。
00481744|.8B45 F0 MOV EAX,DWORD PTR SS:
00481747|.0FB670 01 MOVZX ESI,BYTE PTR DS:
0048174B|.8BC6 MOV EAX,ESI
0048174D|.03C6 ADD EAX,ESI
0048174F|.BF 05000000 MOV EDI,5
00481754|.99 CDQ
00481755|.F7FF IDIV EDI
00481757|.80C2 61 ADD DL,61
0048175A|.8855 E7 MOV BYTE PTR SS:,DL ;DL=62 ('b')-->
0048175D|.8BC3 MOV EAX,EBX
0048175F|.8B55 F0 MOV EDX,DWORD PTR SS:
00481762|.0FB63A MOVZX EDI,BYTE PTR DS:
00481765|.03C7 ADD EAX,EDI
00481767|.51 PUSH ECX
00481768|.B9 05000000 MOV ECX,5
0048176D|.99 CDQ
0048176E|.F7F9 IDIV ECX
00481770|.59 POP ECX
00481771|.80C2 61 ADD DL,61
00481774|.8855 E8 MOV BYTE PTR SS:,DL ;DL=63 ('c')-->
00481777|.8BC7 MOV EAX,EDI
00481779|.8B55 F0 MOV EDX,DWORD PTR SS:
0048177C|.0FB652 04 MOVZX EDX,BYTE PTR DS:
00481780|.03C2 ADD EAX,EDX
00481782|.03C1 ADD EAX,ECX
00481784|.51 PUSH ECX
00481785|.B9 05000000 MOV ECX,5
0048178A|.99 CDQ
0048178B|.F7F9 IDIV ECX
0048178D|.59 POP ECX
0048178E|.80C2 61 ADD DL,61
00481791|.8855 E9 MOV BYTE PTR SS:,DL ;DL=65 ('e')-->
00481794|.8BC1 MOV EAX,ECX
00481796|.03C3 ADD EAX,EBX
00481798|.51 PUSH ECX
00481799|.B9 05000000 MOV ECX,5
0048179E|.99 CDQ
0048179F|.F7F9 IDIV ECX
004817A1|.59 POP ECX
004817A2|.80C2 61 ADD DL,61
004817A5|.8855 EA MOV BYTE PTR SS:,DL ;DL=62 ('b')-->
004817A8|.8BC1 MOV EAX,ECX
004817AA|.03C6 ADD EAX,ESI
004817AC|.8B55 F0 MOV EDX,DWORD PTR SS:
004817AF|.0FB652 05 MOVZX EDX,BYTE PTR DS:
004817B3|.03C2 ADD EAX,EDX
004817B5|.51 PUSH ECX
004817B6|.B9 05000000 MOV ECX,5
004817BB|.99 CDQ
004817BC|.F7F9 IDIV ECX
004817BE|.59 POP ECX
004817BF|.80C2 61 ADD DL,61
004817C2|.8855 EB MOV BYTE PTR SS:,DL ;DL=65 ('e')-->
004817C5|.8BC1 MOV EAX,ECX
004817C7|.8B55 F0 MOV EDX,DWORD PTR SS:
004817CA|.0FB652 04 MOVZX EDX,BYTE PTR DS:
004817CE|.03C2 ADD EAX,EDX
004817D0|.51 PUSH ECX
004817D1|.B9 05000000 MOV ECX,5
004817D6|.99 CDQ
004817D7|.F7F9 IDIV ECX
004817D9|.59 POP ECX
004817DA|.80C2 61 ADD DL,61
004817DD|.8855 EC MOV BYTE PTR SS:,DL ;DL=63 ('c')-->
004817E0|.8BC7 MOV EAX,EDI
004817E2|.03C7 ADD EAX,EDI
004817E4|.8B55 F0 MOV EDX,DWORD PTR SS:
004817E7|.0FB652 02 MOVZX EDX,BYTE PTR DS:
004817EB|.03C2 ADD EAX,EDX
004817ED|.BF 05000000 MOV EDI,5
004817F2|.99 CDQ
004817F3|.F7FF IDIV EDI
004817F5|.80C2 61 ADD DL,61
004817F8|.8855 ED MOV BYTE PTR SS:,DL ;DL=61 ('a')-->
004817FB|.8BC6 MOV EAX,ESI
004817FD|.03C1 ADD EAX,ECX
004817FF|.B9 05000000 MOV ECX,5
00481804|.99 CDQ
00481805|.F7F9 IDIV ECX
00481807|.80C2 61 ADD DL,61
0048180A|.8855 EE MOV BYTE PTR SS:,DL ;DL=65 ('e')-->
0048180D|.8B45 F0 MOV EAX,DWORD PTR SS:
00481810|.0FB640 04 MOVZX EAX,BYTE PTR DS:
00481814|.03C3 ADD EAX,EBX
00481816|.8B55 F0 MOV EDX,DWORD PTR SS:
00481819|.0FB612 MOVZX EDX,BYTE PTR DS:
0048181C|.03C2 ADD EAX,EDX
0048181E|.B9 05000000 MOV ECX,5
00481823|.99 CDQ
00481824|.F7F9 IDIV ECX
00481826|.80C2 61 ADD DL,61
00481829|.8855 EF MOV BYTE PTR SS:,DL ;DL=64 ('d')-->,一共10个字符,设为Str2
0048182C|.8D45 DC LEA EAX,DWORD PTR SS: ;以下代码是将Str2穿插到Str1的过程。
0048182F|.8A55 ED MOV DL,BYTE PTR SS: ;值SS:=61 ('a')
00481832|.E8 5929F8FF CALL musicreg.00404190
00481837|.8B45 DC MOV EAX,DWORD PTR SS:
0048183A|.8D55 F0 LEA EDX,DWORD PTR SS:
0048183D|.B9 01000000 MOV ECX,1 ;所放位置=1
00481842|.E8 092DF8FF CALL musicreg.00404550
00481847|.8D45 D8 LEA EAX,DWORD PTR SS:
0048184A|.8A55 EB MOV DL,BYTE PTR SS: ;值SS:=65 ('e')
0048184D|.E8 3E29F8FF CALL musicreg.00404190
00481852|.8B45 D8 MOV EAX,DWORD PTR SS:
00481855|.8D55 F0 LEA EDX,DWORD PTR SS:
00481858|.B9 02000000 MOV ECX,2 ;所放位置=2
0048185D|.E8 EE2CF8FF CALL musicreg.00404550
00481862|.8D45 D4 LEA EAX,DWORD PTR SS:
00481865|.8A55 EF MOV DL,BYTE PTR SS: ;的值 SS:=64 ('d')
00481868|.E8 2329F8FF CALL musicreg.00404190
0048186D|.8B45 D4 MOV EAX,DWORD PTR SS:
00481870|.8D55 F0 LEA EDX,DWORD PTR SS:
00481873|.B9 04000000 MOV ECX,4 ;所放位置=4,第3位由Str1的第一位组成。大家看堆栈或调试就明白。
00481878|.E8 D32CF8FF CALL musicreg.00404550
0048187D|.8D45 D0 LEA EAX,DWORD PTR SS:
00481880|.8A55 E9 MOV DL,BYTE PTR SS:
00481883|.E8 0829F8FF CALL musicreg.00404190
00481888|.8B45 D0 MOV EAX,DWORD PTR SS:
0048188B|.8D55 F0 LEA EDX,DWORD PTR SS:
0048188E|.B9 06000000 MOV ECX,6
00481893|.E8 B82CF8FF CALL musicreg.00404550
00481898|.8D45 CC LEA EAX,DWORD PTR SS:
0048189B|.8A55 E7 MOV DL,BYTE PTR SS:
0048189E|.E8 ED28F8FF CALL musicreg.00404190
004818A3|.8B45 CC MOV EAX,DWORD PTR SS:
004818A6|.8D55 F0 LEA EDX,DWORD PTR SS:
004818A9|.B9 07000000 MOV ECX,7
004818AE|.E8 9D2CF8FF CALL musicreg.00404550
004818B3|.8D45 C8 LEA EAX,DWORD PTR SS:
004818B6|.8A55 EA MOV DL,BYTE PTR SS:
004818B9|.E8 D228F8FF CALL musicreg.00404190
004818BE|.8B45 C8 MOV EAX,DWORD PTR SS:
004818C1|.8D55 F0 LEA EDX,DWORD PTR SS:
004818C4|.B9 09000000 MOV ECX,9
004818C9|.E8 822CF8FF CALL musicreg.00404550
004818CE|.8D45 C4 LEA EAX,DWORD PTR SS:
004818D1|.8A55 E6 MOV DL,BYTE PTR SS:
004818D4|.E8 B728F8FF CALL musicreg.00404190
004818D9|.8B45 C4 MOV EAX,DWORD PTR SS:
004818DC|.8D55 F0 LEA EDX,DWORD PTR SS:
004818DF|.B9 0A000000 MOV ECX,0A
004818E4|.E8 672CF8FF CALL musicreg.00404550
004818E9|.8D45 C0 LEA EAX,DWORD PTR SS:
004818EC|.8A55 E8 MOV DL,BYTE PTR SS:
004818EF|.E8 9C28F8FF CALL musicreg.00404190
004818F4|.8B45 C0 MOV EAX,DWORD PTR SS:
004818F7|.8D55 F0 LEA EDX,DWORD PTR SS:
004818FA|.B9 0C000000 MOV ECX,0C
004818FF|.E8 4C2CF8FF CALL musicreg.00404550
00481904|.8D45 BC LEA EAX,DWORD PTR SS:
00481907|.8A55 EE MOV DL,BYTE PTR SS:
0048190A|.E8 8128F8FF CALL musicreg.00404190
0048190F|.8B45 BC MOV EAX,DWORD PTR SS:
00481912|.8D55 F0 LEA EDX,DWORD PTR SS:
00481915|.B9 0D000000 MOV ECX,0D
0048191A|.E8 312CF8FF CALL musicreg.00404550
0048191F|.8D45 B8 LEA EAX,DWORD PTR SS:
00481922|.8A55 EC MOV DL,BYTE PTR SS: ;第15位值=
00481925|.E8 6628F8FF CALL musicreg.00404190
0048192A|.8B45 B8 MOV EAX,DWORD PTR SS:
0048192D|.8D55 F0 LEA EDX,DWORD PTR SS:
00481930|.B9 0F000000 MOV ECX,0F ;所放位置=15,第16位由Str1的末位组成,得到ASCII "ae4d0eb8bb4ce3c7",设为Str3。
00481935|.E8 162CF8FF CALL musicreg.00404550
0048193A|.8D55 F0 LEA EDX,DWORD PTR SS:
0048193D|.B9 08000000 MOV ECX,8 ;接下来在Str3中插入一些固定符,ECX=8,即固定符所放位置,后面的字符各后移一位。
00481942|.B8 741A4800 MOV EAX,musicreg.00481A74 ;第1个固定符为S
00481947|.E8 042CF8FF CALL musicreg.00404550
0048194C|.8D55 F0 LEA EDX,DWORD PTR SS: ;从Str3的第8位取符到末位
0048194F|.B9 07000000 MOV ECX,7 ;ECX=7
00481954|.B8 801A4800 MOV EAX,musicreg.00481A80 ;第2个固定符为X
00481959|.E8 F22BF8FF CALL musicreg.00404550
0048195E|.8D55 F0 LEA EDX,DWORD PTR SS:
00481961|.B9 02000000 MOV ECX,2 ;ECX=2
00481966|.B8 8C1A4800 MOV EAX,musicreg.00481A8C ;第3个固定符为5
0048196B|.E8 E02BF8FF CALL musicreg.00404550
00481970|.8D55 F0 LEA EDX,DWORD PTR SS:
00481973|.B9 0C000000 MOV ECX,0C ;ECX=0CH
00481978|.B8 741A4800 MOV EAX,musicreg.00481A74 ;第4个固定符同第1个为S,因为这里的00481A74和上面相同,下面有的也是一样。
0048197D|.E8 CE2BF8FF CALL musicreg.00404550
00481982|.8D55 F0 LEA EDX,DWORD PTR SS:
00481985|.B9 06000000 MOV ECX,6 ;ECX=6
0048198A|.B8 981A4800 MOV EAX,musicreg.00481A98 ;第5个固定符为B
0048198F|.E8 BC2BF8FF CALL musicreg.00404550
00481994|.8D55 F0 LEA EDX,DWORD PTR SS:
00481997|.B9 05000000 MOV ECX,5 ;ECX=5
0048199C|.B8 A41A4800 MOV EAX,musicreg.00481AA4 ;第6个固定符为-
004819A1|.E8 AA2BF8FF CALL musicreg.00404550
004819A6|.8D55 F0 LEA EDX,DWORD PTR SS:
004819A9|.B9 0A000000 MOV ECX,0A ;ECX=0AH
004819AE|.B8 A41A4800 MOV EAX,musicreg.00481AA4 ;同第6个
004819B3|.E8 982BF8FF CALL musicreg.00404550
004819B8|.8D55 F0 LEA EDX,DWORD PTR SS:
004819BB|.B9 0F000000 MOV ECX,0F ;ECX=0FH
004819C0|.B8 A41A4800 MOV EAX,musicreg.00481AA4 ;同第6个
004819C5|.E8 862BF8FF CALL musicreg.00404550
004819CA|.8D55 F0 LEA EDX,DWORD PTR SS:
004819CD|.B9 12000000 MOV ECX,12 ;ECX=12H
004819D2|.B8 A41A4800 MOV EAX,musicreg.00481AA4 ;同第6个
004819D7|.E8 742BF8FF CALL musicreg.00404550
004819DC|.8D55 F0 LEA EDX,DWORD PTR SS:
004819DF|.B9 14000000 MOV ECX,14 ;ECX=14H
004819E4|.B8 A41A4800 MOV EAX,musicreg.00481AA4 ;同第6个
004819E9|.E8 622BF8FF CALL musicreg.00404550
004819EE|.8D55 B4 LEA EDX,DWORD PTR SS:
004819F1|.8B45 F0 MOV EAX,DWORD PTR SS: ;=小写的真码ASCII "a5e4-dB0e-XbS8-Sb-b-4ce3c7"
004819F4|.E8 CB64F8FF CALL musicreg.00407EC4
004819F9|.8B55 B4 MOV EDX,DWORD PTR SS: ;转大写:堆栈 SS:=00A6804C, (ASCII "A5E4-DB0E-XBS8-SB-B-4CE3C7")
004819FC|.8B45 F8 MOV EAX,DWORD PTR SS: ;假码!接下来会发生什么事,相信大家都会预料!
004819FF|.E8 B029F8FF CALL musicreg.004043B4 ;比较CALL
00481A04|.75 29 JNZ SHORT musicreg.00481A2F ;注册失败,跳!
00481A06|.B3 01 MOV BL,1 ;如果注册码相等,设BL的标志位为1
00481A08|.B8 E45C4800 MOV EAX,musicreg.00485CE4
00481A0D|.8B55 F4 MOV EDX,DWORD PTR SS:
00481A10|.E8 E725F8FF CALL musicreg.00403FFC
00481A15|.8D55 B0 LEA EDX,DWORD PTR SS:
00481A18|.8B45 F0 MOV EAX,DWORD PTR SS:
00481A1B|.E8 A464F8FF CALL musicreg.00407EC4
00481A20|.8B55 B0 MOV EDX,DWORD PTR SS:
00481A23|.B8 E85C4800 MOV EAX,musicreg.00485CE8
00481A28|.E8 CF25F8FF CALL musicreg.00403FFC
00481A2D|.EB 02 JMP SHORT musicreg.00481A31
00481A2F|>33DB XOR EBX,EBX ;注册失败跳来这,EBX标志为0
------------------------------------------------------------------------
------------------------------------------------------------------------
【破解总结】
简单算法流程以下:
1、将机器码经一系列运算后,得10进制的字符,设为Str1。
2、将Str1再次运算得到Str2。
3、将Str2插入到Str1中,组成一组字符,设为Str3。
4、将Str3各处插入预设符,转成大写即成注册码。
【注册机编写】
KeyMake算法注册机编写以下:
数据段:
szHomePage db "https://www.chinapyg.com/",0
szEmail db "mailto:[email protected]",0
szErrMessdb "输入的序列号不正确!",0
szTemp dd 0
szXor db "%lu",0
szCode db 26 dup (0) ;szCode存放注册码
;KeyGener WildCatIII 20090918
;引用请保持完整性,谢谢!
----------------------------------------
代码段:
MOV ,EAX ;机器码(ZXB-0001)放到,模仿00481689
MOV EDX,;再把它放到EDX,模仿004816AF
invoke lstrlen,edx;计算机器码位数,返回值放在EAX
MOV ESI,EAX ;ESI存放机器码位数,模仿004816BF
XOR EBX,EBX ;EBX清零,为下面做准备
MOV EDI,1 ;计数器初始为1
AT004816CA: ;循环开始,我习惯在地址004816CA前面加AT,方便使用
MOV EAX, ;机器码
MOV AL,BYTE PTR DS:;逐位取ASCII到AL
AND EAX,0FFH ;汇编语言16进制表达法,末位加H;英文开头,前面再补0
ADD EBX,EAX
ADD EBX,404H
INC EDI
DEC ESI
JNZ AT004816CA ;循环
SHR EBX,1
XOR EBX,0C87DAH
ADD EBX,EBX
OR EBX,0C8594H
SHR EBX,1
ADD EBX,4BAH
XOR EBX,8E0E0H
MOV EAX,EBX ;运算结果16进制放在EBX,放到EAX中,
PUSH EAX ;以下代码转成10进制ASCII码
LEA EAX,szXor ;"%lu"长的无符号十进制整数值,见KeyMake使用说明,以下引用
; 数据格式化选项:%d,%i 有符号十进制数值
; %ld,%li 长的有符号十进制整数值
; %u 无符号十进制整数值
; %lu 长的无符号十进制整数值
; %x,%X 十六进制整数值,%x输出小写,%X输出大写
; %lx,%lX 长的十六进制整数值,%lx输出小写,%lX输出大写
; # 0x字符串的前缀数据,一般在显示十六进制值时使用
PUSH EAX
LEA EAX,szTemp
PUSH EAX
CALL wsprintf
LEA EAX,szTemp ; 最终出来的10进制字符
MOV DWORD PTR SS:,EAX ;暂放10进制数 ASCII "408437"
;以下仿抄00481723-0048182C段
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
XOR EBX,EBX
MOV BL,BYTE PTR DS:
MOV EAX,EBX
mov EDX,DWORD PTR SS:
XOR ECX,ECX
MOV CL,BYTE PTR DS:
ADD EAX,ECX
ADD EAX,EBX
MOV ESI,5
CDQ
IDIV ESI
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=62 ('b')
MOV EAX,DWORD PTR SS:
MOVZX ESI,BYTE PTR DS:
MOV EAX,ESI
ADD EAX,ESI
MOV EDI,5
CDQ
IDIV EDI
ADD DL,61h
MOV BYTE PTR SS:,DL
MOV EAX,EBX
MOV EDX,DWORD PTR SS:
MOVZX EDI,BYTE PTR DS:
ADD EAX,EDI
PUSH ECX
MOV ECX,5
CDQ
IDIV ECX
POP ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=63 ('c')
MOV EAX,EDI
MOV EDX,DWORD PTR SS:
MOVZX EDX,BYTE PTR DS:
ADD EAX,EDX
ADD EAX,ECX
PUSH ECX
MOV ECX,5
CDQ
IDIV ECX
POP ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=65 ('e')
MOV EAX,ECX
ADD EAX,EBX
PUSH ECX
MOV ECX,5
CDQ
IDIV ECX
POP ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=62 ('b')
MOV EAX,ECX
ADD EAX,ESI
MOV EDX,DWORD PTR SS:
MOVZX EDX,BYTE PTR DS:
ADD EAX,EDX
PUSH ECX
MOV ECX,5
CDQ
IDIV ECX
POP ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=65 ('e')
MOV EAX,ECX
MOV EDX,DWORD PTR SS:
MOVZX EDX,BYTE PTR DS:
ADD EAX,EDX
PUSH ECX
MOV ECX,5
CDQ
IDIV ECX
POP ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=63 ('c')
MOV EAX,EDI
ADD EAX,EDI
MOV EDX,DWORD PTR SS:
MOVZX EDX,BYTE PTR DS:
ADD EAX,EDX
MOV EDI,5
CDQ
IDIV EDI
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=61 ('a')
MOV EAX,ESI
ADD EAX,ECX
MOV ECX,5
CDQ
IDIV ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=65 ('e')
MOV EAX,DWORD PTR SS:
MOVZX EAX,BYTE PTR DS:
ADD EAX,EBX
MOV EDX,DWORD PTR SS:
MOVZX EDX,BYTE PTR DS:
ADD EAX,EDX
MOV ECX,5
CDQ
IDIV ECX
ADD DL,61h
MOV BYTE PTR SS:,DL ;DL=64 ('d')
LEA EAX,DWORD PTR SS:
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MOV ECX,1
MOV DL,BYTE PTR SS: ;开始组合注册码
MOV BYTE PTR ,DL ;第1位
INC CL ;按最终注册码的顺序,与源码有别
MOV DL,'5' ;
MOV BYTE PTR ,DL ;
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV EAX,DWORD PTR SS:
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
INC CL
MOV DL,'-'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,'B'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,'-'
MOV BYTE PTR ,DL
INC CL
MOV DL,'X'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,'S'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
INC CL
MOV DL,'-'
MOV BYTE PTR ,DL
INC CL
MOV DL, 'S'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,'-'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,'-'
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR SS:
MOV BYTE PTR ,DL
INC CL
MOV DL,BYTE PTR
MOV BYTE PTR ,DL
LEA EDX,szCode ;注册码(小写),放EDX,接着转成大写
invoke lstrlen,EDX
XOR EBX,EBX
DEC EDX
MOV ESI,1 ;初始ESI=1
MOV EDI,EAX ;位数放EDI
UCASE:
MOV BL,BYTE PTR
CMP BL,61H ;'a'
JB NoChange
CMP BL,7AH ;'z'
JG NoChange
SUB BL,20H
NoChange:
MOV BYTE PTR ,BL
INC ESI
DEC EDI
JNZ UCASE
XOR EAX,EAX
LEA EAX,szCode;
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流,转载请注明作者并保持文章的完整, 谢谢!
[ 本帖最后由 野猫III 于 2009-10-21 16:31 编辑 ] 终于再次见到猫哥大作了 强悍,还可以优化~ 很有内容的教程,
帅啊~~~ 原帖由 飘云 于 2009-10-4 10:37 发表 https://www.chinapyg.com/images/common/back.gif
强悍,还可以优化~
/:001 谢谢老大指导!可以将固定符预定义,然后再分别添加上运算后的的Str1及Str2。 转大写可以借助API函数的/:017 过来看NX的东西 不错不错~就是代码量稍大了点~ 原帖由 tianxj 于 2009-10-8 11:35 发表 https://www.chinapyg.com/images/common/back.gif
转大写可以借助API函数的/:017
正需要这些内容,分享下。。。呵呵。
页:
[1]
2