首页
社区
课程
招聘
[原创]PCTimerExpert v1.4.7.8 注册算法分析
2005-6-12 04:19 8250

[原创]PCTimerExpert v1.4.7.8 注册算法分析

2005-6-12 04:19
8250
【破文标题】:PCTimerExpert v1.4.7.8 注册算法分析

【破文作者】:KuNgBiM[DFCG]

【作者邮箱】:gb_1227@163.com

【软件名称】:PCTimerExpert 1.4.7.8

【软件大小】:136 KB

【软件类别】:国产软件 / 共享版 / 开关定时

【整理时间】:2005-06-11

【下载地址】:[本地下载]

【软件简介】:PC定时执行专家( PCTimerExpert )是一个Visual C++ 制作,简单易用的“定时器”软件。有“定时关机”、“定时日程提醒”等功能。除了具有“PC定时关机精灵( PCTaskTimer )”的全部功能之外,还将会有更多的新功能加入。它是绿色的共享软件,无需安装,欢迎下载试用。注意未注册用户不能使用全部功能,需要注册才能使用的功能请参考本页的“主要功能和特点”。付费用户可享受技术支持和升级服务。

Unicode 版主要针对使用外文环境的用户,这个版本可是让你在英文、日文等外文的 Windows 系统下能正常地同时显示、输入外文和中文。

PC定时执行专家( PCTimerExpert )的由来:一直用着一个别人写的一个自动关机小程序,觉得界面有些难看,而且在日文的环境下有乱码的问题。索性自己写了一个完全英文的PCTimer小工具。只有3 个功能:注销、重启系统、关机。后来,觉得还可以加些功能,就成了现在的PC定时执行专家( PCTimerExpert )。

8 种时间指定方式(倒计时/ 伴随执行/ 具体时间/ 每时/ 每天/ 每周/ 每月/ 每年)
定时关机
定时休眠(需注册)
定时重启动
定时注销
定时清空回收站
关闭显示器(需注册)
执行屏幕保护
日程提醒(同时出现气泡提示和总在最前对话框)
定时弹出提示(气泡提示)
播放音乐(需注册)
播放电影
执行文件
执行程序
执行DOS命令
定时闹铃
整点报时
可以设定“Windows启动时自动运行”
可以设定“启动时最小化到任务栏”(需注册)
可以设定“记忆窗口的位置和大小”
限制系统中只能运行一个“PC定时执行专家”
最小化时自动变为托盘图标
托盘图标的右键菜单(立即执行:关机、休眠、关闭显示器、重启动、注销)

【保护方式】:注册码+功能限制

【编译语言】:Microsoft Visual C++ 6.0

【调试环境】:WinXP、PEiD、W32Dasm、Ollydbg

【破解日期】:2005-06-12

【破解目的】:研究算法分析

【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

―――――――――――――――――――――――――――――――――
【破解过程】:

侦测:用PEiD查壳,无壳,Microsoft Visual C++ 6.0 编译。

试探:运行主程序注册,输入注册码(试炼码),确认!程序提示"注册失败,请检查注册码是否正确!"

初步下药:使出法宝,用W32Dasm进行静态反汇编,失望的是,改程序为MFC42的程序,并且带有Anti-Loder功能,看来W32Dasm是没戏咯~

对症下药:Ollydbg载入主程序,加载完毕后,下命令:bp GetWindowTextA,然后F9运行:

77DF768E >  55              push ebp                        //第1次断下,F9继续
77DF768F    8BEC            mov ebp,esp
77DF7691    6A FF           push -1
77DF7693    68 8034DF77     push USER32.77DF3480
77DF7698    68 4CC7E377     push USER32.77E3C74C
........

77DF768E >  55              push ebp                        //第2次断下,同样F9继续
77DF768F    8BEC            mov ebp,esp
77DF7691    6A FF           push -1
77DF7693    68 8034DF77     push USER32.77DF3480
77DF7698    68 4CC7E377     push USER32.77E3C74C
........

77DF768E >  55              push ebp                        //第3次断下,同样F9继续,USER32.SendMessageA
77DF768F    8BEC            mov ebp,esp
77DF7691    6A FF           push -1
77DF7693    68 8034DF77     push USER32.77DF3480
77DF7698    68 4CC7E377     push USER32.77E3C74C
........

77DF768E >  55              push ebp                        //第4次断下,同样F9继续
77DF768F    8BEC            mov ebp,esp
77DF7691    6A FF           push -1
77DF7693    68 8034DF77     push USER32.77DF3480
77DF7698    68 4CC7E377     push USER32.77E3C74C
........

