能力值:
( LV9,RANK:370 )
|
-
-
2 楼
恭喜“天涯”第一篇文章入选精华。
|
能力值:
( LV8,RANK:130 )
|
-
-
3 楼
谢谢支持!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
很好,太详细了。。正是我们所需要的
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
大力支持,非常感谢
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
恭喜天涯第在看雪上的第一篇精华。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
crackme破解练习
[splash窗口]
自动步过,到
00401021 E8 06000000 CALL Splish.0040102C
处停下了,然后出现splash。所以重来,在此单步进入,
再次自动步过,发现在
00401079 E8 F9030000 CALL Splish.00401477
处停下了,然后出现splash。所以重来,在此单步进入,
发现showwindow等代码,于是判断这个call就是splash
窗口的代码,于是在00401079用nop填充,搞掂。
[硬件序列号]
(内存注册码-明码比较)
在getwindowstexta下断。
硬件序列号输入“vcangle”确定,中断在getwindowstexta。
执行到用户代码,停在
0040136F |. 8D05 53134000 LEA EAX,DWORD PTR DS:[401353]
单步步过,发现
0040136F |. 8D05 53134000 LEA EAX,DWORD PTR DS:[401353]
00401375 |. 8D1D 15324000 LEA EBX,DWORD PTR DS:[403215]
eax出现“HardCoded”
ebx出现“vcangle”
然后是一个比较的循环
最后根据循环的结果给出提示信息。
所以判定,HardCoded就是我们要找的硬件序列号。过关。
[用户名和注册码]
在getwindowstexta下断。
用户名输入“vcangle”,注册码输入“12345678”
确定,中断在getwindowstexta。
执行到用户代码,停在
004015F6 |. 85C0 TEST EAX,EAX
这是检查getwindowstexta的返回值,如果成功长度就保存在
DS:[403467],否则跳转到0040167e,提示出错信息。
单步步过,再次出现getwindowstexta,这是取得用户名。
长度保存在DS:[403467],失败则跳到401693提示出错信息。
执行到用户代码。继续单步步过,然后一个类似下面的循环:
bx=0;
byte esi[]="vcangle";
cx=10;
while(1)
{
ax=esi[bx];
dx=ax%cx;
dx^=bx;
dx+=2;
if(dx<10)
goto H;
dx-=10;
H:edi[bx]=dx;
bx++;
if(bx<lenA)continue;
else break;
}
这是把用户名运算后放到ds:[edi+bx]中。
再往下:
bx=0;
byte esi="12345678";
cx=10;
while(1)
{
ax=esi[bx];
dx=ax%cx;
edi[bx]=dx;
bx++;
if(bx<lenB)continue;
else break;
}
这是把注册码运算后放到ds:[edi+bx]中.
继续单步步过,如果没出错将跳转到4016a8;
然后把注册玛放在esi,用户名放在edi。
再来一个循环:
bx=0;
while(1)
{
if(lenA==bx)break;
ax=edi[bx];
cx=esi[bx];
if(ax!=cx)goto E;
bx++;
}
E:
然后是一个用户名和注册码正确的提示信息。
由上可以写出注册机:
(用户名max:=11;注册码max:=32)
void CZcjDlg::OnOK()
{
char strName[12],strCode[33];
memset(strName,0,12);
memset(strCode,0,33);
GetDlgItemText(IDC_EDIT1,strName,12);
char buff[12];
memset(buff,0,12);
int a,lenA=strlen(strName);
if(lenA<1)return;
for(int i=0;i<lenA;i++)
{
a=strName[i];
a=a%10;
a^=i;
a+=2;
if(a>=10)a-=10;
buff[i]=a;
}
for(i=0;i<lenA;i++)buff[i]+=('k'-'k'%10);//其中一组解
SetDlgItemText(IDC_EDIT2,buff);
}
对取其中一组解的说明:
基数取'k'是为了得到可见的字符;
'k'-'k'%10是为了保证它是整10的数。
buff[i]+=('k'-'k'%10)正是符合了余数为f(用户名)算出的结果。
第一次写此类文章,请指教!
|
能力值:
( LV8,RANK:130 )
|
-
-
8 楼
你写的怎么如此复杂 看着有点晕!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我昨天晚上花了至少3个小时的心血啊~~~~~~```
我觉得很清晰啊,我只是把它翻译为c语言,没有这样分析我无法写出注册机来。
你说的是注册码分析部分还是注册机实现部分?你有更简单的注册机代码?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
先下来练习练习再说。谢了,我还没入门呢,只是这个网站对我还有不小的诱惑力。呵呵,
|
能力值:
(RANK:10 )
|
-
-
11 楼
我支持...
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
支持楼主!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我用c做的一个注册机,vc编译,dos界面的.也是我所做的第一个注册机.写源码时还需查书呢.呵呵.可能还有bug在里面呢.crackme里面的算法很简单.很快就能搞定.
给人信心鼓励.多谢了.
#include <stdio.h>
#include <string.h>
main()
{
int len,i,hao;
char name[20];
scanf("%s",name);
len=strlen(name);
for (i=0;i<len;i++)
{
hao=(name[i]) % 10;
hao=(hao^i)+2;
if (hao>=10) hao=hao-10;
hao=hao+70; //使序列号范围在70-79之间
printf("%c",hao);
}
printf("\n");
scanf("%c"); //使他在windows下停留,不用跑到dos界面下看
}
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
你们都能写注册机了,我连看都还看不太懂,我还要努力学习赶上你们!!!
|
能力值:
( LV6,RANK:90 )
|
-
-
15 楼
支持
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
我也想,自己也分析了几个,感觉还不错
可是不敢发表
一是太简单,
二是自己分析的只有自己看得懂,还不会照顾别人的感受
三就是怕别人笑话
呵呵,其实是怕自己丢人。
等这段时间忙完了,咱也弄他个精华帖
大家鼓励一下。
最后,支持一下爱在天涯兄弟,顶
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
真详细,谢谢楼主了。
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
为什么我没下任何断点,我会莫名其妙的被断在系统内存里了,。
而且什么也动不了,要按N下F9才行。
|
|
|