首页
社区
课程
招聘
[求助+讨论]破解一款软件的时间限制(练习用)
发表于: 2011-5-22 17:43 8596

[求助+讨论]破解一款软件的时间限制(练习用)

2011-5-22 17:43
8596
本人在看雪注册了帐号一直没上,近段时间有空了开始来看雪潜水。看到各大大无数精华,然后自己也开始找些简单的软件来练习破解。看了《加密与解密》第三版,关于破解软件的时间限制,心里痒痒的,于是打算自己找个软件分析。刚好看到一款软件是半免费的,作者自己都说了,只作了时间限制,如果试用时间到了只要调下时间就可以继续使用,而且产品是2009年的,就算破解了对作者也没影响。软件28M,已经放到了115网盘上面去,传送门:http://u.115.com/file/aqz6glak
        二话不说,拿出PEID分析,没有加壳,DELPHI写的程序,运行一下,弹出对话框:“软件已到期,请调整时间到2009年7月之前,继续试用”(程序太大DEDE加载分析时间太长,而且找不到关键的东西,直接放弃DEDE,本人菜鸟)。因为只有时间的限制,软件比较简单,立马拿出OD加载,查找字符串,找到
0099AEF0   mov eax,GYS2008_.0099B260                 软件已经到期...请调整电脑的系统时间到2009-07-10之前,继续试用
CTRL+G输入地址0099AEF0,下面是代码
0099AED8   call GYS2008_.009A663C
0099AEDD   xor edx,edx
0099AEDF   mov eax,dword ptr ss:[ebp-0x4]
0099AEE2   call GYS2008_.0099B538
0099AEE7   call GYS2008_.0099AC48
0099AEEC   test al,al
0099AEEE   jnz short GYS2008_.0099AF0B
0099AEF0    mov eax,GYS2008_.0099B260                ;  软件已经到期...请调整电脑的系统时间到2009-07-10之前,继续试用
0099AEF5    call GYS2008_.00445E00
0099AEFA   mov eax,dword ptr ds:[0xB2B0BC]
0099AEFF   mov eax,dword ptr ds:[eax]

         jnz short GYS2008_.0099AF0B直接改为jmp,OK,跳过了启动画面的时间验证。心里偷笑,正准备见主体时,哐的一下又弹出个时间对话框:“软件已到期,请登录××网站”。点确定直接退出了程序。
         继续OD载入,按照前辈们的帖子所说在时间函数上下断,getlocaltime,getsystemtime等函数下断点,结果发现程序不断的在获取时间,天啊,何年何月才能看到主体啊。放弃,自己下断找。载入程序F9一次,来到下面代码处:
00B12530 >/$>push ebp
00B12531  |.>mov ebp,esp
00B12533  |.>add esp,-0x18
00B12536  |.>push ebx

往下看一点,找到了关键的代码:
00B125D8  |.>mov edx,GYS2008_.00B12878                ;  asfggdfgfdgdfgdg
00B125DD  |.>call GYS2008_.00405938
00B125E2  |.>jnz short GYS2008_.00B125F0
00B125E4  |.>mov eax,dword ptr ds:[0xB2B0BC]
00B125E9  |.>mov eax,dword ptr ds:[eax]
00B125EB  |.>call GYS2008_.004AF3A0
00B125F0  |>>mov ecx,dword ptr ds:[0xB2ACD4]          ;  GYS2008_.00B3ABDC
00B125F6  |.>mov eax,dword ptr ds:[0xB2B0BC]
00B125FB  |.>mov eax,dword ptr ds:[eax]
00B125FD  |.>mov edx,dword ptr ds:[0x997194]          ;  GYS2008_.009971E0
00B12603    >call GYS2008_.004AF234                   ;  启动时的时间验证和初始化
00B12608  |.>mov ecx,dword ptr ds:[0xB2A774]          ;  GYS2008_.00B3A7C8
00B1260E  |.>mov eax,dword ptr ds:[0xB2B0BC]
00B12613  |.>mov eax,dword ptr ds:[eax]
00B12615  |.>mov edx,dword ptr ds:[0x943734]          ;  GYS2008_.00943780
00B1261B  |.>call GYS2008_.004AF234
00B12620  |.>mov ecx,dword ptr ds:[0xB2B63C]          ;  GYS2008_.00B31DF4
00B12626  |.>mov eax,dword ptr ds:[0xB2B0BC]
00B1262B  |.>mov eax,dword ptr ds:[eax]
00B1262D  |.>mov edx,dword ptr ds:[0x86F5CC]          ;  GYS2008_.0086F618
00B12633  |.>call GYS2008_.004AF234
00B12638  |.>mov eax,ebx
00B1263A  |.>call GYS2008_.004ABB90                   ;  
00B1263F    >mov eax,ebx
00B12641  |.>call GYS2008_.0040460C                   ;  
00B12646  |.>mov eax,dword ptr ds:[0xB2B0BC]
00B1264B  |.>mov eax,dword ptr ds:[eax]
00B1264D    >call GYS2008_.004AF2B4                   ;  关键CALL,要跟进去
00B12652  |.>xor eax,eax
00B12654  |.>pop edx
00B12655  |.>pop ecx
00B12656  |.>pop ecx

