/* This source code contains a authentication routine that will validate Microsoft CD Keys. It is meant that this source code is a learning tool and not a PIRACY tool. It is also meant to show how a large corporation like Microsoft spend MILLIONS of dollars on development and come up with this protection scheme. *BorlandC 3.1 was used to compile this successfully. It is a crime to redistribute these routines in a commercial venture of any kind without permission or licensing agreement. (C)opyright 1995 Damaged Cybernetics If you have any questions or comments, please contact the following ppl via the Internet: Donald Moore (MindRape) mindrape@goodnet.com Donald Staheli (Royce) staheli@goodnet.com Web Page: www.goodnet.com/~staheli */ #include#include #include #include /* Prototypes */ void help(void); char ValidateCDKey(char *szKey); /* definitions for ValidateCDKey function */ #define VALID_KEY 1 /* Yes this is a valid key */ #define INVALID_KEY 0 /* No this is not a valid key */ #define INVALID_CHAR -1 /* This key contains invalid characters */ #define INVALID_LENGTH -2 /* This key is the incorrect length */ /* Length of a Microsoft CD Key, this include the hyphen! */ #define MS_CD_KEY_LENGTH 11 /* XXX-0123456 */ #define OEM_CD_KEY_LENGTH 23 /* XXXXX-OEM-0123456-XXXXX */ #define REAL_KEY_LENGTH 7 /* length of the key is really 7 chars! */ #define REAL_MS_OFFSET 4 /* The MS CD REAL Key offset */ #define REAL_OEM_OFFSET 10 /* The OEM CD Real Key offset */ /* char ValidateCDKey(char *szKey) ENT: szKey - Char - Key to validate RET: VALID_KEY - The key is valid INVALID_KEY - The key is invalid INVALID_LENGTH - The key is not a valid CD Key length INVALID_CHAR - The key contains invalid characters ValidateCDKey will take either a Microsoft or a Microsoft OEM CD Key and verify that it's a authentic CD Key which can be used to unlock their software when installing. */ char ValidateCDKey (char *szKey) { unsigned long ulCheckSum = 0L; /* Hold our checksum value here */ int iStrLength; /* Length of the CD Key */ int i = 0; /* dummy counter */ iStrLength = strlen(szKey); /* is the key the correct length? */ if (iStrLength != MS_CD_KEY_LENGTH && iStrLength != OEM_CD_KEY_LENGTH) return INVALID_LENGTH; /* now move the pointer to the start of the REAL key */ szKey += iStrLength == MS_CD_KEY_LENGTH ? REAL_MS_OFFSET : REAL_OEM_OFFSET; /* now loop thru the CD Key, adding each digit to each other * and then mod it by 7. If it's 0 we have a valid key! * * btw this routine can be optimized! It is written for sake of * clairity. */ while (i < REAL_KEY_LENGTH) { if (isdigit(*szKey)) { /* convert each char to it's actual decimal value by * subtracting 48 and keep accumlating the values */ ulCheckSum += ((int) *szKey - 48); } else return INVALID_CHAR; /* we hit a NON numeric character */ szKey++; i++; } return (ulCheckSum % 7) ? INVALID_KEY : VALID_KEY; } void help(void) { printf("This program will verify whether the CD Key you are using is a\n" "a valid Microsoft CD Key. It is not meant to endorse PIRACY, but\n" "to show a big company like Microsoft who has spent millions of\n" "dollars and came up with this routine.\n" "\nUsage: CDKey \n" " i.e. Microsoft CD Key - CDKey 012-0123456\n" " i.e. OEM CD Key - CDKey 01234-OEM-012345-01234\n" ); exit(0); } void main(int argc,char *argv[]) { puts("Microsoft CD Key Validation\n(C) 1995 Damaged Cybernetics (www.goodnet.com/~staheli)\n"); if (argc != 2) /* opps user didn't pass any parameters */ help(); switch (ValidateCDKey(argv[1])) { case INVALID_CHAR : puts("This key is either not formatted properly or contains alphanumeric characters."); break; case INVALID_LENGTH : puts("This key is neither a valid length for a Microsoft or a OEM CD Key."); break; case INVALID_KEY : puts("This is NOT a valid Microsoft CD Key."); break; case VALID_KEY : puts("This is a VALID Microsoft CD Key."); break; } }