絕戀de煩神 发表于 2008-5-2 00:36

HiFi MP3 WMA Converter 3.00 算法分析

[ 破文标题 ] HiFi MP3 WMA Converter 3.00 算法分析
[ 破文作者 ] 絕戀de煩神
[ 作者邮箱 ] sos_ftp@yahoo.com.cn
[ 作者主页 ] http://hi.baidu.com/天蝎型男
[ 破解工具 ] Peid,OllyDBG
[ 破解平台 ] WinXp SP2
[ 软件名称 ] HiFi MP3 WMA Converter 3.00
[ 软件大小 ] 2481KB
[ 原版下载 ] http://www.newhua.com/soft/25824.htm
[ 保护方式 ] 用户名+注册码
[ 软件简介 ] 一款简单实用的MP3和WMA的转换工具, 在转换的过程中,你可以进行重新采样,也可以重新选择音频的比特率和频率,支持VBR和CBR。 如果有大量的音乐需要转换,你可以选择适用它的批量转换功能。
[ 破解声明 ] 小菜鳥一只,興趣所至,若有錯誤之處,請老鳥們多加指點。
-----------------------------------------------------
[ 破解过程 ]-----------------------------------------

首先咱们来运行一下程序,假注册一下。发现有错误提示:Invalid register code! Please retry!

再来用PEID来查一下壳,发现程序没加壳:Borland Delphi 6.0 - 7.0 幸运啊。嘻嘻

最后,就到我们的主角出场了。嘻嘻。。用OD载入分析:先来查找错误提示-Invalid register code! Please retry! 一共找到4处。我们来双击最上面的那一个错误提示字符串。就会来到下面的代码段了。在段首这里按F2下断后F9运行程序,假注册一下后就会停在这里,就可以继续往下分析了。

