• 标 题:egis发布了adsubstract pro 2.1注册器,带源码的。 (2千字)
  • 作 者:1212
  • 时 间:2001-2-2 21:40:45
  • 链 接:http://bbs.pediy.com

/*

ADSubstract v2.10 Keymaker by Egis/CORE
Compile: cl /o2 adsk.c md5dgst.c

*/

#include <stdio.h>
#include <stdlib.h>

#include "md5.h"

typedef    unsigned char    BYTE;
typedef    unsigned int    WORD;
typedef    unsigned long    DWORD;
typedef unsigned _int64 QWORD;

BYTE    base[] = { "0123456789abcdefghijklmnopqrstuvwxyz" };

QWORD tobase( BYTE m )
{
    BYTE    i;

    for( i = 0; i < 36; i++ )
        if( base[ i ] == m )
            return i;
    return 0;
}

QWORD t64( BYTE *t )
{
    QWORD  q;
    BYTE    p[ 100 ], *b = p;

    q = 0;
    memset( p, 0, 100 );
    strcpy( p, t );
    strlwr( p );
    while( *b ) {
        q *= 32;
        q += tobase( *b );
        b++;
    }

    return q;
}

void p64( QWORD key )
{
    BYTE    s[ 20 ], *p = s, m;

    memset( s, 0, 20 );
    while( key ) {
        *p = base[ key % 32L ];
        key /= 32L;
        p++;
    }
    p = s;
    while( *p ) {
        if( *p == '1' ) *p = 'w';
        if( *p == 'b' ) *p = 'x';
        if( *p == 'o' ) *p = 'z';
        p++;
    }
    strrev( s );
    strupr( s );
    printf( s );
}

void main( void )
{
    MD5_CTX    c;
    BYTE        md[ MD5_DIGEST_LENGTH ];
    int        i;
    DWORD      magic[ 10 ] = { 0x5733a0c3, 0x155cf8be, 0xffc55d8d, 0x11cf424, 0x7117d5b1, 0x4baf5541, 0x83179f31, 0x20f3f593 };
    BYTE        pad[ 10 ];
    QWORD      k1, k2;
    QWORD      k;
    char        key[ 10 ] = { "EGIS" };

    printf( "\n ._______/\\__________/\\_______/\\___________.\n"
        " /    _____\\_  ___    \\_____  \\    _____/\n"
        "/    \\      \\    _\\    /  /  /__    __\\___\n"
        "\\____________/__________\\___\\____  \\________/\n"
        "+-ds-----------+ C.O.R.E..2.K +- \\_/ -------+\n\n"
        "ADSubstract Pro v2.10 Keymaker by Egis/CORE.\n" );

    while( 1 ) {

        srand( time( NULL ) );
        for( i = 4; i < 8; i++ )
            key[ i ] = base[ rand() % 32 ];       

        k1 = t64( key );
        pad[ 0 ] = ( BYTE )( ( k1 & 0xff00 ) >> 8 );
        pad[ 1 ] = ( BYTE )( ( k1 & 0xff0000 ) >> 16 );
        pad[ 2 ] = ( BYTE )( ( k1 & 0xff000000 ) >> 24 );
        pad[ 3 ] = ( BYTE )( ( k1 & 0xff00000000 ) >> 32 );
        pad[ 4 ] = ( BYTE )( k1 & 0xff );

        if( pad[ 4 ] > 18 )
            break;
    }

    printf( "\nYour registration code: " );

    p64( k1 );

    MD5_Init( &c );
    MD5_Update( &c, ( BYTE* ) magic, 32 );
    MD5_Update( &c, pad, 5 );
    MD5_Update( &c, ( BYTE* ) magic, 32 );
    MD5_Final( md, &c );
   
    k2 = md[ 0 ];
    k2 <<= 8;
    k2 += md[ 1 ];
    k2 <<= 8;
    k2 += md[ 2 ];
    k2 <<= 8;
    k2 += md[ 3 ];
    k2 <<= 8;
    k2 += md[ 4 ];

    p64( k2 );
    printf( "\n" );

}