【破文标题】MP3 Cutter Joiner最新版 算法分析+Delphi嵌入汇编注册机
【破文作者】Playboysen
【作者邮箱】playboysen@126.com
【作者主页】playboysen2.photo.163.com
【破解工具】PEiD,OD
【破解平台】Windows XP
【软件名称】MP3 Cutter Joiner
【软件大小】2.94 MB
【软件类别】国外软件/音频编辑
【软件授权】共享版
【软件语言】英文
【更新时间】2008-8-8 【奥运献礼】
【原版下载】http://www.audiotoolsfactory.com/mp3cutter/mp3cutter.htm
【保护方式】用户名、注册码
【软件简介】MP3 Cutter Joiner是一款功能强大、简单易用的音频编辑工具,可以将音频文件进行分割,也可以将多个音频文件合并为一个文件,支持MP3、WAV、WMA以及OGG格式,支持批量处理,通过内置的音频播放器,用户可以预先听取音频文件然后设置分隔/合并时的开始/结束时间。

【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
 初学破解与编程,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------
【破解内容】

    昨天七夕,写了一篇算法分析“【七夕礼物】Power Video Converter算法分析+另类注册机”,以纪念我们中国自己的“情人节”,图个彩头(*^__^*) 嘻嘻……
    可今天是咱们的奥运开幕2008年8月8日,快8点了,呵呵我得快点,回去看开幕式去,支持中国!这样的一个特别的日子,当然也不舍得错过,一鼓作气再写一篇,奥运献礼,一是希望自己明年毕业时能找到像样的工作,二是祝福我们论坛越干越火,三是诅咒大家生活越过越顺,男孩没娶的娶,女孩该嫁的嫁,百年梦想今实现,大伙天天好心情!!
  
    抓紧时间来入正题哦,OD载入试运行知道是用户名注册码保护,无壳,加载查找字符串定位关键,输入假码立即断下: 

代码:
004B2079  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
004B207C  |.  8B87 1C030000 mov     eax, dword ptr [edi+31C]
004B2082  |.  E8 CD65FBFF   call    00468654                         ;  求用户名长度
004B2087  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ;  用户名入EAX
004B208A  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
004B208D  |.  E8 3E67F5FF   call    004087D0
004B2092  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
004B2095  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
004B2098  |.  E8 6767F5FF   call    00408804
004B209D  |.  8B55 F0       mov     edx, dword ptr [ebp-10]
004B20A0  |.  8D45 FC       lea     eax, dword ptr [ebp-4]
004B20A3  |.  E8 3822F5FF   call    004042E0
004B20A8  |.  BB 15000000   mov     ebx, 15
004B20AD  |.  BE EC1B4C00   mov     esi, 004C1BEC
004B20B2  |>  8B45 FC       /mov     eax, dword ptr [ebp-4]          ;  用户名放入EAX
004B20B5  |.  8B16          |mov     edx, dword ptr [esi]            ;  此处查看数据窗口会发现一个用户名表
004B20B7  |.  E8 9825F5FF   |call    00404654
004B20BC  |.  75 09         |jnz     short 004B20C7
004B20BE  |.  C605 5C3E4C00>|mov     byte ptr [4C3E5C], 0
004B20C5  |.  EB 06         |jmp     short 004B20CD
004B20C7  |>  83C6 04       |add     esi, 4
004B20CA  |.  4B            |dec     ebx
004B20CB  |.^ 75 E5         \jnz     short 004B20B2                  ;  上面这个循环是在比较用户名是否是软件预定义的20多个用户名中的一个
004B20CD  |>  803D 5C3E4C00>cmp     byte ptr [4C3E5C], 0             ;  用户名若不是预定义的用户名中的一个,则提示错误
004B20D4  |.  74 1A         je      short 004B20F0
004B20D6  |.  6A 00         push    0                                ; /Arg1 = 00000000
004B20D8  |.  66:8B0D FC224>mov     cx, word ptr [4B22FC]            ; |
004B20DF  |.  B2 02         mov     dl, 2                            ; |
004B20E1  |.  B8 08234B00   mov     eax, 004B2308                    ; |invalid register code! please retry!
004B20E6  |.  E8 B13BF8FF   call    00435C9C                         ; \MP3_Cutt.00435C9C
004B20EB  |.  E9 C0010000   jmp     004B22B0
004B20F0  |>  8D55 EC       lea     edx, dword ptr [ebp-14]
004B20F3  |.  8B87 20030000 mov     eax, dword ptr [edi+320]
004B20F9  |.  E8 5665FBFF   call    00468654
004B20FE  |.  8B45 EC       mov     eax, dword ptr [ebp-14]          ;  假码放入EAX
004B2101  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
004B2104  |.  E8 C766F5FF   call    004087D0
004B2109  |.  8D55 E8       lea     edx, dword ptr [ebp-18]
004B210C  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
004B210F  |.  E8 F066F5FF   call    00408804
004B2114  |.  8B55 E8       mov     edx, dword ptr [ebp-18]
004B2117  |.  8D45 F8       lea     eax, dword ptr [ebp-8]
004B211A  |.  E8 C121F5FF   call    004042E0
004B211F  |.  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  比较用户名是否为空
004B2123  |.  0F84 87010000 je      004B22B0
004B2129  |.  837D F8 00    cmp     dword ptr [ebp-8], 0             ;  比较注册码是否为空
004B212D  |.  0F84 7D010000 je      004B22B0
004B2133  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  假码入栈
004B2136  |.  E8 CD23F5FF   call    00404508                         ;  求假码长度
004B213B  |.  85C0          test    eax, eax
004B213D  |.  7E 35         jle     short 004B2174
004B213F  |.  BA 01000000   mov     edx, 1
004B2144  |>  8B4D F8       /mov     ecx, dword ptr [ebp-8]          ;  这个循环是在检测用户名是不是数字,不是则提示错误
004B2147  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]
004B214C  |.  83F9 30       |cmp     ecx, 30
004B214F  |.  7C 05         |jl      short 004B2156
004B2151  |.  83F9 39       |cmp     ecx, 39
004B2154  |.  7E 1A         |jle     short 004B2170
004B2156  |>  6A 00         |push    0                               ; /Arg1 = 00000000
004B2158  |.  66:8B0D FC224>|mov     cx, word ptr [4B22FC]           ; |
004B215F  |.  B2 02         |mov     dl, 2                           ; |
004B2161  |.  B8 08234B00   |mov     eax, 004B2308                   ; |invalid register code! please retry!
004B2166  |.  E8 313BF8FF   |call    00435C9C                        ; \MP3_Cutt.00435C9C
004B216B  |.  E9 40010000   |jmp     004B22B0
004B2170  |>  42            |inc     edx
004B2171  |.  48            |dec     eax
004B2172  |.^ 75 D0         \jnz     short 004B2144
004B2174  |>  33F6          xor     esi, esi
004B2176  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
004B2179  |.  E8 8A23F5FF   call    00404508                         ;  计算用户名长度
004B217E  |.  85C0          test    eax, eax
004B2180  |.  7E 13         jle     short 004B2195
004B2182  |.  BB 01000000   mov     ebx, 1
004B2187  |>  8B55 FC       /mov     edx, dword ptr [ebp-4]          ;  求用户名十六进制和,设为Sum
004B218A  |.  0FB6541A FF   |movzx   edx, byte ptr [edx+ebx-1]
004B218F  |.  03F2          |add     esi, edx
004B2191  |.  43            |inc     ebx
004B2192  |.  48            |dec     eax
004B2193  |.^ 75 F2         \jnz     short 004B2187
004B2195  |>  69C6 9FF30700 imul    eax, esi, 7F39F                  ;  把Sum*0x7F39F的值放入EAX
004B219B  |.  83C0 20       add     eax, 20                          ;  上一步求出的值加上0x20
004B219E  |.  D1F8          sar     eax, 1                           ;  对EAX的值算数右移1位,值依旧放入EAX
004B21A0  |.  79 03         jns     short 004B21A5                   ;  非负跳转
004B21A2  |.  83D0 00       adc     eax, 0                           ;  EAX+0+CF标志位
004B21A5  |>  8BF0          mov     esi, eax                         ;  把根据用户民求出的值放入ESI保存(即真正的注册码)
004B21A7  |.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  假码放入EAX
004B21AA  |.  E8 DD69F5FF   call    00408B8C                         ;  这个函数应该是strtoint,然后inttohex,既然核心算法已经结束,我们就不看了
004B21AF  |.  3BF0          cmp     esi, eax
004B21B1  |.  75 56         jnz     short 004B2209                   ;  很明显,跳向错误哦
004B21B3  |.  6A 00         push    0                                ; /Arg1 = 00000000
004B21B5  |.  66:8B0D FC224>mov     cx, word ptr [4B22FC]            ; |
004B21BC  |.  B2 02         mov     dl, 2                            ; |
004B21BE  |.  B8 38234B00   mov     eax, 004B2338                    ; |congratulation! you have successfully registered!
004B21C3  |.  E8 D43AF8FF   call    00435C9C                         ; \MP3_Cutt.00435C9C
算法比较简单,其中在004B21AA的call里面也是一堆算法,但是没什么用,略过,总结如下:
1、软件自定义21个用户名
2、用户输入的用户名必须是这21个中的一个,否则出错
3、注册码必须是数字,否则出错
4、用户名十六进制和经过简单运算后的结果作为注册码和假码比较