00495918 |. 55      PUSH EBP               ;F2下断,F9运行
00495919 |. 68 2B5B4900PUSH HiFi_MP3.00495B2B
0049591E |. 64:FF30    PUSH DWORD PTR FS:
00495921 |. 64:8920    MOV DWORD PTR FS:,ESP
00495924 |. B3 01   MOV BL,1
00495926 |. FF05 8CCD4A00 INC DWORD PTR DS:
0049592C |. 833D 8CCD4A00>CMP DWORD PTR DS:,3
00495933 |. 7E 1D   JLE SHORT HiFi_MP3.00495952
00495935 |. 6A 00   PUSH 0                  ; /Arg1 = 00000000
00495937 |. 66:8B0D 3C5B4>MOV CX,WORD PTR DS:       ; |
0049593E |. B2 02   MOV DL,2               ; |
00495940 |. B8 485B4900MOV EAX,HiFi_MP3.00495B48      ; |Invalid register code! Please retry!
00495945 |. E8 0AF6F9FFCALL HiFi_MP3.00434F54          ; \HiFi_MP3.00434F54
0049594A |. 8B45 FC    MOV EAX,DWORD PTR SS:
0049594D |. E8 BA79FEFFCALL HiFi_MP3.0047D30C
00495952 |> 8D55 F0    LEA EDX,DWORD PTR SS:
00495955 |. 8B45 FC    MOV EAX,DWORD PTR SS:
00495958 |. 8B80 10030000 MOV EAX,DWORD PTR DS:
0049595E |. E8 41B2FCFFCALL HiFi_MP3.00460BA4          ; 取用户名长度
00495963 |. 8B45 F0    MOV EAX,DWORD PTR SS:      ; 把用户名送给EAX
00495966 |. 8D55 F8    LEA EDX,DWORD PTR SS:
00495969 |. E8 DE2EF7FFCALL HiFi_MP3.0040884C
0049596E |. 8D55 EC    LEA EDX,DWORD PTR SS:
00495971 |. 8B45 F8    MOV EAX,DWORD PTR SS:       ; 把用户名送给EAX
00495974 |. E8 072FF7FFCALL HiFi_MP3.00408880
00495979 |. 8B55 EC    MOV EDX,DWORD PTR SS:      ; 把用户名送给EDX
0049597C |. 8D45 F8    LEA EAX,DWORD PTR SS:
0049597F |. E8 04E9F6FFCALL HiFi_MP3.00404288
00495984 |. BF 15000000MOV EDI,15                ; --------------------------
00495989 |. BE C8A74A00MOV ESI,HiFi_MP3.004AA7C8      ; TDVDS6-MBN3
0049598E |> 8B45 F8    /MOV EAX,DWORD PTR SS:      ; 把用户名送给EAX
00495991 |. 8B16   |MOV EDX,DWORD PTR DS:       ; 把固定的用户名送给EDX
00495993 |. E8 64ECF6FF|CALL HiFi_MP3.004045FC         ; 這里真假用户名比较
00495998 |. 75 04   |JNZ SHORT HiFi_MP3.0049599E       ; 不相等就跳
0049599A |. 33DB   |XOR EBX,EBX               ; EBX清零
0049599C |. EB 06   |JMP SHORT HiFi_MP3.004959A4
0049599E |> 83C6 04    |ADD ESI,4                ; ESI+4
004959A1 |. 4F      |DEC EDI               ; EDI-1
004959A2 |.^ 75 EA   \JNZ SHORT HiFi_MP3.0049598E       ; --------循环比较---------
004959A4 |> 84DB   TEST BL,BL
004959A6   74 1A   JE SHORT HiFi_MP3.004959C2
004959A8 |. 6A 00   PUSH 0                  ; /Arg1 = 00000000
004959AA |. 66:8B0D 3C5B4>MOV CX,WORD PTR DS:       ; |
004959B1 |. B2 02   MOV DL,2               ; |
004959B3 |. B8 485B4900MOV EAX,HiFi_MP3.00495B48      ; |Invalid register code! Please retry!
004959B8 |. E8 97F5F9FFCALL HiFi_MP3.00434F54          ; \HiFi_MP3.00434F54
004959BD |. E9 2E010000JMP HiFi_MP3.00495AF0
004959C2 |> 8D55 E8    LEA EDX,DWORD PTR SS:
004959C5 |. 8B45 FC    MOV EAX,DWORD PTR SS:
004959C8 |. 8B80 14030000 MOV EAX,DWORD PTR DS:
004959CE |. E8 D1B1FCFFCALL HiFi_MP3.00460BA4          ; 取假码长度
004959D3 |. 8B45 E8    MOV EAX,DWORD PTR SS:      ; 把假码送给EAX
004959D6 |. 8D55 F4    LEA EDX,DWORD PTR SS:
004959D9 |. E8 6E2EF7FFCALL HiFi_MP3.0040884C
004959DE |. 8D55 E4    LEA EDX,DWORD PTR SS:
004959E1 |. 8B45 F4    MOV EAX,DWORD PTR SS:       ; 把假码送给EAX
004959E4 |. E8 972EF7FFCALL HiFi_MP3.00408880
004959E9 |. 8B55 E4    MOV EDX,DWORD PTR SS:      ; 把假码送给EDX
004959EC |. 8D45 F4    LEA EAX,DWORD PTR SS:
004959EF |. E8 94E8F6FFCALL HiFi_MP3.00404288
004959F4 |. 837D F8 00CMP DWORD PTR SS:,0      ; 用户名和0比较
004959F8 |. 0F84 F2000000 JE HiFi_MP3.00495AF0
004959FE |. 837D F4 00CMP DWORD PTR SS:,0      ; 假码和0比较
00495A02 |. 0F84 E8000000 JE HiFi_MP3.00495AF0
00495A08 |. 8B45 F4    MOV EAX,DWORD PTR SS:       ; 把假码送给EAX
00495A0B |. E8 A0EAF6FFCALL HiFi_MP3.004044B0          ; 取假码长度
00495A10 |. 85C0   TEST EAX,EAX               ; 看有没有输入注册码
00495A12 |. 7E 35   JLE SHORT HiFi_MP3.00495A49       ; 没有输入就跳
00495A14 |. BA 01000000MOV EDX,1                ; EDX=1
00495A19 |> 8B4D F4    /MOV ECX,DWORD PTR SS:      ; 把假码送给ECX
00495A1C |. 0FB64C11 FF|MOVZX ECX,BYTE PTR DS:    ; 逐位取假码的ASCII值给ECX
00495A21 |. 83F9 30    |CMP ECX,30               ; 和16进制的30比较
00495A24 |. 7C 05   |JL SHORT HiFi_MP3.00495A2B       ; 小于就跳
00495A26 |. 83F9 39    |CMP ECX,39               ; 和16进制的39比较
00495A29 |. 7E 1A   |JLE SHORT HiFi_MP3.00495A45       ; 小于或者等于就跳
00495A2B |> 6A 00   |PUSH 0               ; /Arg1 = 00000000
00495A2D |. 66:8B0D 3C5B4>|MOV CX,WORD PTR DS:       ; |
00495A34 |. B2 02   |MOV DL,2                ; |
00495A36 |. B8 485B4900|MOV EAX,HiFi_MP3.00495B48      ; |Invalid register code! Please retry!
00495A3B |. E8 14F5F9FF|CALL HiFi_MP3.00434F54         ; \HiFi_MP3.00434F54
00495A40 |. E9 AB000000|JMP HiFi_MP3.00495AF0
00495A45 |> 42      |INC EDX               ; EDX+1
00495A46 |. 48      |DEC EAX               ; EAX-1
00495A47 |.^ 75 D0   \JNZ SHORT HiFi_MP3.00495A19       ; 开始循环,验证注册码是否为纯数字
00495A49 |> 33DB   XOR EBX,EBX               ; EBX清零
00495A4B |. 8B45 F8    MOV EAX,DWORD PTR SS:       ; 把用户名送给EAX
00495A4E |. E8 5DEAF6FFCALL HiFi_MP3.004044B0          ; 取用户名长度
00495A53 |. 85C0   TEST EAX,EAX               ; 看有没有输入用户名
00495A55 |. 7E 13   JLE SHORT HiFi_MP3.00495A6A       ; 没有输入就跳
00495A57 |. BF 01000000MOV EDI,1                ; EDI=1
00495A5C |> 8B55 F8    /MOV EDX,DWORD PTR SS:      ; 把用户名送给EDX
00495A5F |. 0FB6543A FF|MOVZX EDX,BYTE PTR DS:    ; 逐位取用户名的ASCII值给EDX
00495A64 |. 03DA   |ADD EBX,EDX               ; EBX=EBX+EDX
00495A66 |. 47      |INC EDI               ; EDI+1
00495A67 |. 48      |DEC EAX               ; EAX-1
00495A68 |.^ 75 F2   \JNZ SHORT HiFi_MP3.00495A5C       ; 开始循环, 累加用户名的ASCII值
00495A6A |> 69C3 F38B0B00 IMUL EAX,EBX,0B8BF3         ; EBX的值乘以固定值0B8BF3,结果存放在EAX里
00495A70 |. 83C0 57    ADD EAX,57                ; EAX+57
00495A73 |. D1F8   SAR EAX,1                ; EAX算术右移一位
00495A75 |. 79 03   JNS SHORT HiFi_MP3.00495A7A       ; 符号位为0时就跳
00495A77 |. 83D0 00    ADC EAX,0
00495A7A |> 8BD8   MOV EBX,EAX               ; 把右移一位后的结果送给EBX
00495A7C |. 8B45 F4    MOV EAX,DWORD PTR SS:       ; 把假码送给EAX
00495A7F |. E8 8431F7FFCALL HiFi_MP3.00408C08          ; 关键CALL,F7跟進
00495A84 |. 3BD8   CMP EBX,EAX               ; EBX跟EAX比较
00495A86 |. 75 53   JNZ SHORT HiFi_MP3.00495ADB       ; 不相等就GAME OVER!
00495A88 |. 6A 00   PUSH 0                  ; /Arg1 = 00000000
00495A8A |. 66:8B0D 3C5B4>MOV CX,WORD PTR DS:       ; |
00495A91 |. B2 02   MOV DL,2               ; |
00495A93 |. B8 785B4900MOV EAX,HiFi_MP3.00495B78      ; |Congratuation! You have successfully registered!
00495A98 |. E8 B7F4F9FFCALL HiFi_MP3.00434F54          ; \HiFi_MP3.00434F54
00495A9D |. A1 24AE4A00MOV EAX,DWORD PTR DS:
00495AA2 |. C600 01    MOV BYTE PTR DS:,1
00495AA5 |. A1 30AF4A00MOV EAX,DWORD PTR DS:
00495AAA |. 8B00   MOV EAX,DWORD PTR DS:
00495AAC |. 33C9   XOR ECX,ECX
00495AAE |. BA 04000000MOV EDX,4
00495AB3 |. 8B18   MOV EBX,DWORD PTR DS:
00495AB5 |. FF53 14    CALL DWORD PTR DS:
00495AB8 |. 8B15 24AE4A00 MOV EDX,DWORD PTR DS:      ; HiFi_MP3.004ACDFB
00495ABE |. A1 30AF4A00MOV EAX,DWORD PTR DS:
00495AC3 |. 8B00   MOV EAX,DWORD PTR DS:
00495AC5 |. B9 01000000MOV ECX,1
00495ACA |. E8 1591F8FFCALL HiFi_MP3.0041EBE4
00495ACF |. A1 88CD4A00MOV EAX,DWORD PTR DS:
00495AD4 |. E8 3378FEFFCALL HiFi_MP3.0047D30C
00495AD9 |. EB 15   JMP SHORT HiFi_MP3.00495AF0
00495ADB |> 6A 00   PUSH 0                  ; /Arg1 = 00000000
00495ADD |. 66:8B0D 3C5B4>MOV CX,WORD PTR DS:       ; |
00495AE4 |. B2 02   MOV DL,2               ; |
00495AE6 |. B8 485B4900MOV EAX,HiFi_MP3.00495B48      ; |Invalid register code! Please retry!
00495AEB |. E8 64F4F9FFCALL HiFi_MP3.00434F54          ; \HiFi_MP3.00434F54
00495AF0 |> 33C0   XOR EAX,EAX
00495AF2 |. 5A      POP EDX
00495AF3 |. 59      POP ECX
00495AF4 |. 59      POP ECX
00495AF5 |. 64:8910    MOV DWORD PTR FS:,EDX
00495AF8 |. 68 325B4900PUSH HiFi_MP3.00495B32
00495AFD |> 8D45 E4    LEA EAX,DWORD PTR SS:
00495B00 |. E8 EBE6F6FFCALL HiFi_MP3.004041F0
00495B05 |. 8D45 E8    LEA EAX,DWORD PTR SS:
00495B08 |. E8 E3E6F6FFCALL HiFi_MP3.004041F0
00495B0D |. 8D45 EC    LEA EAX,DWORD PTR SS:
00495B10 |. E8 DBE6F6FFCALL HiFi_MP3.004041F0
00495B15 |. 8D45 F0    LEA EAX,DWORD PTR SS:
00495B18 |. E8 D3E6F6FFCALL HiFi_MP3.004041F0
00495B1D |. 8D45 F4    LEA EAX,DWORD PTR SS:
00495B20 |. BA 02000000MOV EDX,2
00495B25 |. E8 EAE6F6FFCALL HiFi_MP3.00404214
00495B2A \. C3      RETN

