【文章标题】: 暴力破解MP3 Cutter Joiner1.17
【文章作者】: Sirius
【作者邮箱】: sirius007@21cn.com
【作者QQ号】: 78644612
【软件名称】: MP3 Cutter Joiner
【软件大小】: 1.22M
【下载地址】: 自己搜索下载
【加壳方式】: 没有
【保护方式】: 使用次数限制+注册提示框
【编写语言】: Object Pascal
【使用工具】: Ollydbg+UltraEdit
【操作平台】: Win XP
【软件介绍】: 一款可以进行大多数音频之间的转换,截取的软件!
【作者声明】: 只为技术而破解,试图探讨一下此类软件的解密方法。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
前言:好久没有搞过这个了,都手生了!无奈刚买了手机想做铃声,随便下了个软件回去发现还挺好用,可惜未注册版本只能处理15个文件!只好自己动手丰衣足食了,也就当纪念一下我新买的K800i吧!呵呵!
----------------------------------------------------------------------------------------
侦壳脱壳:用PEiD查壳,无壳!直接用W32Dasm反汇编发现不能在W32Dasm下面下断!难道Object Pascal的程序,哦,是用depil编译器编译的!不能在W32Dasm下面调试?请高手告知!
破解过程:
用Ollydbg载入,搜索所有参考字符串,发现"Invalid register code! Please retry!"和一处"Congratuation! You have successfully registered!".在三处全部下断,双击第一处"Invalid register code! Please retry!"来到这里:
004BA762 /74 1A je short MP3_Cutt.004BA77E //这里有个跳转很可疑,在这里也下断!原来这里是比对输入的注册名是否合适!合适才跳
004BA764 |6A 00 push 0
004BA766 |66:8B0D F8A84B0>mov cx,word ptr ds:[4BA8F8]
004BA76D |B2 02 mov dl,2
004BA76F |B8 04A94B00 mov eax,MP3_Cutt.004BA904 //双击来到这里 ; ASCII "Invalid register code! Please retry!"
004BA774 |E8 A70DF8FF call MP3_Cutt.0043B520
004BA779 |E9 2E010000 jmp MP3_Cutt.004BA8AC //跳死了!
004BA77E \8D55 EC lea edx,dword ptr ss:[ebp-14] //刚开始这个跳转不能实现,改掉让他坚决跳,呵呵!
004BA781 8B87 18030000 mov eax,dword ptr ds:[edi+318] //从这里开始是检查注册码格式是否正确
004BA787 E8 A876F8FF call MP3_Cutt.00441E34 //下面就是去注册名和注册码了
004BA78C 8B45 EC mov eax,dword ptr ss:[ebp-14] //下面取注册名地址 内容
004BA78F 8D55 F8 lea edx,dword ptr ss:[ebp-8]
004BA792 E8 89E5F4FF call MP3_Cutt.00408D20
004BA797 8D55 E8 lea edx,dword ptr ss:[ebp-18]
004BA79A 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004BA79D E8 B2E5F4FF call MP3_Cutt.00408D54
004BA7A2 8B55 E8 mov edx,dword ptr ss:[ebp-18]
004BA7A5 8D45 F8 lea eax,dword ptr ss:[ebp-8]
004BA7A8 E8 8F9FF4FF call MP3_Cutt.0040473C
004BA7AD 837D FC 00 cmp dword ptr ss:[ebp-4],0
004BA7B1 0F84 F5000000 je MP3_Cutt.004BA8AC
004BA7B7 837D F8 00 cmp dword ptr ss:[ebp-8],0
004BA7BB 0F84 EB000000 je MP3_Cutt.004BA8AC
004BA7C1 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004BA7C4 E8 93A1F4FF call MP3_Cutt.0040495C
004BA7C9 85C0 test eax,eax
004BA7CB 7E 38 jle short MP3_Cutt.004BA805
004BA7CD BA 01000000 mov edx,1
004BA7D2 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
004BA7D5 0FB64C11 FF movzx ecx,byte ptr ds:[ecx+edx-1]
004BA7DA 83F9 30 cmp ecx,30
004BA7DD 7C 08 jl short MP3_Cutt.004BA7E7
004BA7DF 8B5D F8 mov ebx,dword ptr ss:[ebp-8]
004BA7E2 83F9 39 cmp ecx,39
004BA7E5 7E 1A jle short MP3_Cutt.004BA801
004BA7E7 6A 00 push 0
004BA7E9 66:8B0D F8A84B0>mov cx,word ptr ds:[4BA8F8]
004BA7F0 B2 02 mov dl,2
004BA7F2 B8 04A94B00 mov eax,MP3_Cutt.004BA904 ; ASCII "Invalid register code! Please retry!"
.
.
.
先让程序跑起来,F9运行,输入注册名sirius,假码1234567,被拦,停在004BA762,显示这个跳转实现不了,再F9就跳死了!
先把这个改掉,打开UltraEdit找到偏移地址把741A改成EB1A,让它跳过去先!
用Ollydbg再次载入这次运行停在004BA76F这里,看来跳过了注册名检查,再往下分析:
双击"Congratuation! You have successfully registered!"来到下面:
004BA831 79 03 jns short MP3_Cutt.004BA836
004BA833 83D0 00 adc eax,0
004BA836 8BF0 mov esi,eax
004BA838 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004BA83B E8 10E6F4FF call MP3_Cutt.00408E50
004BA840 3BF0 cmp esi,eax //这个地方是不是很可疑啊,标准比对格式啊!
004BA842 75 53 jnz short MP3_Cutt.004BA897 //最后结果比对,不正确就跳,我们输入的是假码肯定不正确了,所以不要让它跳,把这句抹掉.
004BA844 6A 00 push 0
004BA846 66:8B0D F8A84B0>mov cx,word ptr ds:[4BA8F8]
004BA84D B2 02 mov dl,2
004BA84F B8 34A94B00 mov eax,MP3_Cutt.004BA934 程序运行到这里就出现"Congratuation! You have successfully registered!"的正确信息了//双击来到这里 ; ASCII"Congratuation! You have successfully registered!"
004BA854 E8 C70CF8FF call MP3_Cutt.0043B520
004BA859 A1 3CDE4C00 mov eax,dword ptr ds:[4CDE3C]
004BA85E C600 01 mov byte ptr ds:[eax],1
004BA861 A1 38DF4C00 mov eax,dword ptr ds:[4CDF38]
004BA866 8B00 mov eax,dword ptr ds:[eax]
004BA868 33C9 xor ecx,ecx
004BA86A BA 04000000 mov edx,4
004BA86F 8B18 mov ebx,dword ptr ds:[eax]
004BA871 FF53 10 call dword ptr ds:[ebx+10]
004BA874 8B15 3CDE4C00 mov edx,dword ptr ds:[4CDE3C] ; MP3_Cutt.004CFE56
004BA87A A1 38DF4C00 mov eax,dword ptr ds:[4CDF38]
004BA87F 8B00 mov eax,dword ptr ds:[eax]
004BA881 B9 01000000 mov ecx,1
004BA886 E8 A10CF6FF call MP3_Cutt.0041B52C
004BA88B A1 04FE4C00 mov eax,dword ptr ds:[4CFE04]
004BA890 E8 2B3EFAFF call MP3_Cutt.0045E6C0
004BA895 EB 15 jmp short MP3_Cutt.004BA8AC
004BA897 6A 00 push 0
004BA899 66:8B0D F8A84B0>mov cx,word ptr ds:[4BA8F8]
004BA8A0 B2 02 mov dl,2
004BA8A2 B8 04A94B00 mov eax,MP3_Cutt.004BA904 ; ASCII "Invalid register code! Please retry!"
004BA8A2 B8 04A94B00 mov eax,MP3_Cutt.004BA904 ; ASCII "Invalid register code! Please retry!"
004BA8A7 E8 740CF8FF call MP3_Cutt.0043B520
004BA8AC 33C0 xor eax,eax
004BA8AE 5A pop edx
004BA8AF 59 pop ecx
004BA8B0 59 pop ecx
.
.
.
好了,分析完了,再次打开UltraEdit到004BA842的偏移地址,把这句抹掉,即把004BA842 的 7553 改成9090!再次保存,OK!
把修改的文件复制到MP3 Cutter Joiner文件夹运行,在注册提示里填入任意的注册名和注册码,点注册,注册成功,^_^!
--------------------------------------------------------------------------------
【经验总结】
软件不错,就是加密太脆弱了,虽然没有看到密码明文(没有在子CALL里跟),但是加密程序太明显了,三个"Invalid register code! Please retry!"组成了一个完整的注册算法,中间放了一个"Congratuation! You have successfully registered!"
这个太明显了!不用跟进就知道怎么一回事了,一共改两个地方,第一个是让它来到注册的地方,第二个是让它来到正确提示的地方,就这么简单!子CALL也懒得跟了,等有时间在看看吧,大概扫了一下算法还挺长的,但是有什么用呢?赶紧先去做铃声了!
嘿嘿!现在上班了,也不上进了.也就是图个方便才这么搞一下,平时懒得动,呵呵!还是学生时代好啊!
_____________________________@
№←┥在一个皓圆之夜,缓缓走来一匹西北狼!
对着明月,仰天长啸!!!
???!!!~~~~~~~ㄨ⌒Ψ^ō^.....
?①?②西北^犭良ㄌ
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年09月23日 Sirius 09:11:04
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!