From c306573fe81eef48efd99260baefaa6ab01aaf7a Mon Sep 17 00:00:00 2001 From: Neo <321592+Neo-Desktop@users.noreply.github.com> Date: Sat, 10 Jun 2023 15:42:14 -0700 Subject: [PATCH 1/2] add product mappings provided by pottzman --- keys.json | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/keys.json b/keys.json index 83ee1b7..4b1f385 100644 --- a/keys.json +++ b/keys.json @@ -12,30 +12,48 @@ "Office 2000": { "BINK": ["04", "05"] }, + "Internet Security and Acceleration (ISA) Server 2004": { + "BINK": ["06", "07"] + }, "PLUS! for Windows XP": { "BINK": ["08", "09"] }, "Windows 2000 Server (all)": { "BINK": ["0A", "13"] }, + "Office Communicator 2007": { + "BINK": ["0C", "0D"] + }, "Windows Embedded POSReady 2009": { "BINK": ["0D", "0D"] }, "Windows CE .Net Platform Builder 5": { "BINK": ["0D", "0D"] }, + "Commerce Server 2002": { + "BINK": ["0E", "0F"] + }, "Windows 2000 Professional": { "BINK": ["12", "13"] }, + "Office for Mac 2004 / 2008": { + "BINK": ["18", "19"] + }, "Windows ME": { "BINK": ["1C", "1D"] }, + "Office XP Applications": { + "BINK": ["20", "21"] + }, "Office XP": { "BINK": ["22", "23"] }, "Visual Studio .Net / .Net 2003": { "BINK": ["24", "25"] }, + "Windows XP Professional Evaluation": { + "BINK": ["28", "29"] + }, "Windows XP Home": { "BINK": ["2A", "2B"] }, @@ -48,6 +66,12 @@ "Windows XP Pro VLK": { "BINK": ["2E", "2F"] }, + "Windows XP Fundamentals for Legacy PCs": { + "BINK": ["2E", "2F"] + }, + "Windows XP Professional K": { + "BINK": ["30", "31"] + }, "Windows XP Starter Edition": { "BINK": ["32", "33"] }, @@ -56,6 +80,9 @@ }, "Halo: Combat Evolved": { "BINK": ["50", "51"] + }, + "Halo: Custom Edition": { + "BINK": ["50", "51"] }, "Visual Studio 2005": { "BINK": ["52", "53"] @@ -84,8 +111,35 @@ "Windows Server 2003 64 Bit VLK": { "BINK": ["68", "69", "6C", "6D"] }, + "Office 2003 Applications": { + "BINK": ["6E", "6F"] + }, + "Office 2003 Small Business": { + "BINK": ["70", "71"] + }, + "Office 2003 Professional": { + "BINK": ["72", "73"] + }, "Windows Longhorn (6.0.4039.0 -> Pre PIDGENX)": { "BINK": ["74", "75"] + }, + "Identity Lifecycle Manager 2007": { + "BINK": ["78", "79"] + }, + "Visual Studio 2008": { + "BINK": ["78", "79"] + }, + "Office 2007 Applications": { + "BINK": ["7E", "7F"] + }, + "Office 2007 Basic / Small Business": { + "BINK": ["80", "81"] + }, + "Office 2007 Standard / Professional / Ultimate / Enterprise": { + "BINK": ["82", "83"] + }, + "Office 2007 Home & Student": { + "BINK": ["88", "89"] } }, "BINK": { From fa0f8329195148470ca58ea85c75a20b1d0fb037 Mon Sep 17 00:00:00 2001 From: Neo <321592+Neo-Desktop@users.noreply.github.com> Date: Sun, 11 Jun 2023 07:03:24 -0700 Subject: [PATCH 2/2] ensure values in CLI object are initalized before using them --- src/cli.cpp | 94 +++++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/src/cli.cpp b/src/cli.cpp index 949eec1..af231ff 100644 --- a/src/cli.cpp +++ b/src/cli.cpp @@ -214,54 +214,56 @@ void CLI::printKey(char *pk) { CLI::CLI(Options options, json keys) { this->options = options; + this->keys = keys; - BINKID = options.binkid.c_str(); + this->BINKID = options.binkid.c_str(); // We cannot produce a valid key without knowing the private key k. The reason for this is that // we need the result of the function K(x; y) = kG(x; y). - privateKey = BN_new(); + this->privateKey = BN_new(); // We can, however, validate any given key using the available public key: {p, a, b, G, K}. // genOrder the order of the generator G, a value we have to reverse -> Schoof's Algorithm. - genOrder = BN_new(); + this->genOrder = BN_new(); /* Computed data */ - BN_dec2bn(&genOrder, keys["BINK"][BINKID]["n"].get().c_str()); - BN_dec2bn(&privateKey, keys["BINK"][BINKID]["priv"].get().c_str()); + BN_dec2bn(&this->genOrder, this->keys["BINK"][this->BINKID]["n"]. get().c_str()); + BN_dec2bn(&this->privateKey, this->keys["BINK"][this->BINKID]["priv"].get().c_str()); if (options.verbose) { fmt::print("----------------------------------------------------------- \n"); - fmt::print("Loaded the following elliptic curve parameters: BINK[{}]\n", BINKID); + fmt::print("Loaded the following elliptic curve parameters: BINK[{}]\n", this->BINKID); fmt::print("----------------------------------------------------------- \n"); - fmt::print(" P: {}\n", keys["BINK"][BINKID]["p"].get()); - fmt::print(" a: {}\n", keys["BINK"][BINKID]["a"].get()); - fmt::print(" b: {}\n", keys["BINK"][BINKID]["b"].get()); - fmt::print("Gx: {}\n", keys["BINK"][BINKID]["g"]["x"].get()); - fmt::print("Gy: {}\n", keys["BINK"][BINKID]["g"]["y"].get()); - fmt::print("Kx: {}\n", keys["BINK"][BINKID]["pub"]["x"].get()); - fmt::print("Ky: {}\n", keys["BINK"][BINKID]["pub"]["y"].get()); - fmt::print(" n: {}\n", keys["BINK"][BINKID]["n"].get()); - fmt::print(" k: {}\n", keys["BINK"][BINKID]["priv"].get()); + fmt::print(" P: {}\n", this->keys["BINK"][this->BINKID]["p"].get()); + fmt::print(" a: {}\n", this->keys["BINK"][this->BINKID]["a"].get()); + fmt::print(" b: {}\n", this->keys["BINK"][this->BINKID]["b"].get()); + fmt::print("Gx: {}\n", this->keys["BINK"][this->BINKID]["g"]["x"].get()); + fmt::print("Gy: {}\n", this->keys["BINK"][this->BINKID]["g"]["y"].get()); + fmt::print("Kx: {}\n", this->keys["BINK"][this->BINKID]["pub"]["x"].get()); + fmt::print("Ky: {}\n", this->keys["BINK"][this->BINKID]["pub"]["y"].get()); + fmt::print(" n: {}\n", this->keys["BINK"][this->BINKID]["n"].get()); + fmt::print(" k: {}\n", this->keys["BINK"][this->BINKID]["priv"].get()); fmt::print("\n"); } eCurve = initializeEllipticCurve( - keys["BINK"][BINKID]["p"].get(), - keys["BINK"][BINKID]["a"].get(), - keys["BINK"][BINKID]["b"].get(), - keys["BINK"][BINKID]["g"]["x"].get(), - keys["BINK"][BINKID]["g"]["y"].get(), - keys["BINK"][BINKID]["pub"]["x"].get(), - keys["BINK"][BINKID]["pub"]["y"].get(), - genPoint, - pubPoint + this->keys["BINK"][this->BINKID]["p"].get(), + this->keys["BINK"][this->BINKID]["a"].get(), + this->keys["BINK"][this->BINKID]["b"].get(), + this->keys["BINK"][this->BINKID]["g"]["x"].get(), + this->keys["BINK"][this->BINKID]["g"]["y"].get(), + this->keys["BINK"][this->BINKID]["pub"]["x"].get(), + this->keys["BINK"][this->BINKID]["pub"]["y"].get(), + this->genPoint, + this->pubPoint ); - total = options.numKeys; + this->count = 0; + this->total = this->options.numKeys; } int CLI::BINK1998() { - DWORD nRaw = options.channelID * 1'000'000 ; /* <- change */ + DWORD nRaw = this->options.channelID * 1'000'000 ; /* <- change */ BIGNUM *bnrand = BN_new(); BN_rand(bnrand, 19, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY); @@ -272,81 +274,87 @@ int CLI::BINK1998() { sscanf(cRaw, "%d", &oRaw); nRaw += (oRaw % 999999); // ensure our serial is less than 999999 - if (options.verbose) { + if (this->options.verbose) { fmt::print("> PID: {:09d}\n", nRaw); } // generate a key - BN_sub(privateKey, genOrder, privateKey); + BN_sub(this->privateKey, this->genOrder, this->privateKey); // Specify whether an upgrade version or not bool bUpgrade = false; - for (int i = 0; i < total; i++) { - BINK1998::Generate(eCurve, genPoint, genOrder, privateKey, nRaw, bUpgrade, pKey); - CLI::printKey(pKey); + for (int i = 0; i < this->total; i++) { + BINK1998::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, nRaw, bUpgrade, this->pKey); + CLI::printKey(this->pKey); fmt::print("\n"); // verify the key - count += BINK1998::Verify(eCurve, genPoint, pubPoint, pKey); + this->count += BINK1998::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey); } - fmt::print("Success count: {}/{}\n", count, total); + fmt::print("Success count: {}/{}\n", this->count, this->total); return 0; } int CLI::BINK2002() { - DWORD pChannelID = options.channelID; + DWORD pChannelID = this->options.channelID; - if (options.verbose) { - fmt::print("> Channel ID: {:03d}\n", options.channelID); + if (this->options.verbose) { + fmt::print("> Channel ID: {:03d}\n", this->options.channelID); } // generate a key - for (int i = 0; i < total; i++) { + for (int i = 0; i < this->total; i++) { DWORD pAuthInfo; RAND_bytes((BYTE *)&pAuthInfo, 4); pAuthInfo &= BITMASK(10); - if (options.verbose) { + if (this->options.verbose) { fmt::print("> AuthInfo: {}\n", pAuthInfo); } - BINK2002::Generate(eCurve, genPoint, genOrder, privateKey, pChannelID, pAuthInfo, false, pKey); - CLI::printKey(pKey); + BINK2002::Generate(this->eCurve, this->genPoint, this->genOrder, this->privateKey, pChannelID, pAuthInfo, false, this->pKey); + CLI::printKey(this->pKey); fmt::print("\n\n"); // verify a key - count += BINK2002::Verify(eCurve, genPoint, pubPoint, pKey); + this->count += BINK2002::Verify(this->eCurve, this->genPoint, this->pubPoint, this->pKey); } - fmt::print("Success count: {}/{}\n", count, total); + fmt::print("Success count: {}/{}\n", this->count, this->total); return 0; } int CLI::ConfirmationID() { char confirmation_id[49]; - int err = ConfirmationID::Generate(options.instid.c_str(), confirmation_id); + int err = ConfirmationID::Generate(this->options.instid.c_str(), confirmation_id); switch (err) { case ERR_TOO_SHORT: fmt::print("ERROR: Installation ID is too short.\n"); return 1; + case ERR_TOO_LARGE: fmt::print("ERROR: Installation ID is too long.\n"); return 1; + case ERR_INVALID_CHARACTER: fmt::print("ERROR: Invalid character in installation ID.\n"); return 1; + case ERR_INVALID_CHECK_DIGIT: fmt::print("ERROR: Installation ID checksum failed. Please check that it is typed correctly.\n"); return 1; + case ERR_UNKNOWN_VERSION: fmt::print("ERROR: Unknown installation ID version.\n"); return 1; + case ERR_UNLUCKY: fmt::print("ERROR: Unable to generate valid confirmation ID.\n"); return 1; + case SUCCESS: fmt::print("Confirmation ID: {}\n", confirmation_id); return 0;