zaas 发表于 2011-1-31 13:21

TimeToPhoto v 2.64591代码修补术

【破文标题】:TimeToPhoto v 2.64591代码修补术
【破文作者】:zaas
【破解工具】: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
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:
005AF5FB    64:8920         mov   dword ptr fs:, esp
005AF5FE    8D55 F8         lea   edx, dword ptr
005AF601    B8 8CF65A00   mov   eax, 005AF68C                  ; CERT_NT
005AF606    E8 FD53E6FF   call    00414A08
005AF60B    8B45 F8         mov   eax, dword ptr
005AF60E    8D55 FC         lea   edx, dword ptr
005AF611    E8 BED6E5FF   call    0040CCD4
005AF616    8B45 FC         mov   eax, dword ptr
005AF619    BA A8F65A00   mov   edx, 005AF6A8                  ; Valid
005AF61E    E8 5177E5FF   call    00406D74
005AF623    0F94C0          sete    al
005AF626    C705 0CA95C00 1>mov   dword ptr , 14
005AF630    84C0            test    al, al
005AF632    75 0C         jnz   short 005AF640
005AF634    C705 0CA95C00 1>mov   dword ptr , 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 , 14
0x14=20,似乎是一个全局变量。对它下硬件断点,再次载入图片时,成功断下:
005B237D    3B05 0CA95C00   cmp   eax, dword ptr
005B2383    7F 0C         jg      short 005B2391
005B2385    55            push    ebp
005B2386    8B45 F8         mov   eax, dword ptr

显然,超过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
005B396E    8B40 FC         mov   eax, dword ptr
005B3971    8B80 CC050000   mov   eax, dword ptr
005B3977    8B80 EC020000   mov   eax, dword ptr
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
005B3C75    8B80 CC050000   mov   eax, dword ptr
005B3C7B    8B80 EC020000   mov   eax, dword ptr
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编程部分还不熟,要写出来不是不可能,不过要查阅很多资料,慢慢试验,可是我很懒。。。

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

yjd333 发表于 2011-1-31 23:41

od调。net{:1_921:}

不舍远走 发表于 2011-2-2 01:47

{:1_932:}牛人啊~

jan1013 发表于 2011-2-6 21:35

老天啊,你真给力!
页: [1]
查看完整版本: TimeToPhoto v 2.64591代码修补术