mirror of
https://github.com/Neo-Desktop/WindowsXPKg
synced 2025-06-24 06:24:16 +03:00
Compare commits
35 Commits
c209070a66
...
master
Author | SHA1 | Date | |
---|---|---|---|
25ed8d4f43 | |||
324688e9ef | |||
6ae46d6aa2 | |||
e07c080ee8 | |||
ce9ff7e624 | |||
714895c61b | |||
6ecf9c5309 | |||
9f7d53dab3 | |||
a66e579377 | |||
e30a4713b6 | |||
e9228045d3 | |||
36de07ecdf | |||
a28f4b5ca3 | |||
a0cb9e9869 | |||
6d30abba98 | |||
8b6c3b252b | |||
1fd7550f85 | |||
1f85bf954e | |||
74ff1ea08c | |||
0a63055e91 | |||
94da628e48 | |||
8e58232803 | |||
78ec40f4e3 | |||
9d36fb2f66 | |||
2166ee6e2f | |||
e85add2a54 | |||
f459316865 | |||
60a9b0ea70 | |||
0ebce49cf0 | |||
caa37365d4 | |||
8fe0fc06b2 | |||
fc4b83d1e8 | |||
aa331ad6e4 | |||
9b06fcf162 | |||
a4d810b030 |
4
.github/workflows/dos-djgpp.yml
vendored
4
.github/workflows/dos-djgpp.yml
vendored
@ -64,8 +64,8 @@ jobs:
|
||||
git clone https://github.com/UMSKT/openssl.git openssl
|
||||
pushd openssl
|
||||
source ${{ github.workspace }}/djgpp/setenv
|
||||
./Configure no-threads -DOPENSSL_DEV_NO_ATOMICS --prefix=${{ github.workspace }}/djgpp DJGPP
|
||||
make && make install
|
||||
./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_sw
|
||||
popd
|
||||
|
||||
- name: Build
|
||||
|
79
.github/workflows/windows.yml
vendored
79
.github/workflows/windows.yml
vendored
@ -27,29 +27,12 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-tdm64:
|
||||
build-tdm:
|
||||
runs-on: windows-latest
|
||||
env:
|
||||
OPENSSL_VERSION: "3.1.8"
|
||||
OPENSSL_PREFIX: "${{ github.workspace }}/openssl-install-64"
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x64, x86]
|
||||
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
|
||||
run: |
|
||||
Write-Host Downloading TDM-GCC v10.3.0...
|
||||
@ -66,30 +49,38 @@ jobs:
|
||||
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||
[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
|
||||
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
|
||||
run: |
|
||||
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||
$OPENSSL_ROOT = "$env:GITHUB_WORKSPACE/openssl-install-64"
|
||||
$OPENSSL_LIB = "$OPENSSL_ROOT"
|
||||
$OPENSSL_ROOT = "$env:OPENSSL_ROOT"
|
||||
$OPENSSL_LIB = "$OPENSSL_ROOT/$env:OPENSSL_LIBDIR"
|
||||
$OPENSSL_INC = "$OPENSSL_ROOT/include"
|
||||
|
||||
cmake -G "MinGW Makefiles" `
|
||||
-DCMAKE_C_COMPILER="gcc" `
|
||||
-DCMAKE_CXX_COMPILER="g++" `
|
||||
@ -97,11 +88,11 @@ jobs:
|
||||
-DOPENSSL_INCLUDE_DIR="$OPENSSL_INC" `
|
||||
-DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_LIB/libcrypto.a" `
|
||||
-DOPENSSL_SSL_LIBRARY="$OPENSSL_LIB/libssl.a" `
|
||||
-DCMAKE_C_FLAGS="-m64" `
|
||||
-DCMAKE_CXX_FLAGS="-m64" `
|
||||
-DCMAKE_C_FLAGS="$env:CMAKE_FLAGS" `
|
||||
-DCMAKE_CXX_FLAGS="$env:CMAKE_FLAGS" `
|
||||
.
|
||||
|
||||
- name: Build UMSKT (TDM-GCC 64-bit)
|
||||
- name: Build UMSKT (TDM-GCC ${{ matrix.arch }})
|
||||
shell: pwsh
|
||||
run: |
|
||||
$env:PATH = 'C:\TDM-GCC-64\bin;' + $env:PATH
|
||||
@ -110,7 +101,5 @@ jobs:
|
||||
- name: Upload build artifact
|
||||
uses: actions/upload-artifact@v4.6.2
|
||||
with:
|
||||
name: UMSKT-TDM64
|
||||
path: ./Release/*
|
||||
|
||||
# 32-bit support will happen when everything's all good
|
||||
name: UMSKT-TDM${{ matrix.arch }}
|
||||
path: umskt.exe
|
||||
|
@ -70,6 +70,11 @@ IF(DJGPP_WATT32)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||
SET(UMSKT_LINK_LIBS ${UMSKT_LINK_LIBS} ${DJGPP_WATT32})
|
||||
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()
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
|
27
src/cli.cpp
27
src/cli.cpp
@ -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-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-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");
|
||||
}
|
||||
|
||||
@ -94,6 +95,7 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
MODE_BINK1998_GENERATE,
|
||||
WINDOWS
|
||||
};
|
||||
@ -214,6 +216,8 @@ int CLI::parseCommandLine(int argc, char* argv[], Options* options) {
|
||||
options->nonewlines = true;
|
||||
} else if (arg == "-o" || arg == "--override") {
|
||||
options->overrideVersion = true;
|
||||
} else if (arg == "-D" || arg == "--nodashes") {
|
||||
options->nodashes = true;
|
||||
} else {
|
||||
options->error = true;
|
||||
}
|
||||
@ -327,9 +331,14 @@ void CLI::printID(DWORD *pid) {
|
||||
|
||||
void CLI::printKey(char *pk) {
|
||||
assert(strlen(pk) >= PK_LENGTH);
|
||||
std::string keyFormat = "{}-{}-{}-{}-{}";
|
||||
|
||||
if (this->options.nodashes == true) {
|
||||
keyFormat = "{}{}{}{}{}";
|
||||
}
|
||||
|
||||
std::string spk = pk;
|
||||
fmt::print("{}-{}-{}-{}-{}",
|
||||
fmt::print(keyFormat,
|
||||
spk.substr(0,5),
|
||||
spk.substr(5,5),
|
||||
spk.substr(10,5),
|
||||
@ -423,7 +432,7 @@ int CLI::BINK1998Generate() {
|
||||
} else {
|
||||
// generate a random number to use as a serial
|
||||
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;
|
||||
char *cRaw = BN_bn2dec(bnrand);
|
||||
@ -484,7 +493,7 @@ int CLI::BINK2002Generate() {
|
||||
// generate a key
|
||||
for (int i = 0; i < this->total; i++) {
|
||||
DWORD pAuthInfo;
|
||||
RAND_bytes((BYTE *)&pAuthInfo, 4);
|
||||
UMSKT::umskt_rand_bytes((BYTE *)&pAuthInfo, 4);
|
||||
pAuthInfo &= BITMASK(10);
|
||||
|
||||
if (this->options.verbose) {
|
||||
@ -591,7 +600,17 @@ int CLI::ConfirmationID() {
|
||||
return 1;
|
||||
|
||||
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);
|
||||
|
||||
if (this->options.nonewlines == false) {
|
||||
fmt::print("\n");
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ struct Options {
|
||||
bool list;
|
||||
bool nonewlines;
|
||||
bool overrideVersion;
|
||||
bool nodashes;
|
||||
|
||||
MODE applicationMode;
|
||||
ACTIVATION_ALGORITHM activationMode;
|
||||
@ -93,7 +94,7 @@ public:
|
||||
static int parseCommandLine(int argc, char* argv[], Options *options);
|
||||
static int validateCommandLine(Options* options, char *argv[], json *keys);
|
||||
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]);
|
||||
|
||||
int BINK1998Generate();
|
||||
|
@ -58,3 +58,78 @@ FNEXPORT int PIDGEN2_GenerateRetail(char* channelID, char* &keyout) {
|
||||
FNEXPORT int PIDGEN2_GenerateOEM(char* year, char* day, char* oem, char* 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
|
||||
}
|
||||
|
@ -38,6 +38,10 @@
|
||||
#include <fmt/core.h>
|
||||
#include <fmt/format.h>
|
||||
|
||||
#ifdef __DJGPP__
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
// Algorithm macros
|
||||
#define PK_LENGTH 25
|
||||
#define NULL_TERMINATOR 1
|
||||
@ -59,6 +63,17 @@
|
||||
#define BYDWORD(n) (DWORD)(*((n) + 0) | *((n) + 1) << 8 | *((n) + 2) << 16 | *((n) + 3) << 24)
|
||||
#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 {
|
||||
public:
|
||||
static std::FILE* debug;
|
||||
@ -67,7 +82,10 @@ public:
|
||||
class ConfigurationID;
|
||||
|
||||
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
|
||||
|
@ -201,7 +201,7 @@ void PIDGEN3::BINK1998::Generate(
|
||||
EC_POINT *r = EC_POINT_new(eCurve);
|
||||
|
||||
// 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.
|
||||
// R = cG;
|
||||
|
@ -236,7 +236,7 @@ void PIDGEN3::BINK2002::Generate(
|
||||
EC_POINT *r = EC_POINT_new(eCurve);
|
||||
|
||||
// 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
|
||||
EC_POINT_mul(eCurve, r, nullptr, basePoint, c, numContext);
|
||||
|
Reference in New Issue
Block a user