经过5次的F9后,程序终于来到了注册界面,输入试炼信息:

***** 试炼信息 *****

机器码:1757386560
注册码:9876543210

********************

点击“注册”后OD中断在:

77DF768E >  55              push ebp                        //中断在此!
77DF768F    8BEC            mov ebp,esp
77DF7691    6A FF           push -1
77DF7693    68 8034DF77     push USER32.77DF3480
77DF7698    68 4CC7E377     push USER32.77E3C74C
77DF769D    64:A1 00000000  mov eax,dword ptr fs:[0]
77DF76A3    50              push eax
77DF76A4    64:8925 0000000>mov dword ptr fs:[0],esp
77DF76AB    51              push ecx
77DF76AC    51              push ecx
77DF76AD    51              push ecx
77DF76AE    53              push ebx
77DF76AF    56              push esi
77DF76B0    57              push edi
77DF76B1    8965 E8         mov dword ptr ss:[ebp-18],esp
77DF76B4    8B7D 0C         mov edi,dword ptr ss:[ebp+C]
77DF76B7    85FF            test edi,edi
77DF76B9    74 58           je short USER32.77DF7713
77DF76BB    837D 10 00      cmp dword ptr ss:[ebp+10],0
77DF76BF    74 52           je short USER32.77DF7713
77DF76C1    8365 FC 00      and dword ptr ss:[ebp-4],0
77DF76C5    8027 00         and byte ptr ds:[edi],0
77DF76C8    8B4D 08         mov ecx,dword ptr ss:[ebp+8]
77DF76CB    E8 31CCFFFF     call USER32.77DF4301
77DF76D0    8BF0            mov esi,eax
77DF76D2    8975 E4         mov dword ptr ss:[ebp-1C],esi
77DF76D5    85F6            test esi,esi
77DF76D7    74 36           je short USER32.77DF770F
77DF76D9    56              push esi
77DF76DA    E8 59FFFFFF     call USER32.77DF7638
77DF76DF    85C0            test eax,eax
77DF76E1    6A 01           push 1
77DF76E3    57              push edi
77DF76E4    FF75 10         push dword ptr ss:[ebp+10]
77DF76E7    6A 0D           push 0D
77DF76E9    56              push esi
77DF76EA    74 07           je short USER32.77DF76F3
77DF76EC    E8 72E9FFFF     call USER32.77DF6063
77DF76F1    EB 05           jmp short USER32.77DF76F8
77DF76F3    E8 CCD1FFFF     call USER32.77DF48C4
77DF76F8    834D FC FF      or dword ptr ss:[ebp-4],FFFFFFFF
77DF76FC    EB 17           jmp short USER32.77DF7715
77DF76FE    6A 01           push 1
77DF7700    58              pop eax
77DF7701    C3              retn
77DF7702    8B65 E8         mov esp,dword ptr ss:[ebp-18]
77DF7705    68 78050000     push 578
77DF770A    E8 935E0100     call USER32.77E0D5A2
77DF770F    834D FC FF      or dword ptr ss:[ebp-4],FFFFFFFF
77DF7713    33C0            xor eax,eax
77DF7715    8B4D F0         mov ecx,dword ptr ss:[ebp-10]
77DF7718    64:890D 0000000>mov dword ptr fs:[0],ecx
77DF771F    5F              pop edi                                     //edi=00898730, (ASCII "9876543210")
77DF7720    5E              pop esi                                     //esi=00591F38
77DF7721    5B              pop ebx
77DF7722    C9              leave
77DF7723    C2 0C00         retn 0C                                     //返回到下面
........

6BC894AA    6A FF           push -1
6BC894AC    8BCF            mov ecx,edi
6BC894AE    E8 22EEFFFF     call MFC42.#5572                            //取注册码
6BC894B3    EB 13           jmp short MFC42.6BC894C8
6BC894B5    8BCE            mov ecx,esi
6BC894B7    E8 5D3D0000     call MFC42.#3092
6BC894BC    85C0            test eax,eax
6BC894BE    74 08           je short MFC42.6BC894C8
6BC894C0    57              push edi
6BC894C1    8BC8            mov ecx,eax
6BC894C3    E8 52FFFFFF     call MFC42.#3874                            //取注册码长度
6BC894C8    8B07            mov eax,dword ptr ds:[edi]                  //ASCII "9876543210",eax=0A
6BC894CA    5F              pop edi
6BC894CB    5E              pop esi
6BC894CC    8B40 F8         mov eax,dword ptr ds:[eax-8]                //ds:[00898728]=0000000A
6BC894CF    C2 0800         retn 8                                      //返回到下面关键计算部分!★
........

