首页
社区
课程
招聘
riijj第一个crackme 算法c实现 (注册机)
发表于: 2006-5-11 10:30 5812

riijj第一个crackme 算法c实现 (注册机)

2006-5-11 10:30
5812

#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期)!

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2

这里在bp messagebox下断点找到注册算法的位置,
那么遇到其他程序时该如何去找到注册算发或是关键的位置呢??
........


每个程序的方法都不同,如果程序是针对防破解的,问题会更复杂

例如,一些程序发现序号错误,并不会有任何反应,使你不能针对它的行动下断点

一般程序都要先取得序号字符串,这是整个算法的开始,所以大多数会先尝试 bp GetWindowTextA , 但是程序可以用更复杂的方法来取得字符串,例如直接读取 text box 用来储存文字的内存位置,etc

对编程有深入认识的话,便可以想到程序作者可以使用到的各种防破技巧
2006-5-12 08:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 riijj 发布
每个程序的方法都不同,如果程序是针对防破解的,问题会更复杂

例如,一些程序发现序号错误,并不会有任何反应,使你不能针对它的行动下断点

一般程序都要先取得序号字符串,这是整个算法的开始,所以大多数会先尝试 bp GetWindowTextA , 但是程序可以用更复杂的方法来取得字符串,例如直接读取 text box 用来储存文字的内存位置,etc
........


riijj问下,你说"先取得序号字符串" 这个指的是正确的序号串还是我们输入的假的字符串??

另外请教下,要了解 GetWindowTextA 等意思需要看哪些书籍?
2006-5-16 08:49
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
最初由 ilovemysel 发布
riijj问下,你说"先取得序号字符串" 这个指的是正确的序号串还是我们输入的假的字符串??

另外请教下,要了解 GetWindowTextA 等意思需要看哪些书籍?


1.  假的,就是我们输入 text box 的那一句,用作试验的假序号

2.  GetWindowTextA 这些是 win32 的一般 API ,你可以看微软的 MSDN 文件来查看它们的官方解释和用法。 MSDN 文件是 Visual studio 的一部份,也可以到网上查看 (517K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3&6Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3u0J5j5i4u0&6i4K6u0r3i4K6t1&6
2006-5-16 09:09
0
游客
登录 | 注册 方可回帖
返回