野猫III 发表于 2009-10-3 19:44:36

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-3 20:18:24

终于再次见到猫哥大作了

飘云 发表于 2009-10-4 10:37:13

强悍,还可以优化~

HDd1145 发表于 2009-10-4 10:39:05

zenix 发表于 2009-10-4 11:43:03

很有内容的教程,
帅啊~~~

野猫III 发表于 2009-10-4 13:33:46

原帖由 飘云 于 2009-10-4 10:37 发表 https://www.chinapyg.com/images/common/back.gif
强悍,还可以优化~

/:001 谢谢老大指导!可以将固定符预定义,然后再分别添加上运算后的的Str1及Str2。

tianxj 发表于 2009-10-8 11:35:49

转大写可以借助API函数的/:017

hj2008mt 发表于 2009-10-10 00:56:11

过来看NX的东西

小试锋芒 发表于 2009-10-10 15:16:48

不错不错~就是代码量稍大了点~

野猫III 发表于 2009-10-10 22:15:46

原帖由 tianxj 于 2009-10-8 11:35 发表 https://www.chinapyg.com/images/common/back.gif
转大写可以借助API函数的/:017

正需要这些内容,分享下。。。呵呵。
页: [1] 2
查看完整版本: KeyMake编写算法注册机学习之〖KeyGen For 钢琴曲大全 1.03〗