首页
社区
课程
招聘
[原创]第一阶段第一题算法注册机
2008-9-20 13:26 27537

[原创]第一阶段第一题算法注册机

2008-9-20 13:26
27537
刚开始学逆向工程,看雪真是个好地方。没能参加逆向分析挑战赛,感到很遗憾。
昨天把第一道题做了,勉强还可以写出算法注册机。
原码如下:
#include<iostream>
using namespace std;
void tra(char[],int);
int num=0;           //存放注册码的位数
unsigned int cal1=0; //存放对用户名处理后的值
char reg[1200];      //存放注册码

int main()
{
        char user[0x14];  //存放用户名
        char cal2[9]={0,0,0,0,0,0,0,0,1};//存放cal1后几位二进制值以及1
        unsigned int ml=0;
        printf("用户名: ");
        scanf("%s",user);
        int len=strlen(user);

        /*
             计算用户名,得到处理后的值放入m1中

          */

        __asm{
                xor edx,edx
                mov ebx,13572468h
                mov ecx,dword ptr[ebp-28h]       
   f:        movsx eax,byte ptr[ebp+edx-14h]
                add eax,ebx
                imul    eax, eax, 3721273h
                add     eax, 24681357h
                mov     esi, eax
                shl     esi, 19h
                sar     eax, 7h
                or      esi, eax
                inc     edx
                cmp     edx, ecx
                mov     ebx, esi
                jl f
                mov     dword ptr[ebp-24h],ebx   
        }
        cal1=ml;

        /*
              计算cal1后几位二进制,放入cal2数组中
        */

        for(int j=1;j<=8;j++)
        {
                unsigned mt=cal1>>j;
                mt&=1;
                cal2[j-1]=mt;
        }
        int i;

        /*
             生成注册码,放入reg数组中
        */

        int min=0;
        while(cal2[min]==0) min++;
        int max=8;
        while(cal2[max]==0) max--;
        while(min<=max)
        {
                if(cal2[min+1]==0&&min!=max)
                {
                        cal2[min+1]=!cal2[min+1];
                        reg[num]=(10+min+1+1-(cal1>>(num%31))%10)%10 +48;                       
                        num++;
                }
                tra(cal2,min);
                min++;
        }

        /*
              打印注册码
        */

        printf("注册码: \n");
               for(i=0;i<num;i++)
                printf("%c",reg[i]);
        printf("\n");
        return 0;
}

/*
    输入:数组cal2
              整型数n
    输出:无
   功能:将cal2数组中第n位取反,要求第0至n-1都是0
*/

void tra(char cal2[9],int n)
{
        if(n==0){
                cal2[0]=!cal2[0];       
                reg[num]=(10+1-(cal1>>(num%31))%10)%10 +48;
                num++;
                return;
        }
        tra(cal2,n-1);
        cal2[n]=!cal2[n];
        reg[num]=(10+n+1-(cal1>>(num%31))%10)%10 +48;
        num++;
        tra(cal2,n-1);
}

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shuiqi 2008-9-20 13:29
2
0
这是编译好的注册机程序,用vc写得控制台程序
上传的附件:
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
拾级而上 2009-2-12 11:23
3
0
感谢.学习中.
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kkllchun 2009-4-11 16:50
4
0
感谢LZ分享
雪    币: 107
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lionsun 2009-4-17 16:16
5
0
学习中.......
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mazhenxing 2009-7-29 15:43
6
0
学习了。感谢
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
myblue 2009-10-30 23:53
7
0
不错,能看懂,但写不出来...
游客
登录 | 注册 方可回帖
返回