第一个关键CALL跟进后来到这里:

00408C08 /$ 53      PUSH EBX               ; 把EBX压入栈
00408C09 |. 56      PUSH ESI               ; 把ESI压入栈
00408C0A |. 83C4 F4    ADD ESP,-0C               ; ESP-0C
00408C0D |. 8BD8   MOV EBX,EAX               ; 把假码送给EBX
00408C0F |. 8BD4   MOV EDX,ESP               ; EDX=ESP
00408C11 |. 8BC3   MOV EAX,EBX               ; 把假码送给EAX
00408C13 |. E8 BCA1FFFFCALL HiFi_MP3.00402DD4          ; 关键CALL,F7跟进
00408C18 |. 8BF0   MOV ESI,EAX               ; 把EAX的值送给ESI
00408C1A |. 833C24 00   CMP DWORD PTR SS:,0         ; 此时的为0
00408C1E |. 74 19   JE SHORT HiFi_MP3.00408C39      ; 相等就跳
00408C20 |. 895C24 04   MOV DWORD PTR SS:,EBX
00408C24 |. C64424 08 0B MOV BYTE PTR SS:,0B
00408C29 |. 8D5424 04   LEA EDX,DWORD PTR SS:
00408C2D |. A1 4CAD4A00MOV EAX,DWORD PTR DS:
00408C32 |. 33C9   XOR ECX,ECX
00408C34 |. E8 CBF8FFFFCALL HiFi_MP3.00408504
00408C39 |> 8BC6   MOV EAX,ESI               ; 把ESI的值送给EAX
00408C3B |. 83C4 0C    ADD ESP,0C                ; ESP+0C
00408C3E |. 5E      POP ESI               ; ESI出栈
00408C3F |. 5B      POP EBX               ; EBX出栈
00408C40 \. C3      RETN