启动时的时间验证被我第一步JMP过去了,现在00B1264D    >call GYS2008_.004AF2B4这个关键CALL要跟进去。进去之后的代码如下:
004AF2B4   $>push ebp
004AF2B5   .>mov ebp,esp
004AF2B7   .>push ecx
004AF2B8   .>push ebx
004AF2B9   .>push esi
004AF2BA   .>push edi
004AF2BB   .>mov dword ptr ss:[ebp-0x4],eax
004AF2BE   .>mov eax,dword ptr ss:[ebp-0x4]
004AF2C1   .>mov byte ptr ds:[eax+0xA5],0x1
004AF2C8   .>xor edx,edx
004AF2CA   .>push ebp
004AF2CB   .>push GYS2008_.004AF392
004AF2D0   .>push dword ptr fs:[edx]
004AF2D3   .>mov dword ptr fs:[edx],esp
004AF2D6   .>mov eax,GYS2008_.004A5B44                ;  入口地址
004AF2DB    >call GYS2008_.0040A8BC                   ;  
004AF2E0    >mov eax,dword ptr ss:[ebp-0x4]
004AF2E3    >mov eax,dword ptr ds:[eax+0x44]
004AF2E6    >test eax,eax
004AF2E8    >je GYS2008_.004AF37A                     ;  这里不能跳,下面是计算过程
004AF2EE   .>mov edx,dword ptr ds:[0xB2AF24]          ;  GYS2008_.00B2C03C
004AF2F4   .>mov edx,dword ptr ds:[edx]
004AF2F6   .>sub edx,0x3                              ;  Switch (cases 3..7)
004AF2F9   .>je short GYS2008_.004AF309
004AF2FB   .>sub edx,0x4
004AF2FE   .>jnz short GYS2008_.004AF310
004AF300   .>mov byte ptr ds:[eax+0x22B],0x1          ;  Case 7 of switch 004AF2F6
004AF307   .>jmp short GYS2008_.004AF310
004AF309   >>mov dl,0x2                               ;  Case 3 of switch 004AF2F6
004AF30B   .>call GYS2008_.004A977C
004AF310   >>mov eax,dword ptr ss:[ebp-0x4]           ;  Default case of switch 004AF2F6
004AF313   .>cmp byte ptr ds:[eax+0x5B],0x0
004AF317    >je short GYS2008_.004AF339
004AF319   .>mov eax,dword ptr ss:[ebp-0x4]
004AF31C   .>mov eax,dword ptr ds:[eax+0x44]
004AF31F   .>cmp byte ptr ds:[eax+0x22B],0x1
004AF326   .>jnz short GYS2008_.004AF332
004AF328   .>mov eax,dword ptr ss:[ebp-0x4]
004AF32B   .>call GYS2008_.004AEBDC                   ;  程序主体出来了
004AF330   .>jmp short GYS2008_.004AF339
004AF332   >>mov dl,0x1
004AF334   .>call GYS2008_.004A8684
004AF339   >>xor eax,eax                              ;  下面开始计算
004AF33B   .>push ebp
004AF33C   .>push GYS2008_.004AF359
004AF341   .>push dword ptr fs:[eax]
004AF344   .>mov dword ptr fs:[eax],esp
004AF347   .>mov eax,dword ptr ss:[ebp-0x4]
004AF34A    >call GYS2008_.004AF120                   ;  关键CALL
004AF34F   .>xor eax,eax
004AF351   .>pop edx
004AF352   .>pop ecx
004AF353   .>pop ecx
004AF354   .>mov dword ptr fs:[eax],edx
004AF357   .>jmp short GYS2008_.004AF36E
004AF359   .>jmp GYS2008_.00404AEC
004AF35E   .>mov edx,dword ptr ss:[ebp-0x4]
004AF361   .>mov eax,dword ptr ss:[ebp-0x4]
004AF364   .>call GYS2008_.004AF3B4
004AF369   .>call GYS2008_.00404F18
004AF36E   >>mov eax,dword ptr ss:[ebp-0x4]
004AF371    >cmp byte ptr ds:[eax+0x9C],0x0
004AF378    >je short GYS2008_.004AF339               ;  while(1)的循环校验

