【破文标题】Wave Corrector 3.3算法分析(PYG、DCG、OCN、D.4S)
【破文作者】学习破解   (wxh9833)
【作者邮箱】
【作者主页】
【破解工具】PEiD,OD
【破解平台】Windows 2K&XP
【软件名称】Wave Corrector 3.3
【软件大小】978KB
【原版下载】http://86516.onlinedown.net/soft/19853.htm
【保护方式】注册码
【软件简介】可以将录音文件保存为WAV格式。然后,Wave Corrector会显示一张音频曲线图,里面会显示原始声音曲线和经过修正后的声音曲线。你可以放大曲线图来添加或者删除修正。
【更新时间】:2006-10-4 10:26:58
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
------------------------------------------------------------------------
1、PEiD查壳,无壳,Microsoft Visual C++ 7.0写的。
2、运行软件。看一看有没有提示。有注册失败的提示,这里是入手点。
3、OD载入。断在这里。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

0041360B   .  8D73 FF       LEA ESI,DWORD PTR DS:[EBX-1]             ;  很容易找到这里下断,出现我们输入的试练码!
0041360E   .  33C0          XOR EAX,EAX                              ;  清空EAX。
00413610   .  33C9          XOR ECX,ECX                              ;  清空ECX准备运算
00413612   .  85F6          TEST ESI,ESI
00413614   .  C68424 A00000>MOV BYTE PTR SS:[ESP+A0],1
0041361C   .  7E 1D         JLE SHORT WaveCor.0041363B
0041361E   .  8BFF          MOV EDI,EDI
00413620   >  85C9          TEST ECX,ECX
00413622   .  0F8C CA000000 JL WaveCor.004136F2
00413628   .  3BCB          CMP ECX,EBX
0041362A   .  0F8F C2000000 JG WaveCor.004136F2
00413630   .  0FBE3C11      MOVSX EDI,BYTE PTR DS:[ECX+EDX]          ;  取每一位的试练码!
00413634   .  03C7          ADD EAX,EDI                              ;  这里是把7位的练码累加!
00413636   .  41            INC ECX
00413637   .  3BCE          CMP ECX,ESI                              ;  与7比较。
00413639   .^ 7C E5         JL SHORT WaveCor.00413620
0041363B   >  99            CDQ
0041363C   .  B9 1A000000   MOV ECX,1A                               ;  把1A放到ECX中。
00413641   .  F7F9          IDIV ECX                                 ;  用前7位的累加值除1A
00413643   .  8BCD          MOV ECX,EBP
00413645   .  8BFA          MOV EDI,EDX
00413647   .  83C7 41       ADD EDI,41                               ;  把41放到EDI中。
0041364A   .  E8 31FBFFFF   CALL WaveCor.00413180                    ;  关键CALL跟进。
0041364F   .  8B95 C0000000 MOV EDX,DWORD PTR SS:[EBP+C0]
00413655   .  8982 FC000000 MOV DWORD PTR DS:[EDX+FC],EAX
0041365B   .  8B85 C0000000 MOV EAX,DWORD PTR SS:[EBP+C0]
00413661   .  8B88 FC000000 MOV ECX,DWORD PTR DS:[EAX+FC]
00413667   .  85C9          TEST ECX,ECX
00413669   .  74 21         JE SHORT WaveCor.0041368C                ;  这里看不等继续,否则死。
0041366B   .  83FB 08       CMP EBX,8                                ;  EBX与8比较。也就是用户名的位数。
0041366E   .  0F84 88000000 JE WaveCor.004136FC                      ;  这里相等就跳向注册成功。
00413674   .  85F6          TEST ESI,ESI
00413676   .  7C 7A         JL SHORT WaveCor.004136F2                ;  比较。跳向成功。
00413678   .  8B8424 900000>MOV EAX,DWORD PTR SS:[ESP+90]
0041367F   .  3B70 F4       CMP ESI,DWORD PTR DS:[EAX-C]
00413682   .  7F 6E         JG SHORT WaveCor.004136F2
00413684   .  0FBE0C06      MOVSX ECX,BYTE PTR DS:[ESI+EAX]
00413688   .  3BF9          CMP EDI,ECX
0041368A   .  74 70         JE SHORT WaveCor.004136FC
0041368C   >  68 84284B00   PUSH WaveCor.004B2884                    ; /Arg3 = 004B2884
00413691   .  68 70504B00   PUSH WaveCor.004B5070                    ; |Arg2 = 004B5070 ASCII "UserName"
00413696   .  68 54304B00   PUSH WaveCor.004B3054                    ; |Arg1 = 004B3054 ASCII "Settings"
0041369B   .  8BCD          MOV ECX,EBP                              ; |
0041369D   .  E8 9A490800   CALL WaveCor.0049803C                    ; \WaveCor.0049803C
004136A2   .  6A 00         PUSH 0
004136A4   .  6A 00         PUSH 0
004136A6   .  68 C8524B00   PUSH WaveCor.004B52C8                    ;  you user name or key is invalid. try again.
004136AB   .  E8 86480800   CALL WaveCor.00497F36                    ;  这里是注册失败报错的地方。
004136B0   .  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
004136B4   .  83C0 F0       ADD EAX,-10
004136B7   .  C68424 A00000>MOV BYTE PTR SS:[ESP+A0],0
004136BF   .  8D50 0C       LEA EDX,DWORD PTR DS:[EAX+C]
004136C2   .  83C9 FF       OR ECX,FFFFFFFF
004136C5   .  F0:0FC10A     LOCK XADD DWORD PTR DS:[EDX],ECX         ;  锁定前缀
004136C9   .  49            DEC ECX
004136CA   .  85C9          TEST ECX,ECX
004136CC   .  7F 08         JG SHORT WaveCor.004136D6
004136CE   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
004136D0   .  8B11          MOV EDX,DWORD PTR DS:[ECX]
004136D2   .  50            PUSH EAX
004136D3   .  FF52 04       CALL DWORD PTR DS:[EDX+4]
004136D6   >  8D4C24 20     LEA ECX,DWORD PTR SS:[ESP+20]
004136DA   .  E8 0D670700   CALL WaveCor.00489DEC
004136DF   .  83F8 01       CMP EAX,1
004136E2   .^ 0F84 88FEFFFF JE WaveCor.00413570
004136E8   .  E9 67010000   JMP WaveCor.00413854
004136ED   >^ E9 2EDAFEFF   JMP WaveCor.00401120
004136F2   >  68 57000780   PUSH 80070057
004136F7   .  E8 54D9FEFF   CALL WaveCor.00401050
004136FC   >  6A 00         PUSH 0
004136FE   .  6A 40         PUSH 40
00413700   .  68 70524B00   PUSH WaveCor.004B5270                    ;  your copy of wave corrector is now registered.\nthank you for registering this product.
00413705   .  E8 2C480800   CALL WaveCor.00497F36                    ;  这里是注册成功的地方。
0041370A   .  6A 00         PUSH 0
0041370C   .  68 70504B00   PUSH WaveCor.004B5070                    ;  这里是写注册表用户名的地方。
00413711   .  68 54304B00   PUSH WaveCor.004B3054                    ;  ASCII "Settings"
00413716   .  8D4424 24     LEA EAX,DWORD PTR SS:[ESP+24]
0041371A   .  50            PUSH EAX
0041371B   .  8BCD          MOV ECX,EBP
0041371D   .  E8 E5190900   CALL WaveCor.004A5107
00413722   .  50            PUSH EAX
00413723   .  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]
00413727   .  68 5C524B00   PUSH WaveCor.004B525C                    ;  这里是写注册码的地方。
0041372C   .  51            PUSH ECX                                 ;  下面无用不在分析。
0041372D   .  C68424 AC0000>MOV BYTE PTR SS:[ESP+AC],2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