第二个关键CALL跟进后来到这里:

00402DD4 /$ 53      PUSH EBX
00402DD5 |. 56      PUSH ESI
00402DD6 |. 57      PUSH EDI
00402DD7 |. 89C6   MOV ESI,EAX               ; 把假码送给ESI
00402DD9 |. 50      PUSH EAX               ; 假码入栈
00402DDA |. 85C0   TEST EAX,EAX               ; 看EAX是否为0
00402DDC |. 74 6C   JE SHORT HiFi_MP3.00402E4A      ; EAX=0就跳
00402DDE |. 31C0   XOR EAX,EAX               ; EAX清零
00402DE0 |. 31DB   XOR EBX,EBX               ; EBX清零
00402DE2 |. BF CCCCCC0CMOV EDI,0CCCCCCC             ; 把固定值0CCCCCCC送给EDI
00402DE7 |> 8A1E   /MOV BL,BYTE PTR DS:      ; 取假码第一位的ASCII值给BL
00402DE9 |. 46      |INC ESI               ; ESI+1
00402DEA |. 80FB 20    |CMP BL,20                ; BL的值和20比较
00402DED |.^ 74 F8   \JE SHORT HiFi_MP3.00402DE7       ; 相等就跳
00402DEF |. B5 00   MOV CH,0               ; CH=0
00402DF1 |. 80FB 2D    CMP BL,2D                ; BL的值和2D比较
00402DF4 |. 74 62   JE SHORT HiFi_MP3.00402E58      ; 相等就跳
00402DF6 |. 80FB 2B    CMP BL,2B                ; BL的值和2B比较
00402DF9 |. 74 5F   JE SHORT HiFi_MP3.00402E5A      ; 相等就跳
00402DFB |> 80FB 24    CMP BL,24                ; BL的值和24比较
00402DFE |. 74 5F   JE SHORT HiFi_MP3.00402E5F      ; 相等就跳
00402E00 |. 80FB 78    CMP BL,78                ; BL的值和78比较
00402E03 |. 74 5A   JE SHORT HiFi_MP3.00402E5F      ; 相等就跳
00402E05 |. 80FB 58    CMP BL,58                ; BL的值和58比较
00402E08 |. 74 55   JE SHORT HiFi_MP3.00402E5F      ; 相等就跳
00402E0A |. 80FB 30    CMP BL,30                ; BL的值和30比较
00402E0D |. 75 13   JNZ SHORT HiFi_MP3.00402E22       ; 不相等就跳
00402E0F |. 8A1E   MOV BL,BYTE PTR DS:
00402E11 |. 46      INC ESI
00402E12 |. 80FB 78    CMP BL,78
00402E15 |. 74 48   JE SHORT HiFi_MP3.00402E5F
00402E17 |. 80FB 58    CMP BL,58
00402E1A |. 74 43   JE SHORT HiFi_MP3.00402E5F
00402E1C |. 84DB   TEST BL,BL
00402E1E |. 74 20   JE SHORT HiFi_MP3.00402E40
00402E20 |. EB 04   JMP SHORT HiFi_MP3.00402E26
00402E22 |> 84DB   TEST BL,BL                ; BL是否为0
00402E24 |. 74 2D   JE SHORT HiFi_MP3.00402E53      ; BL=0就跳
00402E26 |> 80EB 30    /SUB BL,30                ; BL-30
00402E29 |. 80FB 09    |CMP BL,9                ; 减后的结果和9比较
00402E2C |. 77 25   |JA SHORT HiFi_MP3.00402E53       ; 不小于就跳
00402E2E |. 39F8   |CMP EAX,EDI               ; EAX跟EDI比较
00402E30 |. 77 21   |JA SHORT HiFi_MP3.00402E53       ; 不小于就跳
00402E32 |. 8D0480    |LEA EAX,DWORD PTR DS:    ; EAX=EAX+(EAX*4)
00402E35 |. 01C0   |ADD EAX,EAX               ; EAX=EAX+EAX (或者说是EAX的值乘以2)
00402E37 |. 01D8   |ADD EAX,EBX               ; EAX=EAX+EBX
00402E39 |. 8A1E   |MOV BL,BYTE PTR DS:      ; 把假码第二位的ASCII值送给BL
00402E3B |. 46      |INC ESI               ; ESI+1
00402E3C |. 84DB   |TEST BL,BL               ; BL是否为0
00402E3E |.^ 75 E6   \JNZ SHORT HiFi_MP3.00402E26       ; 不等于0就跳,开始循环计算
00402E40 |> FECD   DEC CH                  ; CH-1
00402E42 |. 74 09   JE SHORT HiFi_MP3.00402E4D
00402E44 |. 85C0   TEST EAX,EAX
00402E46 |. 7D 54   JGE SHORT HiFi_MP3.00402E9C       ; 这里跳转实现了,结束运算

[ 破解总结 ]-----------------------------------------

注册码是根据用户名来计算的,与注册码无关。跟进那两个CALL只是想分析一下他的计算过程而已,貌似不重要的。因为真码在没到关键CALL的时候已经计算出来了。嘻嘻。

算法总结:
1.累加用户名的ASCII值
2.累加后的结果IMUL(乘以)0B8BF3
3.得到的结果加上57
4.结果SAR 1
5.把上面得到的结果转换为10进制就是真码。
-----------------------------------------------------
[ 版权声明 ] 版权所有:絕戀de煩神 未经本人同意请勿转载嘻嘻
-----------------------------------------------------

hackjam 发表于 2010-12-22 10:15

谢谢楼主

jsczj 发表于 2010-12-22 17:02

LZ写辛苦了··备个案

richafei 发表于 2010-12-23 17:33

高手,这个应该有用,可惜没得下载用啊
页: [1]
查看完整版本: HiFi MP3 WMA Converter 3.00 算法分析