安全中国首页 > 文章中心 > 补丁技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

魔术情书 6.55 破解过程+不脱壳打破解补丁

更新时间:2007-9-27 20:38:25
责任编辑:池天
热 点:
【破解作者】 海风月影
【作者邮箱】 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 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画