【奥运献礼】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 编辑 ] /:L 我菜鸟看不懂哦,看下学习下! 强人。。。。多谢分享。。。。/:good /:good /:good 牛人,先看看学习一下算法分析 学习了!/:012 /:012 /:012 学习下/:014 写的很精辟 谢谢分享学习下 强人啊,学习。.. 很好 有具体实例 我也去试试。。
页:
[1]