其中21个用户名如下:
VS88T6-Vs86 TV66P6-TV66 S1R6P6-SV66 TDR6p6-SV66 TDR6p6-EVS TDR6p6-ST1 sf6p6-VB1 B8sf6p6-VB1 B8TDf6p6-VB1 BS45f6p6-VB1
Osrf6p6-VB1 Ofrg6p6-VB1 ESrg6p6-VB1 IUrg6p6-VB1 IUDT6-BX1  DUIT6-tV1  S1IT6-DV1 SNMS6-DV1   SNWS6-TN1    SNWS6-MN3 
TDVS6-MN3

注册机关键源码公布如下(用一个combobox组件把21个items用户名放入):
代码:
procedure TForm1.cbb1Change(Sender: TObject);
var
  temp:Integer;
  name:string;
begin
  name:=Form1.cbb1.Text;
  asm
    push    ebx
    xor     esi,esi                          {这一句至关重要,开始时我没有清零ESI,则生成的注册码全是错的}
    mov     ebx, 1
   @004B2187:
    mov     edx, name                        {用户名放入EDX,用户名十六进制求和设为sum}
    movzx   edx, byte ptr [edx+ebx-1]
    add     esi, edx
    inc     ebx
    dec     eax
    jnz     @004B2187
   @004B2195:
    imul    eax, esi, $07F39F                { 把Sum*0x7F39F的值放入EAX}
    add     eax, $020                        { 上一步求出的值加上0x20}
    sar     eax, 1                           { 对EAX的值算数右移1位,值依旧放入EAX}
    jns     @004B21A5                        { 非负跳转}
    adc     eax, 0
    jmp     @004B21A5
   @004B21A5:
    mov     temp,eax
    pop     ebx
  end;
  Form1.Edit2.Text:=IntToStr(temp);
end;

end.
有什么问题大家尽管提,我这是自学并第一次使用嵌入汇编,可能有点不太精简呵呵,奥运快乐!!

注册机及其源码公布如下:
上传的附件 注册机源码.rar