【破文标题】: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编程部分还不熟,要写出来不是不可能,不过要查阅很多资料,慢慢试验,可是我很懒。。。

【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!