Skip to content

Instantly share code, notes, and snippets.

@NSG650
Last active November 26, 2023 12:21
Show Gist options
  • Save NSG650/13d1d38372dcb9f229abf5590be75b7a to your computer and use it in GitHub Desktop.
Save NSG650/13d1d38372dcb9f229abf5590be75b7a to your computer and use it in GitHub Desktop.
Windows 95 Key generator
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#define random_between(min, max) (rand() % (max - min) + min)
bool keygen_first_3_letters_are_invalid(const char *string) {
for (char c = '3'; c <= '9'; c++) {
if (string[0] == string[1] == string[2] == c) return true;
}
return false;
}
bool keygen_last_7_letters_is_divisble(const char *string) {
int n = 0;
for (int i = 0; i < 7; i++) {
n += string[i] - '0';
}
return !(n % 7);
}
char keygen_return_random_digit(void) {
return random_between('0', '9');
}
void keygen_generate_non_oem_key(char *key, size_t length) {
if (length < 12) return;
memset(key, '0', 11);
key[12] = 0;
key[3] = '-';
do {
for (int i = 0; i < 3; i++) {
key[i] = keygen_return_random_digit();
}
} while (keygen_first_3_letters_are_invalid(key));
do {
for (int i = 0; i < 7; i++) {
key[i + 4] = keygen_return_random_digit();
}
} while(!keygen_last_7_letters_is_divisble(&key[4]));
}
void keygen_generate_oem_key(char *key, size_t length) {
if (length < 24) return;
memset(key, '0', 23);
key[23] = 0;
key[5] = '-';
key[6] = 'O';
key[7] = 'E';
key[8] = 'M';
key[9] = '-';
key[17] = '-';
int day = random_between(1, 366);
int year = (random_between(1995, 2002)) % 100;
key[0] = ((day / 100) % 10) + '0';
key[1] = ((day / 10) % 10) + '0';
key[2] = ((day) / 100) + '0';
key[3] = (year / 10) + '0';
key[4] = (year % 10) + '0';
do {
for (int i = 0; i < 6; i++) {
key[i + 11] = keygen_return_random_digit();
}
} while(!keygen_last_7_letters_is_divisble(&key[10]));
for (int i = 0; i < 5; i++) {
key[i + 18] = keygen_return_random_digit();
}
}
int main(void) {
char key[24] = {0};
srand(time(0));
keygen_generate_non_oem_key(key, 24);
printf("Key: %s\n", key);
keygen_generate_oem_key(key, 24);
printf("OEM Key: %s\n", key);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment