35 Commits

Author SHA1 Message Date
25ed8d4f43 Merge pull request #120 from UMSKT/nodashes-cmd
Command line argument to remove dashes from product key
2025-06-18 21:50:16 -05:00
324688e9ef Update cli.cpp 2025-06-18 21:33:07 -05:00
6ae46d6aa2 duh 2025-06-18 21:24:37 -05:00
e07c080ee8 Update cli.h 2025-06-18 21:18:11 -05:00
ce9ff7e624 Revert "Update cli.h"
This reverts commit 714895c61b.
2025-06-18 21:17:08 -05:00
714895c61b Update cli.h 2025-06-18 21:13:50 -05:00
6ecf9c5309 Update cli.h 2025-06-18 21:09:15 -05:00
9f7d53dab3 Update cli.cpp 2025-06-18 21:08:02 -05:00
a66e579377 remove everything in a 2 mile radius 2025-06-10 23:43:31 -05:00
e30a4713b6 Update CMakeLists.txt 2025-06-10 23:34:14 -05:00
e9228045d3 Update dos-djgpp.yml 2025-06-10 22:38:03 -05:00
36de07ecdf Update dos-djgpp.yml 2025-06-10 22:33:18 -05:00
a28f4b5ca3 Update dos-djgpp.yml 2025-06-10 22:28:02 -05:00
a0cb9e9869 Update dos-djgpp.yml 2025-06-10 22:26:20 -05:00
6d30abba98 Update dos-djgpp.yml 2025-06-10 22:23:14 -05:00
8b6c3b252b Update dos-djgpp.yml 2025-06-10 22:20:39 -05:00
1fd7550f85 Merge pull request #119 from thepwrtank18/djgpp-rng
RNG bugfix for DOS (DJGPP)
2025-06-09 23:20:45 -05:00
1f85bf954e RNG bugfix for DOS (DJGPP) 2025-06-09 23:15:34 -05:00
74ff1ea08c https://www.youtube.com/watch?v=y3M3xpKV7wA
Replace MSVC with TDM-GCC
2025-06-07 21:11:48 -04:00
0a63055e91 32-bit 2025-06-05 01:05:45 -04:00
94da628e48 Update windows.yml 2025-06-05 01:00:39 -04:00
8e58232803 ops 2025-06-05 00:58:06 -04:00
78ec40f4e3 sdfjkwwhqd 2025-06-05 00:57:13 -04:00
9d36fb2f66 this is stupid 2025-06-05 00:41:27 -04:00
2166ee6e2f PICK ONE ARE YOU WINDOWS OR UNIX 2025-06-05 00:14:58 -04:00
e85add2a54 5 HOURS DEBUGGING THIS CRAP 2025-06-05 00:10:01 -04:00
f459316865 Satya Nadella this is your fault 2025-06-04 23:59:59 -04:00
60a9b0ea70 i'm going to kms
https://learn.microsoft.com/en-us/windows-server/get-started/kms-client-activation-key
2025-06-04 23:49:36 -04:00
0ebce49cf0 final theory 2025-06-04 23:34:50 -04:00
caa37365d4 theory of everything 3 2025-06-04 23:32:32 -04:00
8fe0fc06b2 theory of everything 2 2025-06-04 23:24:02 -04:00
fc4b83d1e8 theory of everything 2025-06-04 23:13:06 -04:00
aa331ad6e4 broken glass theory 2025-06-04 23:03:30 -04:00
9b06fcf162 ice soup theory 2025-06-04 22:52:06 -04:00
a4d810b030 tree method 2025-06-04 22:43:58 -04:00
9 changed files with 164 additions and 57 deletions

View File

@ -64,8 +64,8 @@ jobs:
git clone https://github.com/UMSKT/openssl.git openssl git clone https://github.com/UMSKT/openssl.git openssl
pushd openssl pushd openssl
source ${{ github.workspace }}/djgpp/setenv source ${{ github.workspace }}/djgpp/setenv
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP ./Configure 386 no-threads no-tests no-sse2 no-asm -DOPENSSL_DEV_NO_ATOMICS -mno-mmx -mno-sse -mno-sse2 -march=i386 --prefix=${{ github.workspace }}/djgpp DJGPP
make && make install make && make install_sw
popd popd
- name: Build - name: Build

View File