我认为这个就是关键call,于是跟进去看看,来到下面的代码:
004AF120  /$>push ebx
004AF121  |.>add esp,-0x1C
004AF124  |.>mov ebx,eax
004AF126  |.>mov edx,esp
004AF128  |.>mov eax,ebx
004AF12A  |.>call GYS2008_.004AF070                   ;  关键CALL,消息队列的处理,和EDI的值有关
004AF12F  |.>test al,al
004AF131    >jnz short GYS2008_.004AF13C
004AF133  |.>mov edx,esp
004AF135  |.>mov eax,ebx
004AF137  |.>call GYS2008_.004AFA00                   ;  又一个CALL
004AF13C  |>>add esp,0x1C
004AF13F  |.>pop ebx
004AF140  \.>retn

在004AF12A  |.>call GYS2008_.004AF070 这个CALL跟进去看的时候发现是一个消息循环处理的CALL,跟了好长时间,没找到传入的参数对结果的影响(菜鸟的悲哀啊),但是消息处理的时候就会弹出时间验证的错误。然后我查找字符串找到字符串的位置:
009D669F   mov edx,GYS2008_.009D67A0                 http://www.f8246.com
009D698C   mov edx,GYS2008_.009D6A8C                 http://www.f8246.com
无奈找不到程序调用的地方,下断从来没断下过。于是用最后的手段(PS:手段太少了)作者自带了一个修改时间的批文件,于是修改时间,OD加载,程序传入参数和运行过程都一样,就是找不到关键点,郁闷 - -。进入程序主体后把时间改回来,结果一点菜单(比如打开文件)马上弹出来:“软件试用期已到,请修改系统时间”。用同样的方法去掉后就不断的出现读写错误(就算不去掉你点确定也一样),程序多个操作都对时间进行验证,settime不断的取时间判断。采用CCDebuger大大OllyDBG 入门系列(五)-消息断点及 RUN 跟踪的方法来通过菜单的操作找出判断的位置也没成功,这个东西搞了1天了都没搞定,心力交瘁,只好上来论坛裸跪求高手帮忙分析下,给出个过程让菜鸟学习下,越详细越好。本着学习的态度挂在论坛上裸跪等各位大大分析结果。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 160
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一个先,第一次发贴,如有冒犯之举请多多包涵
2011-5-22 17:45
0
雪    币: 35
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
注册了那么久,才发现俺还是初级会员,先看看
2011-5-23 00:11
0
雪    币: 697
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
您再研究下?上个图


上传的附件:
2011-5-23 11:45
0
雪    币: 160
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你在哪个函数下断的?我上面分析的流程哪个地方出现了疏落?还是哪个地方漏了?求指点
2011-5-23 14:58
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我也是个小菜也想看看这样的软件怎么破解.
2011-5-24 11:45
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
关注中,
不是要把所有判断都改掉吧
但是这个试用版连认证都没有
难道有个隐藏标志位?
2011-5-24 12:02
0
雪    币: 1270
活跃值: (3235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
软件内含 增强版
2011-5-24 13:29
0
雪    币: 413
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
来看看,来学习一下
2011-5-24 22:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
估计在软件里放置了N个暗桩,发现只要在源码外,控制整个程序,并且隔一段放一个类似while(time.now()>time) thead.sleep(50000);或者类似的变形,估计破解起来就难了。
2011-6-4 18:49
0
雪    币: 386
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
进展到什么情况了。。。
2011-6-4 22:22
0
游客
登录 | 注册 方可回帖
返回
//