| 关键词: nbsp 00490 dword ptr mov ebp cac ss edx eax |
【软件名称】computer Alarm Clock【应用平台】Win9x/NT/2000/XP【软件大小】660KB(package)【软件限制】功能限制【破解声明】破解只是感兴趣,无其它目的。失误之处敬请诸位大侠赐教!【破解工具】fi.exe ollydbg.exe【软件简介】Computer Alarm Clock is a desktop program with full-featured alarm system, that allow an user to set multiple alarms. Each alarm can be set to play MP3 songs, CDtracks, videos and MPEG movies or just display a message. Computer Alarm Clock can be vastly customized and the whole package size is 660 Kb only! ========================================================================================【分析过程】用户名:ligyuan试验码:123456789这个软件不知道是什么时候下的,今天有时间就安装后看了下,软件无壳,未注册,每次启动都要弹出注册窗口,软件注册后要重启后进行验证,估计是读注册表或文件,bp RegQueryValue ,CreateFileA 下断点,读取文件时被拦下,F2取消断点,ALT+F9返回,初跟10几步后发现没有什么重要的地方,继续下CreateFileA断点,F9,再次被断下,F2取消断点,ALT+F9返回,一路F8来到这里:00490D9C |. 85C0 test eax,eax ;用户名长度00490D9E |. 7E 19 jle short cac.00490DB9 00490DA0 |. BA 01000000 mov edx,1 ;下面是计算用户名字符的ASCII的和00490DA5 |> 8B4D F8 /mov ecx,dword ptr ss:[ebp-8]00490DA8 |. 8A4C11 FF |mov cl,byte ptr ds:[ecx+edx-1]00490DAC |. 81E1 FF000000 |and ecx,0FF00490DB2 |. 014D DC |add dword ptr ss:[ebp-24],ecx00490DB5 |. 42 |inc edx00490DB6 |. 48 |dec eax00490DB7 |.^ 75 EC \jnz short cac.00490DA500490DB9 |> 8D55 F8 lea edx,dword ptr ss:[ebp-8]00490DBC |. 8B45 DC mov eax,dword ptr ss:[ebp-24]00490DBF |. E8 647FF7FF call cac.00408D28 ;把和转换为10进制值00490DC4 |. 8D4D EC lea ecx,dword ptr ss:[ebp-14]00490DC7 |. BA 01000000 mov edx,100490DCC |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]00490DCF |. E8 30A1FAFF call cac.0043AF04 ;把10进制值的最低位的值放入存储空间(r1)00490DD4 |. 8D4D E8 lea ecx,dword ptr ss:[ebp-18]00490DD7 |. BA 01000000 mov edx,100490DDC |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]00490DDF |. E8 04A1FAFF call cac.0043AEE8 ;把10进制的最高位值放入存储单元(r2)00490DE4 |. 8D8D 04FEFFFF lea ecx,dword ptr ss:[ebp-1FC]00490DEA |. BA 04000000 mov edx,400490DEF |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]00490DF2 |. E8 F1A0FAFF call cac.0043AEE8 ;取注册码的前4位00490DF7 |. 8B85 04FEFFFF mov eax,dword ptr ss:[ebp-1FC]00490DFD |. 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]00490E00 |. BA 01000000 mov edx,100490E05 |. E8 FAA0FAFF call cac.0043AF04 ;把前4位的最低位值放入存储单元(c1)00490E0A |. 8D8D 00FEFFFF lea ecx,dword ptr ss:[ebp-200]00490E10 |. BA 08000000 mov edx,800490E00490E15 |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]00490E18 |. E8 CBA0FAFF call cac.0043AEE8 ;取注册码的前8位00490E1D |. 8B85 00FEFFFF mov eax,dword ptr ss:[ebp-200]00490E23 |. 8D4D E0 lea ecx,dword ptr ss:[ebp-20]00490E26 |. BA 01000000 mov edx,100490E2B |. E8 D4A0FAFF call cac.0043AF04 ;把注册码的前8位最后一位放入存储单元(c2)00490E30 |. C683 900B0000>mov byte ptr ds:[ebx+B90],000490E37 |. 8B45 EC mov eax,dword ptr ss:[ebp-14]00490E3A |. 8B55 E4 mov edx,dword ptr ss:[ebp-1C]00490E3D |. E8 AE3DF7FF call cac.00404BF0 ;r1与c1比较00490E42 75 23 jnz short cac.00490E67 ;不等,就跳00490E44 |. 8B45 E8 mov eax,dword ptr ss:[ebp-18]00490E47 |. 8B55 E0 mov edx,dword ptr ss:[ebp-20]00490E4A |. E8 A13DF7FF call cac.00404BF0 ;r2与c2比较00490E4F 75 16 jnz short cac.00490E67 ;不等就跳 00490E51 |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]00490E54 |. BA F40E4900 mov edx,cac.00490EF4 ; ASCII "a1"00490E59 |. E8 923DF7FF call cac.00404BF0 ;注册码前两位与“a1”比较00490E5E |. 75 07 jnz short cac.00490E67 ;不等就跳00490E60 |. C683 900B0000>mov byte ptr ds:[ebx+B90],100490E67 |> 80BB 900B0000>cmp byte ptr ds:[ebx+B90],000490E6E |. 75 18 jnz short cac.00490E88 ;注册正确,跳向成功 00490E70 |. 80BB 9C0B0000>cmp byte ptr ds:[ebx+B9C],000490E77 74 0F je short cac.00490E88 ========================================================================================【分析总结】 这个软件我不知道作者是怎么想的 ,00490E70 这个比较我不知道是用来干什么的,不过对于我们来说又多了一个 暴破的地方。我们可以直接把 00490E6E 和 00490E77的条件跳转改为无条件跳转,就可以对软件进行完整暴破。该软件虽然采取了重启验证的方法,注册信息放在同目录下的clapeoq.lst文件中但是验证部分却过于简单,只要找到了地方,很快就能把它的算法注册机作出来,下面是一个简单的注册程序程序,写的不好,不要见笑。#include #include #include #include void Getchar(int i);void main(){ time_t tt; char name[100]; long name_str_sum=0; printf("Input your name:"; gets(name); for(int i=0;i<(int) strlen(name);i++) name_str_sum+=name[i]; printf("your Id is:a1"; Getchar(1); printf("%d",name_str_sum%10); Getchar(3); do{ name_str_sum/=10; }while(name_str_sum>=10); printf("%d",name_str_sum); srand((unsigned) time(&tt)); Getchar(rand()%10); printf("/n";}void Getchar(int i){ char str[10]; int transf=0; time_t t; for(int count=0;count srand((unsigned) time(&t)*rand()); transf=rand()%94; str[count]=transf+33; time_t t; } str[i]='\0'; printf("%s",str);}Input your name:ligyuanyour Id is:a1/1ppe7fG?0正确注册这个程序有几处不完善的地方,就是没有考虑它小于8位的注册码,实现不难,但是要花额外的代码,人太懒,不好意思。就连它的分析都没有F7进去,哈哈,简单分析吗,就简单的分析喽。很会找理由吧。。。。。。。。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|