【破文标题】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(中文测试成功)
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!