【破解作者】 海风月影 【作者邮箱】 zjhangtian@sohu.com 【使用工具】 od 1.10d,PEid,LoadPE,winHex,eXeScope 【破解平台】 WinXP 【软件名称】 魔术情书 6.55 【下载地址】 www.coolboo.com 【软件简介】 “魔术情书”是一款能由电脑自动书写情书的应用软件,有了她,可以让你从此不再为 写情书而烦恼,你只需轻轻点击几下鼠标就可以写出让你感到满意的情书。软件内含强 大情书库,可以用它书写出超过一万封不一样的情书,而且情书库可以随意地扩充。软 件内还带有一百多封古今中外经典的情书,只需点击鼠标,就可以自动套用:)你可以 选择“自动书写”、“模板式书写”及“组合式书写”这几种方式来快速写 情书,软 件支持在线发送情书,可以发送匿名邮件;可以将写的情书保存为“文本文件”、“Wo rd文档”、“ 网页文件”等等,在网页文件选项中还可以选择把文件保存为“烂漫星 空”、“趣味求爱”、“音乐动力”等等网页,可以让你写的情书更具吸引力、更能博 得你心目中的女神、白马王子的欢心。 此次升级新增几十个个实用的功能,情书库扩大了三倍,增强了非常实用的背景音乐功 能,在线发送情书功能支持需要认证的邮件服务器,可以发送邮件附件,使用了全新的 皮肤界面技术,可以任意更换界面(共有九种精彩界面),马上下载亲自体验一下吧!
【软件大小】 2M 【加壳方式】 upx 【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:) -------------------------------------------------------------------------------- 【破解内容】
一、破解过程
1、peid查壳,UPX 0.80 - 0.84 -> Markus & Laszlo, 是简单的压缩壳,脱壳过程就不写了,不会脱也没关系,反正后面我们要不脱壳打补丁
2、用od载入,F9运行,出现对话框,显示用了几次,因此,首先把nag去掉。如何确定调用nag的代码呢?我介绍一种自己的方法,打开内存(ALT+M),选中当前执行区域,这里是
内存镜像,项目 28 地址=00401000 大小=00197000 (1667072.) Owner=MSQingSh 00400000 区段=UPX0 类型=Imag 01001002 访问=R 初始访问=RWE
因为我们执行的位置在0056xxxx,属于上面那个区域。然后按F2,此时,程序被中断下来了
0044F25B E8 F8F9FFFF call MSQingSh.0044EC58 0044F260 E8 1F46FBFF call MSQingSh.00403884 0044F265 807D FB 00 cmp byte ptr ss:[ebp-5],0 0044F269 74 05 je short MSQingSh.0044F270 0044F26B E8 FC85FBFF call <jmp.&user32.WaitMessage> 0044F270 33C0 xor eax,eax ; 中断在这 0044F272 5A pop edx 0044F273 59 pop ecx 0044F274 59 pop ecx 0044F275 64:8910 mov dword ptr fs:[eax],edx 0044F278 68 92F24400 push MSQingSh.0044F292 0044F27D 8D45 F0 lea eax,dword ptr ss:[ebp-10] 0044F280 BA 02000000 mov edx,2 0044F285 E8 7E4BFBFF call MSQingSh.00403E08 0044F28A C3 retn
然后一路按F8,直到明显遇到一个循环,如下
0044BC11 E8 36BBFBFF call <jmp.&user32.SendMessageA> 0044BC16 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC19 33D2 xor edx,edx 0044BC1B 8990 34020000 mov dword ptr ds:[eax+234],edx 0044BC21 8B03 mov eax,dword ptr ds:[ebx] ; 从这 0044BC23 E8 D42D0000 call MSQingSh.0044E9FC 0044BC28 8B03 mov eax,dword ptr ds:[ebx] 0044BC2A 80B8 8C000000 00 cmp byte ptr ds:[eax+8C],0 0044BC31 74 0F je short MSQingSh.0044BC42 0044BC33 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC36 C780 34020000 02000000 mov dword ptr ds:[eax+234],2 0044BC40 EB 14 jmp short MSQingSh.0044BC56 0044BC42 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC45 83B8 34020000 00 cmp dword ptr ds:[eax+234],0 0044BC4C 74 08 je short MSQingSh.0044BC56 0044BC4E 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC51 E8 26FDFFFF call MSQingSh.0044B97C 0044BC56 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC59 8B80 34020000 mov eax,dword ptr ds:[eax+234] 0044BC5F 85C0 test eax,eax 0044BC61 ^ 74 BE je short MSQingSh.0044BC21 ; 到这,是消息循环 0044BC63 8945 F8 mov dword ptr ss:[ebp-8],eax ; 在这下断点 0044BC66 6A 00 push 0 0044BC68 6A 00 push 0 0044BC6A 68 01B00000 push 0B001 0044BC6F 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BC72 E8 D9ABFEFF call MSQingSh.00436850
这个循环是windows的消息循环,因为程序是用delphi写的,不容易看出来,当窗体卸载时就退出循环,因此在0044BC63下断点,F9运行 断在44bc63处,小心按F8,一步一步走,不断地 ret ,遇到下面的这样的 ret 直接跳
0044BC97 5A pop edx 0044BC98 59 pop ecx 0044BC99 59 pop ecx 0044BC9A 64:8910 mov dword ptr fs:[eax],edx 0044BC9D 68 B2BC4400 push MSQingSh.0044BCB2 ; 这是跳转地址 0044BCA2 8B45 FC mov eax,dword ptr ss:[ebp-4] 0044BCA5 E8 7AFDFFFF call MSQingSh.0044BA24 0044BCAA C3 retn ; 这个实际上是个跳转
前面一个push,后面一个ret,实际上就是一个jmp,因此只管跳,碰到下面的ret 就要注意了,恢复ebp 就代表这个过程结束了
0044BD73 8B45 F8 mov eax,dword ptr ss:[ebp-8] 0044BD76 5E pop esi 0044BD77 5B pop ebx 0044BD78 8BE5 mov esp,ebp 0044BD7A 5D pop ebp ; 恢复ebp了,就要注意了 0044BD7B C3 retn ; 这个ret返回后的地址要注意
ret 后来到552379,上面一行的 call 就是调用 nag 的call
0055236A A1 2C835600 mov eax,dword ptr ds:[56832C] 0055236F 8B00 mov eax,dword ptr ds:[eax] 00552371 8B10 mov edx,dword ptr ds:[eax] 00552373 FF92 D8000000 call dword ptr ds:[edx+D8] ; 这个call就是调用nag的call 00552379 33C0 xor eax,eax ; 返回到这 0055237B 5A pop edx 0055237C 59 pop ecx 0055237D 59 pop ecx 0055237E 64:8910 mov dword ptr fs:[eax],edx 00552381 68 A6235500 push MSQingSh.005523A6 00552386 A1 2C835600 mov eax,dword ptr ds:[56832C] 0055238B 8B00 mov eax,dword ptr ds:[eax]
把00552373这行nop掉,nag就没有了 ^_^
3、但还没有破解掉,因为虽然nag没了,但20次的限制还是有的,用了20次后碰到要注册的nag,这就说明这个nag是在上面去掉的nag前出现的,用od载入脱壳后的文件(不是把上面去掉nag的文件),F9运行,用刚才上面的方法确定nag的调用地址
005635D2 8990 EC020000 mov dword ptr ds:[eax+2EC],edx 005635D8 A1 CC825600 mov eax,dword ptr ds:[5682CC] 005635DD 8B00 mov eax,dword ptr ds:[eax] 005635DF E8 ACB5EEFF call MSQingSh.0044EB90 ; nag的call 005635E4 E8 9BCCFFFF call MSQingSh.00560284 ; 返回到这行 005635E9 E9 91070000 jmp MSQingSh.00563D7F ; 跳走就over了
然后向上看会发现很多这样的类似代码(call 44eb90 / call 560284 / jmp 563d7f),因此这段代码不能执行,一直向上看,代码类似就向上看直到看到代码不一样的时候,凭经验下断点(在跳转上下),然后重新运行,看看能否断下来。我找到一段可疑代码
0056218D 33DB xor ebx,ebx ;最可疑的是这里 ebx=0 0056218F A1 54D05600 mov eax,dword ptr ds:[56D054] 00562194 8B40 30 mov eax,dword ptr ds:[eax+30] 00562197 83C0 18 add eax,18 0056219A 8B15 B87E5600 mov edx,dword ptr ds:[567EB8] ; MSQingSh.0056B5E8 005621A0 8B52 24 mov edx,dword ptr ds:[edx+24] 005621A3 E8 901CEAFF call MSQingSh.00403E38 005621A8 8B15 B87E5600 mov edx,dword ptr ds:[567EB8] ; MSQingSh.0056B5E8 005621AE 8B52 20 mov edx,dword ptr ds:[edx+20] 005621B1 8BCB mov ecx,ebx 005621B3 A1 54D05600 mov eax,dword ptr ds:[56D054] 005621B8 E8 D358F0FF call MSQingSh.00467A90 ....... 中间有很多这样结构的代码,太长了,不帖了 ....... 00562823 8B15 B87E5600 mov edx,dword ptr ds:[567EB8] ; MSQingSh.0056B5E8 00562829 8B52 28 mov edx,dword ptr ds:[edx+28] 0056282C B9 674F0000 mov ecx,4F67 00562831 A1 60D05600 mov eax,dword ptr ds:[56D060] 00562836 E8 6DDDFFFF call MSQingSh.005605A8 0056283B E9 52100000 jmp MSQingSh.00563892 ;这里跳走
ebx = 0 ,猜测可能是清空计数器,从0开始计数(每次都清空,这样不就等于无限次数用了嘛^_^),记住行号0056218d,向上看有哪个跳转跳到这,很快就找到这里
00561FDB E8 B0CBEEFF call MSQingSh.0044EB90 00561FE0 E8 9FE2FFFF call MSQingSh.00560284 00561FE5 E9 951D0000 jmp MSQingSh.00563D7F 00561FEA E8 B1E2FFFF call MSQingSh.005602A0 ; 上面是无条件跳转,记住这个行号 00561FEF 803D 88D05600 00 cmp byte ptr ds:[56D088],0 00561FF6 74 43 je short MSQingSh.0056203B 00561FF8 803D 89D05600 00 cmp byte ptr ds:[56D089],0 00561FFF 74 3A je short MSQingSh.0056203B 00562001 803D 8AD05600 00 cmp byte ptr ds:[56D08A],0 00562008 74 31 je short MSQingSh.0056203B 0056200A 803D 8BD05600 00 cmp byte ptr ds:[56D08B],0 00562011 74 28 je short MSQingSh.0056203B 00562013 803D 8CD05600 00 cmp byte ptr ds:[56D08C],0 0056201A 74 1F je short MSQingSh.0056203B 0056201C 803D 8DD05600 00 cmp byte ptr ds:[56D08D],0 00562023 74 16 je short MSQingSh.0056203B 00562025 803D 8ED05600 00 cmp byte ptr ds:[56D08E],0 0056202C 74 0D je short MSQingSh.0056203B 0056202E 803D 8FD05600 00 cmp byte ptr ds:[56D08F],0 00562035 0F85 52010000 jnz MSQingSh.0056218D ; 找到这了,上面的都不能跳,这个要跳 0056203B A1 CC825600 mov eax,dword ptr ds:[5682CC] 00562040 8B00 mov eax,dword ptr ds:[eax]
在00561FEA下断点发现断不下来,所以继续向上找跳到00561FEA的跳转
00561B34 8B52 20 mov edx,dword ptr ds:[edx+20] 00561B37 B1 01 mov cl,1 00561B39 A1 54D05600 mov eax,dword ptr ds:[56D054] 00561B3E E8 C95DF0FF call MSQingSh.0046790C 00561B43 8BD8 mov ebx,eax 00561B45 84DB test bl,bl 00561B47 0F84 F30C0000 je MSQingSh.00562840 ; 这是关键的跳转,不能跳 00561B4D 8B0D B87E5600 mov ecx,dword ptr ds:[567EB8] ; MSQingSh.0056B5E8 00561B53 8B49 28 mov ecx,dword ptr ds:[ecx+28] 00561B56 8D85 ECFEFFFF lea eax,dword ptr ss:[ebp-114] 00561B5C 8B15 60D05600 mov edx,dword ptr ds:[56D060] 00561B62 E8 4925EAFF call MSQingSh.004040B0 00561B67 8B85 ECFEFFFF mov eax,dword ptr ss:[ebp-114] 00561B6D E8 D676EAFF call MSQingSh.00409248 00561B72 84C0 test al,al 00561B74 0F85 1E030000 jnz MSQingSh.00561E98 ;这些都不能跳,下面很多 ...... 中间很多这样的代码,省略 ...... 00561E69 75 2D jnz short MSQingSh.00561E98 ;不能跳 00561E6B 8B0D B87E5600 mov ecx,dword ptr ds:[567EB8] ; MSQingSh.0056B5E8 00561E71 8B49 70 mov ecx,dword ptr ds:[ecx+70] 00561E74 8D85 A4FEFFFF lea eax,dword ptr ss:[ebp-15C] 00561E7A 8B15 60D05600 mov edx,dword ptr ds:[56D060] 00561E80 E8 2B22EAFF call MSQingSh.004040B0 00561E85 8B85 A4FEFFFF mov eax,dword ptr ss:[ebp-15C] 00561E8B E8 B873EAFF call MSQingSh.00409248 00561E90 84C0 test al,al 00561E92 0F84 52010000 je MSQingSh.00561FEA ; 找到这,这个要跳 00561E98 A1 CC825600 mov eax,dword ptr ds:[5682CC] 00561E9D 8B00 mov eax,dword ptr ds:[eax] 00561E9F E8 54CCEEFF call MSQingSh.0044EAF8
找到
00561E92 0F84 52010000 je MSQingSh.00561FEA
但上面有很多
jnz short MSQingSh.00561E98
在第一个处下断点发现断不下来,因此找到关键的跳转
00561B47 0F84 F30C0000 je MSQingSh.00562840 ; 这是关键的跳转,不能跳
这是能断下来的跳转,直接改成 jmp 0056218D 跳到
0056218D 33DB xor ebx,ebx ;最可疑的是这里 ebx=0
因为中间的代码都是判断是否是第一次运行的,没必要执行,直接跳不影响结果,F9运行,果然出现了刚用了一次的nag(用没有去掉这个nag的文件),然后在nag掉下面这行
00552373 FF92 D8000000 call dword ptr ds:[edx+D8] ; 这个call就是调用nag的call
保存一下MSQingShu_cRacKEd.exe,运行一下,呵呵,成功了^_^! 此时次数已不受限制了,下面的第四步可有可无,但是考虑到这篇文章第二部分是逆向的,所以干脆就写详细点,把自己的名字也写进程序里^_^!
4、先确定自己名字的字符,新建文本文件,写入“cRacKEd bY 海风月影[NE365][DFCG]”,和“魔术情书 6.55 - cRacKEd bY 海风月影[NE365][DFCG]”,没有引号,前一个是放在about里的,后一个是标题栏。然后用winHex打开文件,看到16进制字符 用od运行破解后的程序,然后打开内存(ALT+M),点右键选搜索-整个区域,填入"(Richie)",没有引号,注意大小写,第一处
005C8540 69 6F 6E 06 13 D7 F7 D5 DF A3 BA D6 EC 20 BD AD ion作者:朱 江 005C8550 28 52 69 63 68 69 65 29 00 00 0F 54 62 73 53 6B (Richie)..TbsSk
这里是delphi的控件的属性,先记住偏移量005C8548,用loadPE查一下在文件里的偏移1c7148,用winHex修改此处的代码,保存,运行,发现没有用,这就说明在程序运行时修改了控件的属性,这条路走不通了。。。。。。
继续搜索下一个,搜到
00BB1B1C C4 A7 CA F5 C7 E9 CA E9 20 36 2E 35 35 20 20 20 魔术情书 6.55 00BB1B2C 20 20 D7 F7 D5 DF A3 BA D6 EC 20 BD AD 28 52 69 作者:朱 江(Ri 00BB1B3C 63 68 69 65 29 20 20 20 20 20 CD F8 D5 BE A3 BA chie) 网站: 00BB1B4C 77 77 77 2E 43 6F 6F 6C 42 6F 6F 2E 63 6F 6D 00 www.CoolBoo.com.
呵呵,这不是标题栏嘛,记住00BB1B1C这个地址,可惜,这个地址是动态生成的,原来程序文件里没有,因此要动态调试,用od重新载入,发现都没有00BB1B1C这个地址,看来要一步一步跟踪了,打开内存,把地址栏露出来能看到就行了,然后一步步跟踪,看看
内存镜像,项目 36 地址=00BB0000 大小=00088000 (557056.) Owner= 00BB0000 (itself) 区段= 类型=Priv 00021004 访问=RW 初始访问=
这个页面什么时候出来
00403AE4 8B04DF mov eax,dword ptr ds:[edi+ebx*8] ; 这个是循环 00403AE7 43 inc ebx 00403AE8 891D B0945600 mov dword ptr ds:[5694B0],ebx 00403AEE 85C0 test eax,eax 00403AF0 74 02 je short MSQingSh.00403AF4 00403AF2 FFD0 call eax ; 运行到某一个时出现页面,下断点 00403AF4 3BF3 cmp esi,ebx 00403AF6 ^ 7F EC jg short MSQingSh.00403AE4
在00403AF0下断点,F9慢慢按,发现页面出来了就转到00BB1B1C去看看,发现还全是00(幸运^_^),对00BB1B1C下内存写入断点,取消 call eax 的断点,F9运行,断在
00402980 FD std 00402981 F3:A5 rep movsd ; 断在这,不能F8走 00402983 89C1 mov ecx,eax &, nbsp; ; 在这下断点,F9运行,取消断点 00402985 83E1 03 and ecx,3 00402988 83C6 03 add esi,3 0040298B 83C7 03 add edi,3 0040298E F3:A4 rep movsb 00402990 FC cld 00402991 5F pop edi 00402992 5E pop esi 00402993 C3 retn
1 2 下一页 |