关键CALL跟进

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

00413180   $  6A FF         PUSH -1                                  ;  这里是关键CALL的入口。
00413182   .  68 80DD4A00   PUSH WaveCor.004ADD80                    ;  SE 处理程序安装
00413187   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0041318D   .  50            PUSH EAX
0041318E   .  64:8925 00000>MOV DWORD PTR FS:[0],ESP
00413195   .  83EC 18       SUB ESP,18
00413198   .  53            PUSH EBX
00413199   .  55            PUSH EBP
0041319A   .  56            PUSH ESI
0041319B   .  57            PUSH EDI
0041319C   .  33DB          XOR EBX,EBX
0041319E   .  53            PUSH EBX
0041319F   .  68 70504B00   PUSH WaveCor.004B5070                    ;  ASCII "UserName"
004131A4   .  68 54304B00   PUSH WaveCor.004B3054                    ;  ASCII "Settings"
004131A9   .  8D4424 24     LEA EAX,DWORD PTR SS:[ESP+24]
004131AD   .  8BF1          MOV ESI,ECX
004131AF   .  50            PUSH EAX
004131B0   .  897424 34     MOV DWORD PTR SS:[ESP+34],ESI
004131B4   .  E8 4E1F0900   CALL WaveCor.004A5107
004131B9   .  53            PUSH EBX
004131BA   .  68 58524B00   PUSH WaveCor.004B5258                    ;  ASCII "Key"
004131BF   .  68 54304B00   PUSH WaveCor.004B3054                    ;  ASCII "Settings"
004131C4   .  8D4C24 20     LEA ECX,DWORD PTR SS:[ESP+20]
004131C8   .  51            PUSH ECX
004131C9   .  8BCE          MOV ECX,ESI
004131CB   .  895C24 40     MOV DWORD PTR SS:[ESP+40],EBX
004131CF   .  E8 331F0900   CALL WaveCor.004A5107
004131D4   .  6A 08         PUSH 8
004131D6   .  8D5424 24     LEA EDX,DWORD PTR SS:[ESP+24]
004131DA   .  52            PUSH EDX
004131DB   .  8D4C24 1C     LEA ECX,DWORD PTR SS:[ESP+1C]
004131DF   .  C64424 38 01  MOV BYTE PTR SS:[ESP+38],1
004131E4   .  E8 E7F6FEFF   CALL WaveCor.004028D0
004131E9   .  50            PUSH EAX
004131EA   .  8D4C24 18     LEA ECX,DWORD PTR SS:[ESP+18]
004131EE   .  C64424 34 02  MOV BYTE PTR SS:[ESP+34],2
004131F3   .  E8 08F9FEFF   CALL WaveCor.00402B00
004131F8   .  8B4424 20     MOV EAX,DWORD PTR SS:[ESP+20]            ;  我们输入的试练码!放EAX中。只取八位。
004131FC   .  83C0 F0       ADD EAX,-10                              ;  EAX中加上负10
004131FF   .  C64424 30 01  MOV BYTE PTR SS:[ESP+30],1
00413204   .  8D48 0C       LEA ECX,DWORD PTR DS:[EAX+C]             ;  试练码放ECX中。
00413207   .  83CA FF       OR EDX,FFFFFFFF
0041320A   .  F0:0FC111     LOCK XADD DWORD PTR DS:[ECX],EDX         ;  锁定前缀
0041320E   .  4A            DEC EDX
0041320F   .  85D2          TEST EDX,EDX
00413211   .  7F 08         JG SHORT WaveCor.0041321B
00413213   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
00413215   .  8B11          MOV EDX,DWORD PTR DS:[ECX]
00413217   .  50            PUSH EAX
00413218   .  FF52 04       CALL DWORD PTR DS:[EDX+4]
0041321B   >  8B6C24 18     MOV EBP,DWORD PTR SS:[ESP+18]            ;  这里取出我们输入的用户名。放EBP中。
0041321F   .  899E D8000000 MOV DWORD PTR DS:[ESI+D8],EBX
00413225   .  8B5D F4       MOV EBX,DWORD PTR SS:[EBP-C]             ;  这里是取出用户名的位数放EBX中。
00413228   .  33C9          XOR ECX,ECX                              ;  异或ECX
0041322A   .  85DB          TEST EBX,EBX
0041322C   .  BE 01000000   MOV ESI,1
00413231   .  BF 0F000000   MOV EDI,0F                               ;  把15放到EDI中准备循环。也就是F
00413236   .  7E 2B         JLE SHORT WaveCor.00413263
00413238   >  85C9          TEST ECX,ECX
0041323A   .  0F8C D2020000 JL WaveCor.00413512
00413240   .  3BCB          CMP ECX,EBX                              ;  与用户名的位数比较,做为循环变量。
00413242   .  0F8F CA020000 JG WaveCor.00413512
00413248   .  0FBE0429      MOVSX EAX,BYTE PTR DS:[ECX+EBP]          ;  逐位取用户名的ASCII放EAX中。
0041324C   .  99            CDQ
0041324D   .  F7FF          IDIV EDI                                 ;  除上F也就是15
0041324F   .  8BC6          MOV EAX,ESI                              ;  把一个基数1从ESI放到EAX中。
00413251   .  0FAFC6        IMUL EAX,ESI                             ;  EAX乘上ESI
00413254   .  0FAFD7        IMUL EDX,EDI                             ;  用户ASCII余数乘上F
00413257   .  03D0          ADD EDX,EAX                              ;  用上面的基数加上用户名乘完的值。
00413259   .  41            INC ECX
0041325A   .  83C7 02       ADD EDI,2                                ;  EDI每次加2进行循环。
0041325D   .  3BCB          CMP ECX,EBX                              ;  与用户名的位数比较。小于就循环。
0041325F   .  8BF2          MOV ESI,EDX                              ;  这里是把取余乘F,每次加2的值传回做下次运算。
00413261   .^ 7C D5         JL SHORT WaveCor.00413238
00413263   >  68 84284B00   PUSH WaveCor.004B2884
00413268   .  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]
0041326C   .  E8 FFFCFEFF   CALL WaveCor.00402F70
00413271   .  C64424 30 03  MOV BYTE PTR SS:[ESP+30],3               ;  这里把3入栈。
00413276   .  C74424 1C 000>MOV DWORD PTR SS:[ESP+1C],0
0041327E   .  8BFF          MOV EDI,EDI
00413280   >  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
00413284   .  8B41 FC       MOV EAX,DWORD PTR DS:[ECX-4]
00413287   .  8B69 F4       MOV EBP,DWORD PTR DS:[ECX-C]
0041328A   .  BA 01000000   MOV EDX,1                                ;  把1放入EDX中。
0041328F   .  2BD0          SUB EDX,EAX                              ;  往下看,也是算法的第二个关键。
00413291   .  8B41 F8       MOV EAX,DWORD PTR DS:[ECX-8]
00413294   .  8D7D 01       LEA EDI,DWORD PTR SS:[EBP+1]
00413297   .  2BC7          SUB EAX,EDI
00413299   .  0BC2          OR EAX,EDX
0041329B   .  7D 0E         JGE SHORT WaveCor.004132AB
0041329D   .  57            PUSH EDI
0041329E   .  8D4C24 14     LEA ECX,DWORD PTR SS:[ESP+14]
004132A2   .  E8 69E0FEFF   CALL WaveCor.00401310
004132A7   .  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
004132AB   >  33D2          XOR EDX,EDX
004132AD   .  8BC6          MOV EAX,ESI                              ;  这里是关键,把我们上面运算得到的值放到EAX中。
004132AF   .  BB 1A000000   MOV EBX,1A                               ;  这里把1A放到EBX中。
004132B4   .  F7F3          DIV EBX                                  ;  相除取余
004132B6   .  80C2 41       ADD DL,41                                ;  得到余数后再加上41,也就是十进制的。(65)
004132B9   .  85FF          TEST EDI,EDI
004132BB   .  881429        MOV BYTE PTR DS:[ECX+EBP],DL             ;  得到注册码的第一位入栈,准备并排。这里就是逐位得到注册码的地方。
004132BE   .  0F8C 4E020000 JL WaveCor.00413512
004132C4   .  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
004132C8   .  3B78 F8       CMP EDI,DWORD PTR DS:[EAX-8]
004132CB   .  0F8F 41020000 JG WaveCor.00413512
004132D1   .  8978 F4       MOV DWORD PTR DS:[EAX-C],EDI
004132D4   .  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
004132D8   .  B8 25499224   MOV EAX,24924925                         ;  这里是把一个常数放到EAX中。24924925
004132DD   .  F7E6          MUL ESI                                  ;  用这个数再乘上我们上面得到的ESI的值。也就是用户名。算法得到。
004132DF   .  8B4424 1C     MOV EAX,DWORD PTR SS:[ESP+1C]            ;  这里出现一个有意思的算法,就是把得到的值分为两部分运算。
004132E3   .  2BF2          SUB ESI,EDX                              ;  用户名得到的位数减去上面得到值的后半部分放ESI中。
004132E5   .  D1EE          SHR ESI,1                                ;  ESI中的值右移一位。
004132E7   .  03F2          ADD ESI,EDX                              ;  ESI加上EDX的值。
004132E9   .  C1EE 03       SHR ESI,3                                ;  ESI右移三位。
004132EC   .  40            INC EAX                                  ;  EAX加1
004132ED   .  83F8 08       CMP EAX,8                                ;  与8比较,证明注册码要八位。
004132F0   .  C6040F 00     MOV BYTE PTR DS:[EDI+ECX],0
004132F4   .  894424 1C     MOV DWORD PTR SS:[ESP+1C],EAX
004132F8   .^ 7C 86         JL SHORT WaveCor.00413280                ;  小于跳回继续。
004132FA   .  8B5424 14     MOV EDX,DWORD PTR SS:[ESP+14]            ;  假码!放EDX中。
004132FE   .  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]            ;  真码放EAX中。
00413302   .  52            PUSH EDX
00413303   .  50            PUSH EAX
00413304   .  E8 EF260600   CALL WaveCor.004759F8
00413309   .  83C4 08       ADD ESP,8
0041330C   .  85C0          TEST EAX,EAX
0041330E   .  0F85 84000000 JNZ WaveCor.00413398                     ;  这里还是一个跳,其实是作者设置的无用跳。可以不让跳。
00413314   .  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]            ;  上面这个跳过跟一下,得到的不是正确的注册码。
00413318   .  83C0 F0       ADD EAX,-10
0041331B   .  C64424 30 01  MOV BYTE PTR SS:[ESP+30],1
00413320   .  8D48 0C       LEA ECX,DWORD PTR DS:[EAX+C]
00413323   .  83CA FF       OR EDX,FFFFFFFF
00413326   .  F0:0FC111     LOCK XADD DWORD PTR DS:[ECX],EDX         ;  锁定前缀
0041332A   .  4A            DEC EDX
0041332B   .  85D2          TEST EDX,EDX
0041332D   .  7F 08         JG SHORT WaveCor.00413337
0041332F   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
00413331   .  8B11          MOV EDX,DWORD PTR DS:[ECX]
00413333   .  50            PUSH EAX
00413334   .  FF52 04       CALL DWORD PTR DS:[EDX+4]
00413337   >  8B4424 14     MOV EAX,DWORD PTR SS:[ESP+14]
0041333B   .  83C0 F0       ADD EAX,-10
0041333E   .  C64424 30 00  MOV BYTE PTR SS:[ESP+30],0
00413343   .  8D48 0C       LEA ECX,DWORD PTR DS:[EAX+C]
00413346   .  83CA FF       OR EDX,FFFFFFFF
00413349   .  F0:0FC111     LOCK XADD DWORD PTR DS:[ECX],EDX         ;  锁定前缀
0041334D   .  4A            DEC EDX
0041334E   .  85D2          TEST EDX,EDX
00413350   .  7F 08         JG SHORT WaveCor.0041335A
00413352   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
00413354   .  8B11          MOV EDX,DWORD PTR DS:[ECX]
00413356   .  50            PUSH EAX
00413357   .  FF52 04       CALL DWORD PTR DS:[EDX+4]
0041335A   >  8B4424 18     MOV EAX,DWORD PTR SS:[ESP+18]
0041335E   .  83C0 F0       ADD EAX,-10
00413361   .  C74424 30 FFF>MOV DWORD PTR SS:[ESP+30],-1
00413369   .  8D48 0C       LEA ECX,DWORD PTR DS:[EAX+C]
0041336C   .  83CA FF       OR EDX,FFFFFFFF
0041336F   .  F0:0FC111     LOCK XADD DWORD PTR DS:[ECX],EDX         ;  锁定前缀
00413373   .  4A            DEC EDX
00413374   .  85D2          TEST EDX,EDX
00413376   .  7F 08         JG SHORT WaveCor.00413380
00413378   .  8B08          MOV ECX,DWORD PTR DS:[EAX]
0041337A   .  8B11          MOV EDX,DWORD PTR DS:[ECX]
0041337C   .  50            PUSH EAX
0041337D   .  FF52 04       CALL DWORD PTR DS:[EDX+4]
00413380   >  5F            POP EDI
00413381   .  5E            POP ESI
00413382   .  5D            POP EBP
00413383   .  B8 01000000   MOV EAX,1
00413388   .  5B            POP EBX
00413389   .  8B4C24 18     MOV ECX,DWORD PTR SS:[ESP+18]
0041338D   .  64:890D 00000>MOV DWORD PTR FS:[0],ECX
00413394   .  83C4 24       ADD ESP,24
00413397   .  C3            RETN
算法到此结束
------------------------------------------------------------------------
总结算法:
1、逐位取用户名的ASCII值。除以F(15)记为A
2、先把一个定值1做为累乘的基数值。记为B
3、用第一步得到的余数乘上F(15)。记为C
4、B+C=D
5、完成上面运算F的值每次累加2。直到小循环结束。
6、取一个固定数1A(26)做为除数。
7、用上面小循环得到的累加值除1A(26)取余
8、用得到的余数再加上41(65)得到ASCII值。然后转为字符为注册码的第一位。
9、取一个固定数24924925(613566757)乘上小循环得到累加值。
10、这里是一个精典要注意看。把乘得值以十六进制分别存在EAX和EDX是。准备运算。
11、用小循环的累加值减去EDX中的值,也就是第九步分出值的第二部分。
12、把上面得到的右移一位。再加上EDX中的,也就是第九步分出值的第二部分。
13、把第十二步得到的值再右移3位。循环第6步到第13步。逐位得到注册码。
14、注册码要求是8位。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
由于本人语言表达能力有限。呵呵。希望兄弟们见谅。以下提供几组注册码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1、用户名:WildCatIII       注册码:FNECQBFN
2、用户名:wxh9833          注册码:PRXKTDHC
3、用户名:冷血书生         注册码:LXFCPOTD(中文测试成功)
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!