00404B9E    8B4424 08       mov eax,dword ptr ss:[esp+8]                //取试炼码长度,ASCII "9876543210",eax=0A
00404BA2    8B48 F8         mov ecx,dword ptr ds:[eax-8]                //把试炼码长度赋值给ECX
00404BA5    85C9            test ecx,ecx                                //判断注册码是否为空
00404BA7    75 0B           jnz short PCTimerE.00404BB4                 //不跳则死!
00404BA9    6A FF           push -1
00404BAB    6A 40           push 40
00404BAD    6A 78           push 78
00404BAF    E9 C5000000     jmp PCTimerE.00404C79                       //跳到注册失败
00404BB4    50              push eax                                    //eax=00898730, (ASCII "9876543210")
00404BB5    FF15 C8C54000   call dword ptr ds:[<&MSVCRT.atol>]          ; MSVCRT.atol
00404BBB    8BF0            mov esi,eax                                 //eax=4CB016EA,esi=6BCE2078
00404BBD    83C4 04         add esp,4
00404BC0    85F6            test esi,esi                                //esi=4CB016EA(转换值)
00404BC2    0F84 AB000000   je PCTimerE.00404C73                        //转换失败则跳死!
00404BC8    6A 00           push 0                                      //pFileSystemNameSize = NULL
00404BCA    6A 00           push 0                                      //pFileSystemNameBuffer = NULL
00404BCC    6A 00           push 0                                      //pFileSystemFlags = NULL
00404BCE    8D4C24 18       lea ecx,dword ptr ss:[esp+18]
00404BD2    6A 00           push 0                                      //pMaxFilenameLength = NULL
00404BD4    51              push ecx                                    //pVolumeSerialNumber
00404BD5    6A 00           push 0                                      //MaxVolumeNameSize = 0
00404BD7    6A 00           push 0                                      //VolumeNameBuffer = NULL
00404BD9    68 D4034100     push PCTimerE.004103D4                      //RootPathName = "c:\"
00404BDE    C74424 2C 00000>mov dword ptr ss:[esp+2C],0
00404BE6    FF15 6CC04000   call dword ptr ds:[<&KERNEL32.GetVolumeInfo>//KERNEL32.GetVolumeInformationA(取C盘序列号)
00404BEC    85C0            test eax,eax                                //取值成功记为1,eax=1
00404BEE    75 11           jnz short PCTimerE.00404C01                 //成功则跳向计算部分!
00404BF0    50              push eax
00404BF1    6A 30           push 30
00404BF3    68 B0034100     push PCTimerE.004103B0
00404BF8    E8 AD4E0000     call <jmp.&MFC42.#1200>
00404BFD    33C0            xor eax,eax
00404BFF    EB 15           jmp short PCTimerE.00404C16
00404C01    8B4C24 0C       mov ecx,dword ptr ss:[esp+C]                //成功后就跳到这里,并把序列号赋值给ECX
00404C05    8BD1            mov edx,ecx                                 //ecx=68C0884D,edx=00130608(取高16位)
00404C07    8BC1            mov eax,ecx                                 //ecx=68C0884D,eax=00000001(取低16位)
00404C09    C1EA 10         shr edx,10                                  //取高16位
00404C0C    2BC2            sub eax,edx                                 //减去高16位的值
00404C0E    81E1 FFFF0000   and ecx,0FFFF                               //取低16位
00404C14    2BC1            sub eax,ecx                                 //减去低16位的值
00404C16    8B15 C4D94000   mov edx,dword ptr ds:[40D9C4]               //再取一个常数值34D944EA,ds:[0040D9C4]=34D944EA
00404C1C    8BC8            mov ecx,eax                                 //上面的结果也保存到ECX中,eax=68BF9740,ecx=0000884D
00404C1E    C1E9 10         shr ecx,10                                  //取结果的高16位,ecx=68BF9740
00404C21    33D0            xor edx,eax                                 //将34D944EA与上面的结果作异或运算,eax Xor edx
00404C23    25 FFFF0000     and eax,0FFFF                               //取结果的低16位,eax=68BF9740
00404C28    2BD1            sub edx,ecx                                 //再减去高16位,ecx=000068BF,edx=5C66D3AA
00404C2A    2BD0            sub edx,eax                             //再减去低16位,EDX就是注册码,eax=00009740,edx=5C666AEB
00404C2C    33C0            xor eax,eax
00404C2E    3BD6            cmp edx,esi                                 //关键比较!
00404C30    0F94C0          sete al
00404C33    85C0            test eax,eax
00404C35    74 3C           je short PCTimerE.00404C73                  //不相等的话,就跳向注册失败!★爆破点★
00404C37    E8 3A4C0000     call <jmp.&MFC42.#1168>                     // AfxGetModuleState(void)
00404C3C    8B40 04         mov eax,dword ptr ds:[eax+4]
00404C3F    56              push esi
00404C40    68 8C034100     push PCTimerE.0041038C                      //ASCII "REGCODE"
00404C45    68 7C034100     push PCTimerE.0041037C                      //ASCII "Registration"
00404C4A    8BC8            mov ecx,eax
00404C4C    E8 5F4E0000     call <jmp.&MFC42.#6402>                     // WriteProfileInt(char const *,char const *,int)
00404C51    85C0            test eax,eax
00404C53    74 15           je short PCTimerE.00404C6A
00404C55    6A FF           push -1
00404C57    6A 40           push 40
00404C59    6A 79           push 79
00404C5B    E8 CE4B0000     call <jmp.&MFC42.#1199>                     // AfxMessageBox(“注册成功”)
00404C60    C705 780C4100 0>mov dword ptr ds:[410C78],1
00404C6A    8BCB            mov ecx,ebx
00404C6C    E8 274E0000     call <jmp.&MFC42.#4853>                     // CDialog::OnOK(void)
00404C71    EB 0B           jmp short PCTimerE.00404C7E
00404C73    6A FF           push -1
00404C75    6A 40           push 40
00404C77    6A 7A           push 7A
00404C79    E8 B04B0000     call <jmp.&MFC42.#1199>                     // AfxMessageBox(“注册失败”)
00404C7E    8D4C24 08       lea ecx,dword ptr ss:[esp+8]
00404C82    C74424 18 FFFFF>mov dword ptr ss:[esp+18],-1
00404C8A    E8 A54B0000     call <jmp.&MFC42.#800>
00404C8F    8B4C24 10       mov ecx,dword ptr ss:[esp+10]
00404C93    5E              pop esi
00404C94    5B              pop ebx
00404C95    64:890D 0000000>mov dword ptr fs:[0],ecx
00404C9C    83C4 14         add esp,14
00404C9F    C3              retn                                        //返回程序

-------------------------------------------------------------------------------------------------------------------------
【算法总结】

注册验证非常简单:

1.先把十进制的机器码转换为16进制代码,记作ZHM1。(例:1757386560 = 68BF9740)

2.接着用ZHM1与一个常数(34D944EA)异或,再减去ZHM1的高16位和低16位,记作ZHM2。
(例:即68BF9740 Xor 34D944EA - 68BF - 9740 = 5C65D3AB)

3.最后把ZHM2再转换成十进制数,作为注册码SN。

=================================

注册信息:

机器码:1757386560
注册码:1550177195

=================================

〓本文完〓

--------------------------------------------------------------------------

版权所有(C)2005 KuNgBiM[DFCG]         Copyright (C) 2005 KuNgBiM[DFCG]

--------------------------------------------------------------------------
          Cracked BY KuNgBiM[DFCG]

                2005-06-12

                4:07:27 AM

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
wenglingok 26 2005-6-12 07:35
2
0
支持
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
lnn1123 13 2005-6-12 10:00
3
0
我怎么就找不到这么简单的注册算法的软件。
雪    币: 273
活跃值: (250)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
fcrjzmd 10 2005-6-12 11:29
4
0
K兄真是高产哦。。值得学习。。
雪    币: 151
活跃值: (66)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
shuair 2 2005-6-12 11:33
5
0
我也是,我每次要破的都没那么简单找到关键位置,运气太不好了。技术也差...闷,好久没写出文章来了。.
雪    币: 255
活跃值: (175)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
lee 3 2005-6-12 13:10
6
0
这么快出新的啦。

我破的时候才1.3.3.破解过程

不过算法没变哦。。。。呵呵~~~~~~~~~~~~~~~~~``
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
KuNgBiM 66 2005-6-13 00:20
7
0
最初由 lee 发布
这么快出新的啦。

我破的时候才1.3.3.破解过程

不过算法没变哦。。。。呵呵~~~~~~~~~~~~~~~~~``


哦?是吗?我到没注意你的分析哈~~`
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
liyangsj 25 2005-6-13 06:49
8
0
老兄真勤快!
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
yuqli 2 2005-6-13 12:21
9
0
就2个字 佩服~~~
游客
登录 | 注册 方可回帖
返回