def client_update(): kmsdb = kmsDB2Dict() loggerclt.debug(f'Searching in kms database for machine "{clt_config["mode"]}"...') appitems = kmsdb[2] for appitem in appitems: kmsitems = appitem['KmsItems'] for kmsitem in kmsitems: name = re.sub('\(.*\)', '', kmsitem['DisplayName']) # Remove bracets name = name.replace('2015', '') # Remove specific years name = name.replace(' ', '') # Ignore whitespaces name = name.replace('/11', '', 1) # Cut out Windows 11, as it is basically Windows 10 if name == clt_config['mode']: skuitems = kmsitem['SkuItems'] # Select 'Enterprise' for Windows or 'Professional Plus' for Office. for skuitem in skuitems: sName = skuitem['DisplayName'] sName = sName.replace(' ', '') # Ignore whitespaces sName = sName.replace('/11', '', 1) # Cut out Windows 11, as it is basically Windows 10 if sName == name + 'Enterprise' or \ sName == name[:6] + 'ProfessionalPlus' + name[6:]: clt_config['KMSClientSkuID'] = skuitem['Id'] clt_config['RequiredClientCount'] = int(kmsitem['NCountPolicy']) clt_config['KMSProtocolMajorVersion'] = int(float(kmsitem['DefaultKmsProtocol'])) clt_config['KMSProtocolMinorVersion'] = 0 clt_config['KMSClientLicenseStatus'] = 2 clt_config['KMSClientAppID'] = appitem['Id'] clt_config['KMSClientKMSCountedID'] = kmsitem['Id'] return raise RuntimeError(f'Client failed to find machine configuration in kms database - make sure it contains an entry for "{clt_config["mode"]}"')
def client_update(): kmsdb = kmsDB2Dict() appitems = kmsdb[2] for appitem in appitems: kmsitems = appitem['KmsItems'] for kmsitem in kmsitems: name = re.sub('\(.*\)', '', kmsitem['DisplayName']).replace('2015', '').replace(' ', '') if name == clt_config['mode']: skuitems = kmsitem['SkuItems'] # Select 'Enterprise' for Windows or 'Professional Plus' for Office. for skuitem in skuitems: if skuitem['DisplayName'].replace(' ','') == name + 'Enterprise' or \ skuitem['DisplayName'].replace(' ','') == name[:6] + 'ProfessionalPlus' + name[6:]: clt_config['KMSClientSkuID'] = skuitem['Id'] clt_config['RequiredClientCount'] = int( kmsitem['NCountPolicy']) clt_config['KMSProtocolMajorVersion'] = int( float(kmsitem['DefaultKmsProtocol'])) clt_config['KMSProtocolMinorVersion'] = 0 clt_config['KMSClientLicenseStatus'] = 2 clt_config['KMSClientAppID'] = appitem['Id'] clt_config['KMSClientKMSCountedID'] = kmsitem['Id'] break
def serverLogic(self, kmsRequest): if self.srv_config['sqlite']: sql_initialize(self.srv_config['sqlite']) pretty_printer(num_text=15, where="srv") kmsRequest = byterize(kmsRequest) loggersrv.debug("KMS Request Bytes: \n%s\n" % justify( deco(binascii.b2a_hex(enco(str(kmsRequest), 'latin-1')), 'latin-1'))) loggersrv.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout=False))) clientMachineId = kmsRequest['clientMachineId'].get() applicationId = kmsRequest['applicationId'].get() skuId = kmsRequest['skuId'].get() requestDatetime = filetime_to_dt(kmsRequest['requestTime']) # Localize the request time, if module "tzlocal" is available. try: from tzlocal import get_localzone from pytz.exceptions import UnknownTimeZoneError try: tz = get_localzone() local_dt = tz.localize(requestDatetime) except UnknownTimeZoneError: pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Unknown time zone ! Request time not localized.{end}" ) local_dt = requestDatetime except ImportError: pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Module 'tzlocal' not available ! Request time not localized.{end}" ) local_dt = requestDatetime # Activation threshold. # https://docs.microsoft.com/en-us/windows/deployment/volume-activation/activate-windows-10-clients-vamt MinClients = kmsRequest['requiredClientCount'] RequiredClients = MinClients * 2 if self.srv_config["clientcount"] != None: if 0 < self.srv_config["clientcount"] < MinClients: # fixed to 6 (product server) or 26 (product desktop) currentClientCount = MinClients + 1 pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Not enough clients ! Fixed with %s, but activated client \ could be detected as not genuine !{end}" % currentClientCount) elif MinClients <= self.srv_config["clientcount"] < RequiredClients: currentClientCount = self.srv_config["clientcount"] pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}With count = %s, activated client could be detected as not genuine !{end}" % currentClientCount) elif self.srv_config["clientcount"] >= RequiredClients: # fixed to 10 (product server) or 50 (product desktop) currentClientCount = RequiredClients if self.srv_config["clientcount"] > RequiredClients: pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Too many clients ! Fixed with %s{end}" % currentClientCount) else: # fixed to 10 (product server) or 50 (product desktop) currentClientCount = RequiredClients # Get a name for SkuId, AppId. kmsdb = kmsDB2Dict() appitems = kmsdb[2] for appitem in appitems: kmsitems = appitem['KmsItems'] for kmsitem in kmsitems: skuitems = kmsitem['SkuItems'] for skuitem in skuitems: try: if uuid.UUID(skuitem['Id']) == skuId: skuName = skuitem['DisplayName'] break except: skuName = skuId pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Can't find a name for this product !{end}" ) try: if uuid.UUID(appitem['Id']) == applicationId: appName = appitem['DisplayName'] except: appName = applicationId pretty_printer( log_obj=loggersrv.warning, put_text= "{reverse}{yellow}{bold}Can't find a name for this application group !{end}" ) infoDict = { "machineName": kmsRequest.getMachineName(), "clientMachineId": str(clientMachineId), "appId": appName, "skuId": skuName, "licenseStatus": kmsRequest.getLicenseStatus(), "requestTime": int(time.time()), "kmsEpid": None } loggersrv.info("Machine Name: %s" % infoDict["machineName"]) loggersrv.info("Client Machine ID: %s" % infoDict["clientMachineId"]) loggersrv.info("Application ID: %s" % infoDict["appId"]) loggersrv.info("SKU ID: %s" % infoDict["skuId"]) loggersrv.info("License Status: %s" % infoDict["licenseStatus"]) loggersrv.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)')) if self.srv_config['loglevel'] == 'MINI': loggersrv.mini("", extra={ 'host': socket.gethostname() + " [" + self.srv_config["ip"] + "]", 'status': infoDict["licenseStatus"], 'product': infoDict["skuId"] }) if self.srv_config['sqlite']: sql_update(self.srv_config['sqlite'], infoDict) return self.createKmsResponse(kmsRequest, currentClientCount)
def epidGenerator(kmsId, version, lcid): kmsdb = kmsDB2Dict() winbuilds, csvlkitems, appitems = kmsdb[0], kmsdb[1], kmsdb[2] hosts, pkeys = [[] for _ in range(2)] # Product Specific Detection (Get all CSVLK GroupID and PIDRange good for EPID generation), then # Generate Part 2: Group ID and Product Key ID Range for csvlkitem in csvlkitems: try: if kmsId in [ uuid.UUID(kmsitem) for kmsitem in csvlkitem['Activate'] ]: pkeys.append( (csvlkitem['GroupId'], csvlkitem['MinKeyId'], csvlkitem['MaxKeyId'], csvlkitem['InvalidWinBuild'])) else: # fallback to Windows Server 2019 parameters. pkeys.append(('206', '551000000', '570999999', '[0,1,2]')) except IndexError: # fallback to Windows Server 2019 parameters. pkeys.append(('206', '551000000', '570999999', '[0,1,2]')) pkey = random.choice(pkeys) GroupId, MinKeyId, MaxKeyId, Invalid = int(pkey[0]), int(pkey[1]), int( pkey[2]), literal_eval(pkey[3]) # Get all KMS Server Host Builds good for EPID generation, then # Generate Part 1 & 7: Host Type and KMS Server OS Build for winbuild in winbuilds: try: # Check versus "InvalidWinBuild". if int(winbuild['WinBuildIndex']) not in Invalid: hosts.append(winbuild) except KeyError: # fallback to Windows Server 2019 parameters. hosts.append({ 'BuildNumber': '17763', 'PlatformId': '3612', 'MinDate': '02/10/2018' }) host = random.choice(hosts) BuildNumber, PlatformId, MinDate = host['BuildNumber'], host[ 'PlatformId'], host['MinDate'] # Generate Part 3 and Part 4: Product Key ID productKeyID = random.randint(MinKeyId, MaxKeyId) # Generate Part 5: License Channel (00=Retail, 01=Retail, 02=OEM, 03=Volume(GVLK,MAK)) - always 03 licenseChannel = 3 # Generate Part 6: Language - use system default language, 1033 is en-us languageCode = lcid # (C# CultureInfo.InstalledUICulture.LCID) # Generate Part 8: KMS Host Activation Date d = datetime.datetime.strptime(MinDate, "%d/%m/%Y") minTime = datetime.date(d.year, d.month, d.day) # Generate Year and Day Number randomDate = datetime.date.fromtimestamp( random.randint(time.mktime(minTime.timetuple()), time.mktime(datetime.datetime.now().timetuple()))) firstOfYear = datetime.date(randomDate.year, 1, 1) randomDayNumber = int((time.mktime(randomDate.timetuple()) - time.mktime(firstOfYear.timetuple())) / 86400 + 0.5) # Generate the EPID string result = [] result.append(str(PlatformId).rjust(5, "0")) result.append("-") result.append(str(GroupId).rjust(5, "0")) result.append("-") result.append(str(productKeyID // 1000000).rjust(3, "0")) result.append("-") result.append(str(productKeyID % 1000000).rjust(6, "0")) result.append("-") result.append(str(licenseChannel).rjust(2, "0")) result.append("-") result.append(str(languageCode)) result.append("-") result.append(str(BuildNumber).rjust(4, "0")) result.append(".0000-") result.append(str(randomDayNumber).rjust(3, "0")) result.append(str(randomDate.year).rjust(4, "0")) return "".join(result)