【文章标题】: MIDI to MP3 Maker V3.1算法分析
【文章作者】: 网游难民
【作者主页】: http://bbs.chinapyg.com/index.php
【软件名称】: MIDI to MP3 Maker V3.1
【软件大小】: 398 KB
【下载地址】: http://www3.skycn.com/soft/25150.html
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: PEID,OD
【操作平台】: XP SP2
【软件介绍】: 将文件目录结构或CD/DVD节目列表显示、输出为TXT文
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  OD载入,搜索字符串下断,开始分析~~~
  
  00406EA3   .  55            PUSH EBP
  00406EA4   .  56            PUSH ESI
  00406EA5   .  57            PUSH EDI
  00406EA6   .  BF 01000000   MOV EDI,1
  00406EAB   .  57            PUSH EDI
  00406EAC   .  8BF1          MOV ESI,ECX
  00406EAE   .  E8 F3BC0100   CALL midi2mp3.00422BA6
  00406EB3   .  8B86 B4010000 MOV EAX,DWORD PTR DS:[ESI+1B4]     ;  用户名放入EAX中~~
  00406EB9   .  8B68 F4       MOV EBP,DWORD PTR DS:[EAX-C]       ;  用户名位数放在EBP中~
  00406EBC   .  83FD 02       CMP EBP,2                          ;  用户名位数要大于2~
  00406EBF   .  7D 15         JGE SHORT midi2mp3.00406ED6
  00406EC1   .  6A 00         PUSH 0
  00406EC3   .  6A 00         PUSH 0
  00406EC5   .  68 7C074300   PUSH midi2mp3.0043077C             ;  please input correct user name!
  00406ECA   .  E8 C4180200   CALL midi2mp3.00428793
  00406ECF   .  5F            POP EDI
  00406ED0   .  5E            POP ESI
  00406ED1   .  5D            POP EBP
  00406ED2   .  83C4 0C       ADD ESP,0C
  00406ED5   .  C3            RETN
  00406ED6   >  8B8E B8010000 MOV ECX,DWORD PTR DS:[ESI+1B8]     ;  注册码放在ECX中~~
  00406EDC   .  8379 F4 08    CMP DWORD PTR DS:[ECX-C],8         ;  注册码位数要大于8
  00406EE0   .  7D 15         JGE SHORT midi2mp3.00406EF7
  00406EE2   .  6A 00         PUSH 0
  00406EE4   .  6A 00         PUSH 0
  00406EE6   .  68 54074300   PUSH midi2mp3.00430754             ;  please input correct registration code!
  00406EEB   .  E8 A3180200   CALL midi2mp3.00428793
  00406EF0   .  5F            POP EDI
  00406EF1   .  5E            POP ESI
  00406EF2   .  5D            POP EBP
  00406EF3   .  83C4 0C       ADD ESP,0C
  00406EF6   .  C3            RETN
  00406EF7   >  8B86 B4010000 MOV EAX,DWORD PTR DS:[ESI+1B4]
  00406EFD   .  8B48 F4       MOV ECX,DWORD PTR DS:[EAX-C]
  00406F00   .  85C9          TEST ECX,ECX
  00406F02   .  7D 0A         JGE SHORT midi2mp3.00406F0E
  00406F04   .  68 57000780   PUSH 80070057
  00406F09   .  E8 82A6FFFF   CALL midi2mp3.00401590
  00406F0E   >  8A10          MOV DL,BYTE PTR DS:[EAX]           ;  用户名第一位ASCII码
  00406F10   .  8B86 B4010000 MOV EAX,DWORD PTR DS:[ESI+1B4]
  00406F16   .  3978 F4       CMP DWORD PTR DS:[EAX-C],EDI
  00406F19   .  7D 0A         JGE SHORT midi2mp3.00406F25
  00406F1B   .  68 57000780   PUSH 80070057
  00406F20   .  E8 6BA6FFFF   CALL midi2mp3.00401590
  00406F25   >  8A40 01       MOV AL,BYTE PTR DS:[EAX+1]         ;  用户名第二位ASCII码
  00406F28   .  884424 0E     MOV BYTE PTR SS:[ESP+E],AL
  00406F2C   .  8B86 B4010000 MOV EAX,DWORD PTR DS:[ESI+1B4]
  00406F32   .  8B48 F4       MOV ECX,DWORD PTR DS:[EAX-C]
  00406F35   .  85C9          TEST ECX,ECX
  00406F37   .  7D 0A         JGE SHORT midi2mp3.00406F43
  00406F39   .  68 57000780   PUSH 80070057
  00406F3E   .  E8 4DA6FFFF   CALL midi2mp3.00401590
  00406F43   >  8B8E B4010000 MOV ECX,DWORD PTR DS:[ESI+1B4]
  00406F49   .  53            PUSH EBX
  00406F4A   .  8A18          MOV BL,BYTE PTR DS:[EAX]           ;  用户名第一位ASCII码放在BL中~
  00406F4C   .  3979 F4       CMP DWORD PTR DS:[ECX-C],EDI
  00406F4F   .  7D 0A         JGE SHORT midi2mp3.00406F5B
  00406F51   .  68 57000780   PUSH 80070057
  00406F56   .  E8 35A6FFFF   CALL midi2mp3.00401590
  00406F5B   >  0FB6C2        MOVZX EAX,DL
  00406F5E   .  83C8 4D       OR EAX,4D                          ;  用户名第一位ASCII码与4D逻辑或运算~,结果记为A
  00406F61   .  99            CDQ
  00406F62   .  BF 0A000000   MOV EDI,0A
  00406F67   .  F7FF          IDIV EDI                           ;  A除EDI中的值,即0A,余数记为a。
  00406F69   .  0FB64424 12   MOVZX EAX,BYTE PTR SS:[ESP+12]     ;  用户名第二位ASCII码
  00406F6E   .  83C8 44       OR EAX,44                          ;  用户名第一位ASCII码与44逻辑或运算~,结果记为B
  00406F71   .  885424 16     MOV BYTE PTR SS:[ESP+16],DL        ;  a储存在SS:[ESP+16]中~~~
  00406F75   .  99            CDQ
  00406F76   .  F7FF          IDIV EDI                           ;  B除0A,余数记为b;
  00406F78   .  0FB6C3        MOVZX EAX,BL                       ;  用户名第一位ASCII码放在EAX中~
  00406F7B   .  83C8 32       OR EAX,32                          ;  用户名第一位ASCII码与32进行逻辑或运算,结果记为C~
  00406F7E      885424 12     MOV BYTE PTR SS:[ESP+12],DL        ;  b储存在SS:[ESP+12]中~~
  00406F82   .  99            CDQ
  00406F83   .  F7FF          IDIV EDI                           ;  C除以0A,余数记为c~
  00406F85   .  0FB641 01     MOVZX EAX,BYTE PTR DS:[ECX+1]      ;  用户名第二位ASCII码放在EAX中~
  00406F89   .  83C8 4D       OR EAX,4D                          ;  用户名第二位ASCII码与4D进行逻辑或运算~结果记为D~~
  00406F8C   .  8BCF          MOV ECX,EDI
  00406F8E      885424 17     MOV BYTE PTR SS:[ESP+17],DL        ;  c保存在SS:[ESP+17]中~~
  00406F92   .  99            CDQ
  00406F93   .  F7F9          IDIV ECX                           ;  D除以0A,余数记为d~
  00406F95   .  33C0          XOR EAX,EAX
  00406F97   .  33C9          XOR ECX,ECX
  00406F99   .  85ED          TEST EBP,EBP
  00406F9B   .  885424 18     MOV BYTE PTR SS:[ESP+18],DL        ;  d保存在SS:[ESP+18]中~~
  00406F9F   .  7E 22         JLE SHORT midi2mp3.00406FC3
  00406FA1   >  85C9          TEST ECX,ECX
  00406FA3   .  0F8C ED000000 JL midi2mp3.00407096
  00406FA9   .  8BBE B4010000 MOV EDI,DWORD PTR DS:[ESI+1B4]
  00406FAF   .  3B4F F4       CMP ECX,DWORD PTR DS:[EDI-C]
  00406FB2   .  0F8F DE000000 JG midi2mp3.00407096
  00406FB8   .  0FB6140F      MOVZX EDX,BYTE PTR DS:[EDI+ECX]
  00406FBC   .  03C2          ADD EAX,EDX
  00406FBE   .  41            INC ECX
  00406FBF   .  3BCD          CMP ECX,EBP
  00406FC1   .^ 7C DE         JL SHORT midi2mp3.00406FA1         ;  循环,求注册名的ASCII累加和~结果记为E~~
  00406FC3   >  8B8E B8010000 MOV ECX,DWORD PTR DS:[ESI+1B8]
  00406FC9   .  8B51 F4       MOV EDX,DWORD PTR DS:[ECX-C]
  00406FCC   .  85D2          TEST EDX,EDX
  00406FCE   .  7D 0A         JGE SHORT midi2mp3.00406FDA
  00406FD0   .  68 57000780   PUSH 80070057
  00406FD5   .  E8 B6A5FFFF   CALL midi2mp3.00401590
  00406FDA   >  8A11          MOV DL,BYTE PTR DS:[ECX]           ;  注册码第一位ASCII码放在DL中~
  00406FDC   .  8B8E B8010000 MOV ECX,DWORD PTR DS:[ESI+1B8]
  00406FE2   .  8379 F4 01    CMP DWORD PTR DS:[ECX-C],1
  00406FE6   .  885424 19     MOV BYTE PTR SS:[ESP+19],DL        ;  注册码第一位ASCII码放在SS:[ESP+19]中~
  00406FEA   .  7D 0A         JGE SHORT midi2mp3.00406FF6
  00406FEC   .  68 57000780   PUSH 80070057
  00406FF1   .  E8 9AA5FFFF   CALL midi2mp3.00401590
  00406FF6   >  8A49 01       MOV CL,BYTE PTR DS:[ECX+1]         ;  注册码第二位ASCII码放在CL中~
  00406FF9   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  00406FFF      884C24 13     MOV BYTE PTR SS:[ESP+13],CL        ;  注册码第二位ASCII码放在SS:[ESP+13]中~
  00407003   .  837F F4 02    CMP DWORD PTR DS:[EDI-C],2
  00407007   .  7D 0A         JGE SHORT midi2mp3.00407013
  00407009   .  68 57000780   PUSH 80070057
  0040700E   .  E8 7DA5FFFF   CALL midi2mp3.00401590
  00407013   >  8A4F 02       MOV CL,BYTE PTR DS:[EDI+2]         ;  注册码第三位ASCII码放在CL中~
  00407016   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  0040701C   .  884C24 14     MOV BYTE PTR SS:[ESP+14],CL        ;  注册码第三位ASCII码放在SS:[ESP+14]中~
  00407020   .  837F F4 03    CMP DWORD PTR DS:[EDI-C],3
  00407024   .  7D 0A         JGE SHORT midi2mp3.00407030
  00407026   .  68 57000780   PUSH 80070057
  0040702B   .  E8 60A5FFFF   CALL midi2mp3.00401590
  00407030   >  8A4F 03       MOV CL,BYTE PTR DS:[EDI+3]         ;  注册码第四位ASCII码放在CL中~
  00407033   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  00407039   .  884C24 15     MOV BYTE PTR SS:[ESP+15],CL        ;  注册码第四位ASCII码放在SS:[ESP+15]中~
  0040703D   .  837F F4 04    CMP DWORD PTR DS:[EDI-C],4
  00407041   .  7D 0A         JGE SHORT midi2mp3.0040704D
  00407043   .  68 57000780   PUSH 80070057
  00407048   .  E8 43A5FFFF   CALL midi2mp3.00401590
  0040704D   >  8A4F 04       MOV CL,BYTE PTR DS:[EDI+4]         ;  注册码第五位ASCII码放在CL中~
  00407050   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  00407056   .  837F F4 05    CMP DWORD PTR DS:[EDI-C],5
  0040705A   .  7D 0A         JGE SHORT midi2mp3.00407066
  0040705C   .  68 57000780   PUSH 80070057
  00407061   .  E8 2AA5FFFF   CALL midi2mp3.00401590
  00407066   >  8A5F 05       MOV BL,BYTE PTR DS:[EDI+5]         ;  注册码第六位ASCII码放在BL中~
  00407069   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  0040706F   .  885C24 1A     MOV BYTE PTR SS:[ESP+1A],BL        ;  注册码第六位ASCII码放在SS:[ESP+1A]中~~
  00407073   .  837F F4 06    CMP DWORD PTR DS:[EDI-C],6
  00407077   .  7D 0A         JGE SHORT midi2mp3.00407083
  00407079   .  68 57000780   PUSH 80070057
  0040707E   .  E8 0DA5FFFF   CALL midi2mp3.00401590
  00407083   >  8A5F 06       MOV BL,BYTE PTR DS:[EDI+6]         ;  注册码第七位ASCII码放在BL中~
  00407086   .  8BBE B8010000 MOV EDI,DWORD PTR DS:[ESI+1B8]
  0040708C   .  885C24 1B     MOV BYTE PTR SS:[ESP+1B],BL        ;  注册码第七位ASCII码放在SS:[ESP+1B]中~
  00407090   .  837F F4 07    CMP DWORD PTR DS:[EDI-C],7
  00407094   .  7D 0A         JGE SHORT midi2mp3.004070A0
  00407096   >  68 57000780   PUSH 80070057
  0040709B   .  E8 F0A4FFFF   CALL midi2mp3.00401590
  004070A0   >  8A5F 07       MOV BL,BYTE PTR DS:[EDI+7]         ;  注册码第八位ASCII码放在BL中~
  004070A3   .  0FB67C24 16   MOVZX EDI,BYTE PTR SS:[ESP+16]     ;  a放在EDI中~~
  004070A8   .  0FB6D2        MOVZX EDX,DL
  004070AB   .  83EA 30       SUB EDX,30
  004070AE   .  3BFA          CMP EDI,EDX                        ;  注册码第一位和a比较,
  004070B0   .  75 48         JNZ SHORT midi2mp3.004070FA        ;  不相等就跳向通用注册码校验~
  004070B2   .  0FB65424 13   MOVZX EDX,BYTE PTR SS:[ESP+13]     ;  注册码第二位放在EDX中~~
  004070B7   .  0FB67C24 12   MOVZX EDI,BYTE PTR SS:[ESP+12]     ;  b放在EDI中~~
  004070BC   .  83EA 30       SUB EDX,30
  004070BF   .  3BFA          CMP EDI,EDX                        ;  b和第二位注册码比较
  004070C1   .  75 37         JNZ SHORT midi2mp3.004070FA        ;  不相等就跳向通用注册码校验~
  004070C3   .  0FB65424 14   MOVZX EDX,BYTE PTR SS:[ESP+14]     ;  注册码第三位放在EDX中~~
  004070C8   .  0FB67C24 17   MOVZX EDI,BYTE PTR SS:[ESP+17]     ;  c放在EDI中~~
  004070CD   .  83EA 30       SUB EDX,30
  004070D0   .  3BFA          CMP EDI,EDX                        ;  c和第三位注册码比较
  004070D2   .  75 26         JNZ SHORT midi2mp3.004070FA        ;  不相等就跳向通用注册码校验~
  004070D4   .  0FB65424 15   MOVZX EDX,BYTE PTR SS:[ESP+15]     ;  注册码第四位放在EDX中~~
  004070D9   .  0FB67C24 18   MOVZX EDI,BYTE PTR SS:[ESP+18]     ;  d放在EDI中~~
  004070DE   .  83EA 30       SUB EDX,30
  004070E1   .  3BFA          CMP EDI,EDX                        ;  d和第四位注册码比较
  004070E3   .  75 15         JNZ SHORT midi2mp3.004070FA        ;  不相等就跳向通用注册码校验~
  004070E5   .  99            CDQ                                ;  扩展指令~
  004070E6   .  BF 0A000000   MOV EDI,0A
  004070EB   .  F7FF          IDIV EDI                           ;  E(注册名ASCII码之和)除0A,余数记位e~~
  004070ED   .  0FB6C2        MOVZX EAX,DL
  004070F0   .  0FB6D1        MOVZX EDX,CL
  004070F3   .  83EA 30       SUB EDX,30
  004070F6   .  3BC2          CMP EAX,EDX                        ;  e和注册码第五位比较
  004070F8   .  74 3C         JE SHORT midi2mp3.00407136         ;  不相等就校验通用注册码~
  004070FA   >  8A5424 19     MOV DL,BYTE PTR SS:[ESP+19]        ;  注册码第一位放在DL中~~
  004070FE   .  B0 33         MOV AL,33
  00407100   .  3AD0          CMP DL,AL                          ;  注册码第一位ASCII码和33比较~
  00407102   .  0F85 8A000000 JNZ midi2mp3.00407192              ;  不相等就跳向错误提示
  00407108   .  384424 13     CMP BYTE PTR SS:[ESP+13],AL        ;  注册码第二位ASCII码和33比较~
  0040710C   .  0F85 80000000 JNZ midi2mp3.00407192              ;  不相等就跳向错误提示
  00407112   .  384424 14     CMP BYTE PTR SS:[ESP+14],AL        ;  注册码第三位ASCII码和33比较~
  00407116   .  75 7A         JNZ SHORT midi2mp3.00407192        ;  不相等就跳向错误提示
  00407118   .  807C24 15 36  CMP BYTE PTR SS:[ESP+15],36        ;  注册码第四位ASCII码和36比较~
  0040711D   .  75 73         JNZ SHORT midi2mp3.00407192
  0040711F   .  80F9 36       CMP CL,36                          ;  注册码第五位ASCII码和36比较~
  00407122   .  75 6E         JNZ SHORT midi2mp3.00407192        ;  不相等就跳向错误提示
  00407124   .  807C24 1A 31  CMP BYTE PTR SS:[ESP+1A],31        ;  注册码第六位ASCII码和31比较~
  00407129   .  75 67         JNZ SHORT midi2mp3.00407192        ;  不相等就跳向错误提示
  0040712B   .  807C24 1B 34  CMP BYTE PTR SS:[ESP+1B],34        ;  注册码第七位ASCII码和34比较~
  00407130   .  75 60         JNZ SHORT midi2mp3.00407192        ;  不相等就跳向错误提示
  00407132   .  3AD9          CMP BL,CL                          ;  注册码第八位ASCII码和36比较~
  00407134   .  75 5C         JNZ SHORT midi2mp3.00407192        ;  不相等就跳向错误提示
  00407136   >  6A 00         PUSH 0
  00407138   .  6A 00         PUSH 0
  0040713A   .  68 38074300   PUSH midi2mp3.00430738             ;  registration has succeeded!
  0040713F   .  E8 4F160200   CALL midi2mp3.00428793
  00407144   .  8BBE B4010000 MOV EDI,DWORD PTR DS:[ESI+1B4]
  0040714A   .  E8 9D2D0200   CALL midi2mp3.00429EEC
  0040714F   .  8B40 04       MOV EAX,DWORD PTR DS:[EAX+4]
  00407152   .  57            PUSH EDI                           ; /Arg3
  
  
--------------------------------------------------------------------------------
【经验总结】
  注册名要大于2,注册码要大于8~
  第一位注册码必须是用户名第一位ASCII码与4D逻辑或运算除0A的余数。
  第二位注册码必须是用户名第一位ASCII码与44逻辑或运算除0A的余数/
  第三位注册码必须是用户名第一位ASCII码与32逻辑或运算除0A的余数。
  第四位注册码必须是用户名第二位ASCII码与4D逻辑或运算除0A的余数。
  第五位注册码必须是用户名ASCII码之和除0A的余数。
  或者是通用注册码:
  33366146
  
--------------------------------------------------------------------------------
【版权声明】: 本菜鸟初学算法, 转载请注明作者并保持文章的完整, 谢谢!