本人在看雪注册了帐号一直没上,近段时间有空了开始来看雪潜水。看到各大大无数精华,然后自己也开始找些简单的软件来练习破解。看了《加密与解密》第三版,关于破解软件的时间限制,心里痒痒的,于是打算自己找个软件分析
。刚好看到一款软件是半免费的,作者自己都说了,只作了时间限制,如果试用时间到了只要调下时间就可以继续使用,而且产品是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天了都没搞定,心力交瘁,只好上来论坛裸跪求高手帮忙分析下,给出个过程让菜鸟学习下,越详细越好
。本着学习的态度挂在论坛上裸跪等各位大大分析结果。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课