Update confid.cpp

This commit is contained in:
pottzman 2023-09-06 20:46:36 +10:00 committed by GitHub
parent 2703e17f69
commit 36b2eb3e7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -32,10 +32,7 @@
QWORD MOD = 0; QWORD MOD = 0;
QWORD NON_RESIDUE = 0; QWORD NON_RESIDUE = 0;
QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; QWORD f[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
int productID1; int productID[4];
int productID2;
int productID3;
int productID4;
int activationMode; int activationMode;
int ConfirmationID::calculateCheckDigit(int pid) int ConfirmationID::calculateCheckDigit(int pid)
@ -693,6 +690,22 @@ void ConfirmationID::decode_iid_new_version(unsigned char* iid, unsigned char* h
QWORD hardwareIDVal = ((QWORD)v1 << 32) | v2; QWORD hardwareIDVal = ((QWORD)v1 << 32) | v2;
for (i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
hwid[i] = (hardwareIDVal >> (8 * i)) & 0xFF; hwid[i] = (hardwareIDVal >> (8 * i)) & 0xFF;
unsigned __int32 v3 = ((buffer[0] & 0xFFFFFF80) >> 7) & 0xFFFFFFFF;
unsigned __int32 v4 = v3 & 0xFFFFF800;
unsigned __int32 v5 = buffer[1] & 0x7F;
unsigned __int32 v6 = buffer[1] >> 7;
unsigned __int32 v7 = ((v5 << 25) | v4) >> 11;
productID[1] = v7 & 0x000003FF;
unsigned __int32 v8 = v7 & 0xFFFFFC00;
unsigned __int32 v9 = (v6 >> 11) & 0x00001FFF;
unsigned __int32 v10 = v9 & 0x00001C00;
unsigned __int32 v11 = v9 & 0x000003FF;
unsigned __int32 v12 = (((v6 << 21) & 0xFFFFFFFF) | v8) >> 10;
unsigned __int32 v13 = (v11 << 22) & 0xFFFFFFFF;
unsigned __int32 v14 = v13 | v12;
productID[2] = v14 & 0x000FFFFF;
productID[2] = calculateCheckDigit(productID[2]);
productID[3] = (v14 & 0x3FF00000) >> 20;
*version = buffer[0] & 7; *version = buffer[0] & 7;
} }
@ -889,11 +902,11 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
case 1: case 1:
case 4: case 4:
memcpy(&parsed, installation_id, sizeof(parsed)); memcpy(&parsed, installation_id, sizeof(parsed));
productID1 = parsed.ProductIDLow & ((1 << 17) - 1); productID[0] = parsed.ProductIDLow & ((1 << 17) - 1);
productID2 = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1); productID[1] = (parsed.ProductIDLow >> 17) & ((1 << 10) - 1);
productID3 = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1); productID[2] = (parsed.ProductIDLow >> 27) & ((1 << 24) - 1);
version = (parsed.ProductIDLow >> 51) & 15; version = (parsed.ProductIDLow >> 51) & 15;
productID4 = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9); productID[3] = (parsed.ProductIDLow >> 55) | (parsed.ProductIDHigh << 9);
switch (activationMode) { switch (activationMode) {
case 0: case 0:
if (version != (totalCount == 41 ? 9 : 10)) if (version != (totalCount == 41 ? 9 : 10))
@ -911,20 +924,17 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
case 2: case 2:
case 3: case 3:
decode_iid_new_version(installation_id, hardwareID, &version); decode_iid_new_version(installation_id, hardwareID, &version);
productID1 = stoi(productid.substr(0,5)); productID[0] = stoi(productid.substr(0,5));
std::string channelid = productid.substr(6,3); std::string channelid = productid.substr(6,3);
char *p = &channelid[0]; char *p = &channelid[0];
for (; *p; p++) { for (; *p; p++) {
*p = toupper((unsigned char)*p); *p = toupper((unsigned char)*p);
} }
if (strcmp(&channelid[0], "OEM") == 0) { p = &channelid[0];
productID2 = stoi(productid.substr(12,3)); if (strcmp(p, "OEM") == 0) {
productID3 = calculateCheckDigit((stoi(productid.substr(15,1)) * 100000) + (stoi(productid.substr(18,5)))); productID[3] = (stoi((productid.substr(10,2))) / 100000) * 1000;
productID4 = (stoi((productid.substr(10,2))) / 100000) * 1000;
} else { } else {
productID2 = stoi(productid.substr(6,3)); productID[3] = stoi(productid.substr(18,5));
productID3 = stoi(productid.substr(10,7));
productID4 = stoi(productid.substr(18,5));
} }
switch (activationMode) { switch (activationMode) {
case 2: case 2:
@ -938,11 +948,10 @@ int ConfirmationID::Generate(const char* installation_id_str, char confirmation_
memcpy(&parsed, hardwareID, 8); memcpy(&parsed, hardwareID, 8);
break; break;
} }
//printf("Product ID: %05u-%03u-%07u-%05u\n", productId1, productId2, productId3, productId4);
unsigned char keybuf[16]; unsigned char keybuf[16];
memcpy(keybuf, &parsed.HardwareID, 8); memcpy(keybuf, &parsed.HardwareID, 8);
QWORD productIdMixed = (QWORD)productID1 << 41 | (QWORD)productID2 << 58 | (QWORD)productID3 << 17 | productID4; QWORD productIdMixed = (QWORD)productID[0] << 41 | (QWORD)productID[1] << 58 | (QWORD)productID[2] << 17 | productID[3];
memcpy(keybuf + 8, &productIdMixed, 8); memcpy(keybuf + 8, &productIdMixed, 8);
TDivisor d; TDivisor d;