【破文标题】:TimeToPhoto v 2.64591代码修补术
【破文作者】:zaas[PYG]
【破解工具】:OllyICE,PEiD v0.94
【破解平台】:WinXP
【软件类别】:国外软件/图像处理
【软件授权】:共享版
【软件介绍】:TimeToPhoto 可以在用户的数码照片印上拍照日期和时间,同时它还可以让用户在照片上写上简单的标签。
【破解声明】:我是一只小菜鸟,偶得一点心得,愿与大家分享
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
首先查壳:Microsoft Visual Studio .NET 2005 -- 2008 -> Microsoft Corporation *
以为是很简单的软件,od载入一看,有点头晕:区段有15个,代码是加密的,在内存中解压缩出来的,例如
Memory map, 条目 31
地址=005ED000
大小=000B0000 (720896.)
属主=TimeToPh 00400000
区段=.text1
包含=SFX,代码
类型=Imag 01001002
访问=R
初始访问=RWE
这样的程序就有点烦了,不能直接修改代码,比较痛苦。自己看了一下,软件代码段实际解压到005A000区段了。
在该区段搜索字符串,有收获:
地址=005AC55D
反汇编=mov edx, 005AC5D4
文本字符串=REGISTERED VERSION
双击进入:005AC554 E8 8F300000 call 005AF5E8
005AC559 84C0 test al, al
005AC55B 74 12 je short 005AC56F
005AC55D BA D4C55A00 mov edx, 005AC5D4 ; REGISTERED VERSION
005AC562 8B83 98030000 mov eax, dword ptr [ebx+398]
005AC568 E8 9737EEFF call 0048FD04
005AC56D EB 10 jmp short 005AC57F
005AC56F BA 08C65A00 mov edx, 005AC608 ; EVALUATION VERSION
显然上部的call是关键call了,跟进可知:005AF5E8 55 push ebp
005AF5E9 8BEC mov ebp, esp
005AF5EB 6A 00 push 0
005AF5ED 6A 00 push 0
005AF5EF 53 push ebx
005AF5F0 33C0 xor eax, eax
005AF5F2 55 push ebp
005AF5F3 68 71F65A00 push 005AF671
005AF5F8 64:FF30 push dword ptr fs:[eax]
005AF5FB 64:8920 mov dword ptr fs:[eax], esp
005AF5FE 8D55 F8 lea edx, dword ptr [ebp-8]
005AF601 B8 8CF65A00 mov eax, 005AF68C ; CERT_NT
005AF606 E8 FD53E6FF call 00414A08
005AF60B 8B45 F8 mov eax, dword ptr [ebp-8]
005AF60E 8D55 FC lea edx, dword ptr [ebp-4]
005AF611 E8 BED6E5FF call 0040CCD4
005AF616 8B45 FC mov eax, dword ptr [ebp-4]
005AF619 BA A8F65A00 mov edx, 005AF6A8 ; Valid
005AF61E E8 5177E5FF call 00406D74
005AF623 0F94C0 sete al
005AF626 C705 0CA95C00 1>mov dword ptr [5CA90C], 14
005AF630 84C0 test al, al
005AF632 75 0C jnz short 005AF640
005AF634 C705 0CA95C00 1>mov dword ptr [5CA90C], 14
005AF63E EB 14 jmp short 005AF654
当eax=edx=valid时,注册成功。跟踪可知,启动验证,NAG,关于窗口,转换图片时均通过这个call做一次验证,因此,
修改005AF623 0F94C0 sete al为setne al 即可达到目的。
但事情并没有这么简单,当你载入超过20张以上图片时,软件会弹出窗口,未注册版不能一次处理20张以上图片云云。。。
注意到以上代码:005AF626 C705 0CA95C00 1>mov dword ptr [5CA90C], 14
0x14=20,似乎[5CA90C]是一个全局变量。对它下硬件断点,再次载入图片时,成功断下:005B237D 3B05 0CA95C00 cmp eax, dword ptr [5CA90C]
005B2383 7F 0C jg short 005B2391
005B2385 55 push ebp
005B2386 8B45 F8 mov eax, dword ptr [ebp-8]
显然,超过20张图片就会跳到显示NAG要求注册的部分了。简单任务,修改005B2383 7F 0C jg short 005B2391为 7F00就没问题了。
接下来就是转换图片部分,软件的转换部分也是通过内存中自解压源代码实现的,经过多次运行,发现软件存在一个bug,载入图片可以是20张,而可以正常转换的软件却只有13张,为此研究了很久后来发现是软件作者的失误,推测是0x13写成13了,因此只能转换13张图片:005B3BC1 E8 22BAFFFF call 005AF5E8
005B3BC6 84C0 test al, al
005B3BC8 0F85 9E000000 jnz 005B3C6C
005B3BCE 55 push ebp
005B3BCF 33C0 xor eax, eax
005B3BD1 E8 76FDFFFF call 005B394C
005B3BD6 59 pop ecx
005B3BD7 55 push ebp
005B3BD8 B8 01000000 mov eax, 1
005B3BDD E8 6AFDFFFF call 005B394C
005B3BE2 59 pop ecx
005B3BE3 55 push ebp
005B3BE4 B8 02000000 mov eax, 2
005B3BE9 E8 5EFDFFFF call 005B394C
005B3BEE 59 pop ecx
005B3BEF 55 push ebp
005B3BF0 B8 03000000 mov eax, 3
005B3BF5 E8 52FDFFFF call 005B394C
005B3BFA 59 pop ecx
005B3BFB 55 push ebp
005B3BFC B8 04000000 mov eax, 4
005B3C01 E8 46FDFFFF call 005B394C
005B3C06 59 pop ecx
005B3C07 55 push ebp
005B3C08 B8 05000000 mov eax, 5
005B3C0D E8 3AFDFFFF call 005B394C
005B3C12 59 pop ecx
005B3C13 55 push ebp
005B3C14 B8 06000000 mov eax, 6
005B3C19 E8 2EFDFFFF call 005B394C
005B3C1E 59 pop ecx
005B3C1F 55 push ebp
005B3C20 B8 07000000 mov eax, 7
005B3C25 E8 22FDFFFF call 005B394C
005B3C2A 59 pop ecx
005B3C2B 55 push ebp
005B3C2C B8 08000000 mov eax, 8
005B3C31 E8 16FDFFFF call 005B394C
005B3C36 59 pop ecx
005B3C37 55 push ebp
005B3C38 B8 09000000 mov eax, 9
005B3C3D E8 0AFDFFFF call 005B394C
005B3C42 59 pop ecx
005B3C43 55 push ebp
005B3C44 B8 0A000000 mov eax, 0A
005B3C49 E8 FEFCFFFF call 005B394C
005B3C4E 59 pop ecx
005B3C4F 55 push ebp
005B3C50 B8 0B000000 mov eax, 0B
005B3C55 E8 F2FCFFFF call 005B394C
005B3C5A 59 pop ecx
005B3C5B 55 push ebp
005B3C5C B8 0C000000 mov eax, 0C
005B3C61 E8 E6FCFFFF call 005B394C
005B3C66 59 pop ecx
005B3C67 E9 16010000 jmp 005B3D82
005B3C6C 90 nop
005B3C6D 90 nop
005B3C6E 90 nop
005B3C6F 90 nop
005B3C70 90 nop
005B3C71 90 nop
005B3C72 90 nop
005B3C73 90 nop
005B3C74 90 nop
005B3C75 90 nop
005B3C76 90 nop
005B3C77 90 nop
005B3C78 90 nop
当注册验证无误的时候,程序会直接跳到005B3C6C,这里有大段的Nop。如果是未注册版本,顺序执行上边的call为20个图片添加水印。因此推测,软件注册成功会在这里添加正常转换的代码。为此找了很久,限于水平(也可能是没有耐心)没有找到相关的call。既然软件前20个图片可以正常转换,何不自己修补下代码,让他循环起来把所有图片都处理了不就完了嘛!在call里边跟了跟,发现载入的图片数在这里:005B396B 8B45 08 mov eax, dword ptr [ebp+8]
005B396E 8B40 FC mov eax, dword ptr [eax-4]
005B3971 8B80 CC050000 mov eax, dword ptr [eax+5CC]
005B3977 8B80 EC020000 mov eax, dword ptr [eax+2EC]
005B397D E8 3A3DE7FF call 004276BC
005B3982 48 dec eax
这个call得出的就是载入图片的总数。查找ebp的位置,改写代码005B3C6C 55 push ebp ; 保存现场
005B3C6D 53 push ebx ; 保存现场
005B3C6E 33DB xor ebx, ebx ; 计数器
005B3C70 8BC5 mov eax, ebp ; 取得载入的图片数所在的位置
005B3C72 8B40 FC mov eax, dword ptr [eax-4]
005B3C75 8B80 CC050000 mov eax, dword ptr [eax+5CC]
005B3C7B 8B80 EC020000 mov eax, dword ptr [eax+2EC]
005B3C81 E8 363AE7FF call 004276BC ; 取得载入的图片数
005B3C86 48 dec eax
005B3C87 3BD8 cmp ebx, eax ; 跟计数器比较
005B3C89 7F 0C jg short 005B3C97 ; 处理完了就跳走
005B3C8B 8BC3 mov eax, ebx
005B3C8D 43 inc ebx ; 计数器+1
005B3C8E 55 push ebp
005B3C8F E8 B8FCFFFF call 005B394C ; 处理图片
005B3C94 59 pop ecx
005B3C95 ^ EB D9 jmp short 005B3C70 ; 返回处理下一张
005B3C97 5B pop ebx ; 恢复现场
005B3C98 5D pop ebp ; 恢复现场
【题外的话】软件的关键代码不但需要运行中解压出来,而且还加了花指令。偶是壳盲,对dump代码部分一窍不通。想到的解决方案有3:
1。找到源代码的解码方法,把自己需要修改的地方逆回去写入源代码
2。用loader解决。好用的loader还真难找。樱花补丁制作工具似乎和系统有冲突或者其他原因,对代码的搜索替换似乎晚了一步,有时候Nag都出来了那边代码才修改完。。。时灵时不灵的。
3。自己写一个loader。呵呵。。。可惜自己windows编程部分还不熟,要写出来不是不可能,不过要查阅很多资料,慢慢试验,可是我很懒。。。
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
|