playboysen 发表于 2008-8-8 19:24:19

【奥运献礼】MP3 Cutter Joiner新版 算法分析+Delphi嵌入汇编注册机

【破文标题】MP3 Cutter Joiner最新版 算法分析+Delphi嵌入汇编注册机
【破文作者】p layboysen
【作者邮箱】p [email protected]
【作者主页】p layboysen2.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
004B207C|.8B87 1C030000 mov   eax, dword ptr
004B2082|.E8 CD65FBFF   call    00468654                         ;求用户名长度
004B2087|.8B45 F4       mov   eax, dword ptr          ;用户名入EAX
004B208A|.8D55 FC       lea   edx, dword ptr
004B208D|.E8 3E67F5FF   call    004087D0
004B2092|.8D55 F0       lea   edx, dword ptr
004B2095|.8B45 FC       mov   eax, dword ptr
004B2098|.E8 6767F5FF   call    00408804
004B209D|.8B55 F0       mov   edx, dword ptr
004B20A0|.8D45 FC       lea   eax, dword ptr
004B20A3|.E8 3822F5FF   call    004042E0
004B20A8|.BB 15000000   mov   ebx, 15
004B20AD|.BE EC1B4C00   mov   esi, 004C1BEC
004B20B2|>8B45 FC       /mov   eax, dword ptr           ;用户名放入EAX
004B20B5|.8B16          |mov   edx, dword ptr             ;此处查看数据窗口会发现一个用户名表
004B20B7|.E8 9825F5FF   |call    00404654
004B20BC|.75 09         |jnz   short 004B20C7
004B20BE|.C605 5C3E4C00>|mov   byte ptr , 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 , 0             ;用户名若不是预定义的用户名中的一个,则提示错误
004B20D4|.74 1A         je      short 004B20F0
004B20D6|.6A 00         push    0                              ; /Arg1 = 00000000
004B20D8|.66:8B0D FC224>mov   cx, word ptr             ; |
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
004B20F3|.8B87 20030000 mov   eax, dword ptr
004B20F9|.E8 5665FBFF   call    00468654
004B20FE|.8B45 EC       mov   eax, dword ptr           ;假码放入EAX
004B2101|.8D55 F8       lea   edx, dword ptr
004B2104|.E8 C766F5FF   call    004087D0
004B2109|.8D55 E8       lea   edx, dword ptr
004B210C|.8B45 F8       mov   eax, dword ptr
004B210F|.E8 F066F5FF   call    00408804
004B2114|.8B55 E8       mov   edx, dword ptr
004B2117|.8D45 F8       lea   eax, dword ptr
004B211A|.E8 C121F5FF   call    004042E0
004B211F|.837D FC 00    cmp   dword ptr , 0             ;比较用户名是否为空
004B2123|.0F84 87010000 je      004B22B0
004B2129|.837D F8 00    cmp   dword ptr , 0             ;比较注册码是否为空
004B212D|.0F84 7D010000 je      004B22B0
004B2133|.8B45 F8       mov   eax, dword ptr          ;假码入栈
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           ;这个循环是在检测用户名是不是数字,不是则提示错误
004B2147|.0FB64C11 FF   |movzx   ecx, byte ptr
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          ; |
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
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           ;求用户名十六进制和,设为Sum
004B218A|.0FB6541A FF   |movzx   edx, byte ptr
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          ;假码放入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             ; |
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-BX1DUIT6-tV1S1IT6-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
    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.有什么问题大家尽管提,我这是自学并第一次使用嵌入汇编,可能有点不太精简呵呵,奥运快乐!!

注册机及其源码公布如下:

[ 本帖最后由 playboysen 于 2008-8-8 19:25 编辑 ]

luyigoog 发表于 2008-8-15 21:08:46

/:L 我菜鸟看不懂哦,看下学习下!

walili 发表于 2008-8-15 22:09:35

强人。。。。多谢分享。。。。/:good /:good /:good

ansongg 发表于 2008-8-16 00:12:00

牛人,先看看学习一下算法分析

hanyu 发表于 2008-10-28 22:32:43

学习了!/:012 /:012 /:012

lixupeng 发表于 2008-11-1 21:06:18

学习下/:014

neu21 发表于 2008-11-2 09:50:41

写的很精辟 谢谢分享学习下

939372735 发表于 2008-11-2 13:36:08

强人啊,学习。..

crackiss 发表于 2009-1-23 22:24:59

很好 有具体实例 我也去试试。。
页: [1]
查看完整版本: 【奥运献礼】MP3 Cutter Joiner新版 算法分析+Delphi嵌入汇编注册机