-
-
riijj第一个crackme 算法c实现 (注册机)
-
发表于:
2006-5-11 10:30
5812
-
riijj第一个crackme 算法c实现 (注册机)
#include <stdio.h>
#include <string.h>
////////unsinged型算术右移运算
getbits1(unsigned value,int n)
{
unsigned z,temp;
temp=value&0x80000000;
if(temp==0)
z=value>>n;
else
{
z=~0;
z=z>>n;
z=~z;
z=z|(value>>n);
}
return(z);
}
/////////////
//int型算术右移动运算
getbits2(int value,int n)
{
int z,temp;
temp=value&0x8000;
if(temp==0)
z=value>>n;
else
{
z=~0;
z=z>>n;
z=~z;
z=z|(value>>n);
}
return(z);
}
/////////////////////////
void main()
{
char name[80]=" ",temp2,c;
unsigned int i;
unsigned long data1,dl,ss[16],temp1,temp3,result[80];
printf("Please enter Reg name:");
i=0;
c=getchar();
name[i++]=c;
while(c!='\n')
{
c=getchar();
name[i++]=c;
}
name[i-1]='\0'; //name is Regname
data1=0xffffffff/(name[0]%name[1]*name[2]+1);//data1 is eax
temp1=data1; //temp1 ds:(它往数据段放的内容)
for(i=0;i<15;i++)
{
temp1=temp1*0x343fd+0x269ec3;
/*data1=getbits1(temp1,16)&0x7fff;
dl=data1%0x1a+0x41;
data1=data1/0x1a;
ss[i]=dl;*/ //注释的操作是多余的,没什用
}
for(i=0;i<strlen(name);i++)
{
temp2=name[i];
data1=getbits2(temp2,5);
unsigned long data2;
data2=data1+data1*4;
data1=data1+data2*8;
data1=data1+data1*2;
temp3=data1; //temp3 is edi
while(temp3)
{
temp1=temp1*0x343fd+0x269ec3; ////temp1 is ds:(它往数据段放的内容)
data1=getbits1(temp1,16)&0x7fff;
temp3--;
}
temp1=temp1*0x343fd+0x269ec3;
data1=getbits1(temp1,16)&0x7fff;
dl=data1%0x1a+0x41;
data1=dl;//此处就到sub eax,ecx了可以停止 //计算eax了。
result[i]=data1;
}
printf("The Reg key is:");
for(i=0;i<strlen(name);i++)
printf("%c",result[i]);
printf("\n");
}
程序运行结果,输入注册名,可以得到crackme的注册码。
另外
xor eax,edx
sub eax,edx
add ebx,eax.
根据止riijj分析eax必须要等于edx才满足条件,
而eax事先与edx进行了xor操作,
操作完了又要让eax等于edx那么eax必须是0才可以。
我是这样分析eax=0的
再上一步sub eax,ecx可得出eax要等于ecx
这里在bp messagebox下断点找到注册算法的位置,
那么遇到其他程序时该如何去找到注册算发或是关键的位置呢??
特别感谢riijj,这是我学破解的第一个教材,第一次做的实践。
感谢riijj详细的解释说明。希望能riijj能再继续做类似的文章。
谢谢!
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!