@ -27,29 +27,12 @@ on:
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build-tdm64: build-tdm:
runs-on: windows-latest runs-on: windows-latest
env: strategy:
OPENSSL_VERSION: "3.1.8" matrix:
OPENSSL_PREFIX: "${{ github.workspace }}/openssl-install-64" arch: [x64, x86]
steps: steps:
- name: Install MSYS2 and dependencies
uses: msys2/setup-msys2@v2
with:
update: true
install: >-
git
make
perl
nasm
- name: Cache OpenSSL 64-bit build
id: cache-openssl
uses: actions/cache@v4
with:
path: ${{ env.OPENSSL_PREFIX }}
key: openssl-${{ env.OPENSSL_VERSION }}-msys2-mingw64
- name: Setup TDM-GCC - name: Setup TDM-GCC
run: | run: |
Write-Host Downloading TDM-GCC v10.3.0... Write-Host Downloading TDM-GCC v10.3.0...
@ -66,30 +49,38 @@ jobs:
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine) [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
- name: Build OpenSSL 64-bit (if not cached)
if: steps.cache-openssl.outputs.cache-hit != 'true'
shell: msys2 {0}
run: |
export PATH="/c/TDM-GCC-64/bin:$PATH"
export OPENSSL_PREFIX="$(pwd)/openssl-install-64"
git clone --branch openssl-${OPENSSL_VERSION} https://github.com/openssl/openssl.git
cd openssl
./Configure mingw64 no-shared --prefix="${OPENSSL_PREFIX}"
make -j$(nproc)
make install_sw
- name: Checkout Source Tree - name: Checkout Source Tree
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Configure UMSKT (TDM-GCC 64-bit) - name: Download OpenSSL-TDM release asset
shell: pwsh
run: |
if ('${{ matrix.arch }}' -eq 'x64') {
$url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-64.zip"
$dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64"
$libdir = "lib64"
$cmake_flags = "-m64"
$openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-64"
} else {
$url = "https://github.com/UMSKT/winactiontest/releases/download/openssl/OpenSSL-TDM-32.zip"
$dest = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32"
$libdir = "lib32"
$cmake_flags = "-m32"
$openssl_root = "$env:GITHUB_WORKSPACE/OpenSSL-TDM-32"
}
Invoke-WebRequest -Uri $url -OutFile "OpenSSL-TDM.zip"
Expand-Archive -Path "OpenSSL-TDM.zip" -DestinationPath $env:GITHUB_WORKSPACE
echo "OPENSSL_ROOT=$openssl_root" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "OPENSSL_LIBDIR=$libdir" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CMAKE_FLAGS=$cmake_flags" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Configure UMSKT (TDM-GCC ${{ matrix.arch }})
shell: pwsh shell: pwsh
run: | run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
$OPENSSL_ROOT = "$env:GITHUB_WORKSPACE/openssl-install-64" $OPENSSL_ROOT = "$env:OPENSSL_ROOT"
$OPENSSL_LIB = "$OPENSSL_ROOT" $OPENSSL_LIB = "$OPENSSL_ROOT/$env:OPENSSL_LIBDIR"
$OPENSSL_INC = "$OPENSSL_ROOT/include" $OPENSSL_INC = "$OPENSSL_ROOT/include"
cmake -G "MinGW Makefiles" ` cmake -G "MinGW Makefiles" `
-DCMAKE_C_COMPILER="gcc" ` -DCMAKE_C_COMPILER="gcc" `
-DCMAKE_CXX_COMPILER="g++" ` -DCMAKE_CXX_COMPILER="g++" `
@ -97,11 +88,11 @@ jobs:
-DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" ` -DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" `
-DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" ` -DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" `
-DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" ` -DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" `
-DCMAKE_C_FLAGS="-m64" ` -DCMAKE_C_FLAGS="$env:CMAKE_FLAGS" `
-DCMAKE_CXX_FLAGS="-m64" ` -DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" `
. .
- name: Build UMSKT (TDM-GCC 64-bit) - name: Build UMSKT (TDM-GCC ${{ matrix.arch }})
shell: pwsh shell: pwsh
run: | run: |
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH $env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
@ -110,7 +101,5 @@ jobs:
- name: Upload build artifact - name: Upload build artifact
uses: actions/upload-artifact@v4.6.2 uses: actions/upload-artifact@v4.6.2
with: with:
name: UMSKT-TDM64 name: UMSKT-TDM${{ matrix.arch }}
path: ./Release/* path: umskt.exe
# 32-bit support will happen when everything's all good

View File

@ -70,6 +70,11 @@ IF(DJGPP_WATT32)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32}) SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib) SET(UMSKT_LINK_DIRS ${UMSKT_LINK_DIRS} ${WATT_ROOT}/lib)
# Maximum compatibility flags for DOS/NTVDM
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i386 -mtune=i386 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -mno-ssse3 -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-fma -mno-fma4")
MESSAGE(STATUS "[UMSKT] Using i386 target for DOS DGJPP")
ENDIF() ENDIF()
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")

View File

@ -71,7 +71,8 @@ void CLI::showHelp(char *argv[]) {
fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n"); fmt::print("\t-u --upgrade\tspecifies the Product Key will be an \"Upgrade\" version\n");
fmt::print("\t-V --validate\tproduct key to validate signature\n"); fmt::print("\t-V --validate\tproduct key to validate signature\n");
fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n"); fmt::print("\t-N --nonewlines\tdisables newlines (for easier embedding in other apps)\n");
fmt::print("\t-o --override\tDisables version check for confirmation ID's, if you need this send an issue on GitHub"); fmt::print("\t-o --override\tDisables version check for confirmation IDs, if you need this send an issue on GitHub\n");
fmt::print("\t-D --nodashes\tDisables dashes in product keys and confirmation IDs (for easier copy-pasting)");
fmt::print("\n"); fmt::print("\n");
} }
@ -94,6 +95,7 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
false, false,
false, false,
false, false,
false,
MODE_BINK1998_GENERATE, MODE_BINK1998_GENERATE,
WINDOWS WINDOWS
}; };
@ -214,6 +216,8 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
options->nonewlines = true; options->nonewlines = true;
} else if (arg == "-o" || arg == "--override") { } else if (arg == "-o" || arg == "--override") {
options->overrideVersion = true; options->overrideVersion = true;
} else if (arg == "-D" || arg == "--nodashes") {
options->nodashes = true;
} else { } else {
options->error = true; options->error = true;
} }
@ -327,9 +331,14 @@ void CLI::printID(DWORD *pid) {
void CLI::printKey(char *pk) { void CLI::printKey(char *pk) {
assert(strlen(pk) >= PK_LENGTH); assert(strlen(pk) >= PK_LENGTH);
std::string keyFormat = "{}-{}-{}-{}-{}";
if (this->options.nodashes == true) {
keyFormat = "{}{}{}{}{}";
}
std::string spk = pk; std::string spk = pk;
fmt::print("{}-{}-{}-{}-{}", fmt::print(keyFormat,
spk.substr(0,5), spk.substr(0,5),
spk.substr(5,5), spk.substr(5,5),
spk.substr(10,5), spk.substr(10,5),
@ -423,7 +432,7 @@ int CLI::BINK1998Generate() {
} else { } else {
// generate a random number to use as a serial // generate a random number to use as a serial
BIGNUM *bnrand = BN_new(); BIGNUM *bnrand = BN_new();
BN_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); UMSKT::umskt_bn_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
int oRaw; int oRaw;
char *cRaw = BN_bn2dec(bnrand); char *cRaw = BN_bn2dec(bnrand);
@ -484,7 +493,7 @@ int CLI::BINK2002Generate() {
// generate a key // generate a key
for (int i = 0; i < this->total; i++) { for (int i = 0; i < this->total; i++) {
DWORD pAuthInfo; DWORD pAuthInfo;
RAND_bytes((BYTE *)&pAuthInfo, 4); UMSKT::umskt_rand_bytes((BYTE *)&pAuthInfo, 4);
pAuthInfo &= BITMASK(10); pAuthInfo &= BITMASK(10);
if (this->options.verbose) { if (this->options.verbose) {
@ -591,7 +600,17 @@ int CLI::ConfirmationID() {
return 1; return 1;
case SUCCESS: case SUCCESS:
if (this->options.nodashes == true) {
int j = 0;
for (int i = 0; confirmation_id[i] != '\0'; ++i) {
if (confirmation_id[i] != '-') {
confirmation_id[j++] = confirmation_id[i];
}
}
confirmation_id[j] = '\0';
}
fmt::print(confirmation_id); fmt::print(confirmation_id);
if (this->options.nonewlines == false) { if (this->options.nonewlines == false) {
fmt::print("\n"); fmt::print("\n");
} }

View File

@ -69,6 +69,7 @@ struct Options {
bool list; bool list;
bool nonewlines; bool nonewlines;
bool overrideVersion; bool overrideVersion;
bool nodashes;
MODE applicationMode; MODE applicationMode;
ACTIVATION_ALGORITHM activationMode; ACTIVATION_ALGORITHM activationMode;
@ -93,7 +94,7 @@ public:
static int parseCommandLine(int argc, char* argv[], Options *options); static int parseCommandLine(int argc, char* argv[], Options *options);
static int validateCommandLine(Options* options, char *argv[], json *keys); static int validateCommandLine(Options* options, char *argv[], json *keys);
static void printID(DWORD *pid); static void printID(DWORD *pid);
static void printKey(char *pk); void printKey(char *pk);
static bool stripKey(const char *in_key, char out_key[PK_LENGTH]); static bool stripKey(const char *in_key, char out_key[PK_LENGTH]);
int BINK1998Generate(); int BINK1998Generate();

View File

@ -58,3 +58,78 @@ FNEXPORT int PIDGEN2_GenerateRetail(char* channelID, char* &keyout) {
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) { FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* keyout) {
return PIDGEN2::GenerateOEM(year, day, oem, keyout); return PIDGEN2::GenerateOEM(year, day, oem, keyout);
} }
// RNG utility functions
int UMSKT::umskt_rand_bytes(unsigned char *buf, int num) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG using DJGPP's random() function
static bool initialized = false;
if (!initialized) {
// Get initial seed from multiple sources for better entropy
struct timeval tv;
gettimeofday(&tv, NULL);
// Combine microseconds with BIOS timer ticks
unsigned long ticks = *(volatile unsigned long *)0x0040001CL;
int seed = (int)((tv.tv_sec ^ tv.tv_usec) ^ (ticks * 100000));
// Initialize both random() and rand() with different seeds
srandom(seed);
srand(seed ^ 0x1234ABCD); // Use a different seed for rand
initialized = true;
}
for (int i = 0; i < num; i++) {
// Use random() for better randomness, especially in lower bits
buf[i] = (unsigned char)(random() & 0xFF);
// Mix in rand() as an additional source
buf[i] ^= (unsigned char)(rand() & 0xFF);
}
return 1;
#else
// Use OpenSSL's RAND_bytes for non-DOS systems
return RAND_bytes(buf, num);
#endif
}
int UMSKT::umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom) {
#if UMSKT_RNG_DJGPP
// DOS-compatible RNG implementation for BIGNUMs
unsigned char *buf = (unsigned char *)malloc((bits + 7) / 8);
if (!buf) return 0;
// Generate random bytes
umskt_rand_bytes(buf, (bits + 7) / 8);
// Convert to BIGNUM
if (!BN_bin2bn(buf, (bits + 7) / 8, rnd)) {
free(buf);
return 0;
}
free(buf);
// Apply top/bottom constraints like BN_rand does
if (top != -1) {
if (top) {
if (bits == 0) {
BN_zero(rnd);
return 1;
}
BN_set_bit(rnd, bits - 1);
}
BN_mask_bits(rnd, bits);
}
if (bottom) {
BN_set_bit(rnd, 0);
}
return 1;
#else
// Use OpenSSL's BN_rand for non-DOS systems
return BN_rand(rnd, bits, top, bottom);
#endif
}

View File

@ -38,6 +38,10 @@
#include <fmt/core.h> #include <fmt/core.h>
#include <fmt/format.h> #include <fmt/format.h>
#ifdef __DJGPP__
#include <sys/time.h>
#endif
// Algorithm macros // Algorithm macros
#define PK_LENGTH 25 #define PK_LENGTH 25
#define NULL_TERMINATOR 1 #define NULL_TERMINATOR 1
@ -59,6 +63,17 @@
#define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24) #define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24)
#define BITMASK(n) ((1ULL << (n)) - 1) #define BITMASK(n) ((1ULL << (n)) - 1)
// RNG utility functions
#ifdef __DJGPP__
#define UMSKT_RNG_DJGPP 1
extern "C" {
long int random(void);
int srandom(int seed);
}
#else
#define UMSKT_RNG_DJGPP 0
#endif
class UMSKT { class UMSKT {
public: public:
static std::FILE* debug; static std::FILE* debug;
@ -67,7 +82,10 @@ public:
class ConfigurationID; class ConfigurationID;
static void setDebugOutput(std::FILE* input); static void setDebugOutput(std::FILE* input);
// RNG utility functions
static int umskt_rand_bytes(unsigned char *buf, int num);
static int umskt_bn_rand(BIGNUM *rnd, int bits, int top, int bottom);
}; };
#endif //UMSKT_LIBUMSKT_H #endif //UMSKT_LIBUMSKT_H

View File

@ -201,7 +201,7 @@ void PIDGEN3::BINK1998::Generate(
EC_POINT *r = EC_POINT_new(eCurve); EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 384 bits without any constraints. // Generate a random number c consisting of 384 bits without any constraints.
BN_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); UMSKT::umskt_bn_rand(c, FIELD_BITS, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// Pick a random derivative of the base point on the elliptic curve. // Pick a random derivative of the base point on the elliptic curve.
// R = cG; // R = cG;

View File

@ -236,7 +236,7 @@ void PIDGEN3::BINK2002::Generate(
EC_POINT *r = EC_POINT_new(eCurve); EC_POINT *r = EC_POINT_new(eCurve);
// Generate a random number c consisting of 512 bits without any constraints. // Generate a random number c consisting of 512 bits without any constraints.
BN_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); UMSKT::umskt_bn_rand(c, FIELD_BITS_2003, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
// R = cG // R = cG
EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext); EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext);