mirror of
https://github.com/SystemRage/py-kms.git
synced 2024-11-25 17:55:37 +01:00
Add the logsize option
Add -S or --logsize to define a maximum size for the logs.
This commit is contained in:
parent
83a59b3584
commit
96ac35104f
@ -19,6 +19,8 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class UUID(Structure):
|
class UUID(Structure):
|
||||||
commonHdr = ()
|
commonHdr = ()
|
||||||
structure = (
|
structure = (
|
||||||
@ -131,7 +133,7 @@ class kmsBase:
|
|||||||
skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)")
|
skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)")
|
||||||
|
|
||||||
except sqlite3.Error, e:
|
except sqlite3.Error, e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -140,8 +142,8 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
con.close()
|
con.close()
|
||||||
|
|
||||||
shell_message(nshell = 15)
|
shell_message(nshell = 15)
|
||||||
logging.debug("KMS Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(kmsRequest))))
|
logger.debug("KMS Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(kmsRequest))))
|
||||||
logging.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout = False)))
|
logger.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout = False)))
|
||||||
|
|
||||||
clientMachineId = kmsRequest['clientMachineId'].get()
|
clientMachineId = kmsRequest['clientMachineId'].get()
|
||||||
applicationId = kmsRequest['applicationId'].get()
|
applicationId = kmsRequest['applicationId'].get()
|
||||||
@ -156,10 +158,10 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
tz = get_localzone()
|
tz = get_localzone()
|
||||||
local_dt = tz.localize(requestDatetime)
|
local_dt = tz.localize(requestDatetime)
|
||||||
except UnknownTimeZoneError:
|
except UnknownTimeZoneError:
|
||||||
logging.warning('Unknown time zone ! Request time not localized.')
|
logger.warning('Unknown time zone ! Request time not localized.')
|
||||||
local_dt = requestDatetime
|
local_dt = requestDatetime
|
||||||
except ImportError:
|
except ImportError:
|
||||||
logging.warning('Module "tzlocal" not available ! Request time not localized.')
|
logger.warning('Module "tzlocal" not available ! Request time not localized.')
|
||||||
local_dt = requestDatetime
|
local_dt = requestDatetime
|
||||||
|
|
||||||
# Get SkuId, AppId and client threshold.
|
# Get SkuId, AppId and client threshold.
|
||||||
@ -206,12 +208,12 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
"kmsEpid" : None
|
"kmsEpid" : None
|
||||||
}
|
}
|
||||||
|
|
||||||
logging.info("Machine Name: %s" % infoDict["machineName"])
|
logger.info("Machine Name: %s" % infoDict["machineName"])
|
||||||
logging.info("Client Machine ID: %s" % infoDict["clientMachineId"])
|
logger.info("Client Machine ID: %s" % infoDict["clientMachineId"])
|
||||||
logging.info("Application ID: %s" % infoDict["appId"])
|
logger.info("Application ID: %s" % infoDict["appId"])
|
||||||
logging.info("SKU ID: %s" % infoDict["skuId"])
|
logger.info("SKU ID: %s" % infoDict["skuId"])
|
||||||
logging.info("License Status: %s" % infoDict["licenseStatus"])
|
logger.info("License Status: %s" % infoDict["licenseStatus"])
|
||||||
logging.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)'))
|
logger.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)'))
|
||||||
|
|
||||||
if self.config['sqlite'] and self.config['dbSupport']:
|
if self.config['sqlite'] and self.config['dbSupport']:
|
||||||
con = None
|
con = None
|
||||||
@ -247,10 +249,10 @@ clientMachineId=:clientMachineId;", infoDict)
|
|||||||
clientMachineId=:clientMachineId;", infoDict)
|
clientMachineId=:clientMachineId;", infoDict)
|
||||||
|
|
||||||
except sqlite3.Error, e:
|
except sqlite3.Error, e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
|
|
||||||
except sqlite3.Error, e:
|
except sqlite3.Error, e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
finally:
|
finally:
|
||||||
if con:
|
if con:
|
||||||
@ -292,17 +294,17 @@ clientMachineId=:clientMachineId;", infoDict)
|
|||||||
(str(response["kmsEpid"].decode('utf-16le')), str(kmsRequest['clientMachineId'].get())))
|
(str(response["kmsEpid"].decode('utf-16le')), str(kmsRequest['clientMachineId'].get())))
|
||||||
|
|
||||||
except sqlite3.Error, e:
|
except sqlite3.Error, e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
|
|
||||||
except sqlite3.Error, e:
|
except sqlite3.Error, e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
finally:
|
finally:
|
||||||
if con:
|
if con:
|
||||||
con.commit()
|
con.commit()
|
||||||
con.close()
|
con.close()
|
||||||
|
|
||||||
logging.info("Server ePID: %s" % response["kmsEpid"].decode('utf-16le').encode('utf-8'))
|
logger.info("Server ePID: %s" % response["kmsEpid"].decode('utf-16le').encode('utf-8'))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -314,16 +316,16 @@ def generateKmsResponseData(data, config):
|
|||||||
currentDate = time.strftime("%a %b %d %H:%M:%S %Y")
|
currentDate = time.strftime("%a %b %d %H:%M:%S %Y")
|
||||||
|
|
||||||
if version == 4:
|
if version == 4:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV4.kmsRequestV4(data, config)
|
messagehandler = kmsRequestV4.kmsRequestV4(data, config)
|
||||||
elif version == 5:
|
elif version == 5:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV5.kmsRequestV5(data, config)
|
messagehandler = kmsRequestV5.kmsRequestV5(data, config)
|
||||||
elif version == 6:
|
elif version == 6:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV6.kmsRequestV6(data, config)
|
messagehandler = kmsRequestV6.kmsRequestV6(data, config)
|
||||||
else:
|
else:
|
||||||
logging.info("Unhandled KMS version V%d." % version)
|
logger.info("Unhandled KMS version V%d." % version)
|
||||||
messagehandler = kmsRequestUnknown.kmsRequestUnknown(data, config)
|
messagehandler = kmsRequestUnknown.kmsRequestUnknown(data, config)
|
||||||
|
|
||||||
return messagehandler.executeRequestLogic()
|
return messagehandler.executeRequestLogic()
|
||||||
|
@ -9,6 +9,8 @@ from structure import Structure
|
|||||||
from aes import AES
|
from aes import AES
|
||||||
from formatText import shell_message, justify
|
from formatText import shell_message, justify
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
# v4 AES Key
|
# v4 AES Key
|
||||||
key = bytearray([0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6])
|
key = bytearray([0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6])
|
||||||
|
|
||||||
@ -102,8 +104,8 @@ class kmsRequestV4(kmsBase):
|
|||||||
|
|
||||||
## Debug stuff.
|
## Debug stuff.
|
||||||
shell_message(nshell = 16)
|
shell_message(nshell = 16)
|
||||||
logging.debug("KMS V4 Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("KMS V4 Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("KMS V4 Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
logger.debug("KMS V4 Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
||||||
|
|
||||||
return str(response)
|
return str(response)
|
||||||
|
|
||||||
@ -120,7 +122,7 @@ class kmsRequestV4(kmsBase):
|
|||||||
|
|
||||||
## Debug stuff.
|
## Debug stuff.
|
||||||
shell_message(nshell = 10)
|
shell_message(nshell = 10)
|
||||||
logging.debug("Request V4 Data: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("Request V4 Data: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
logging.debug("Request V4: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
logger.debug("Request V4: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
@ -10,6 +10,8 @@ from kmsBase import kmsBase
|
|||||||
from structure import Structure
|
from structure import Structure
|
||||||
from formatText import justify, shell_message
|
from formatText import justify, shell_message
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class kmsRequestV5(kmsBase):
|
class kmsRequestV5(kmsBase):
|
||||||
class RequestV5(Structure):
|
class RequestV5(Structure):
|
||||||
class Message(Structure):
|
class Message(Structure):
|
||||||
@ -135,8 +137,8 @@ class kmsRequestV5(kmsBase):
|
|||||||
response['padding'] = bytearray(self.getPadding(bodyLength))
|
response['padding'] = bytearray(self.getPadding(bodyLength))
|
||||||
|
|
||||||
shell_message(nshell = 16)
|
shell_message(nshell = 16)
|
||||||
logging.info("KMS V%d Response: \n%s\n" % (self.ver, justify(response.dump(print_to_stdout = False))))
|
logger.info("KMS V%d Response: \n%s\n" % (self.ver, justify(response.dump(print_to_stdout = False))))
|
||||||
logging.info("KMS V%d Structure Bytes: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(response)))))
|
logger.info("KMS V%d Structure Bytes: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(response)))))
|
||||||
|
|
||||||
return str(response)
|
return str(response)
|
||||||
|
|
||||||
@ -166,7 +168,7 @@ class kmsRequestV5(kmsBase):
|
|||||||
request['message'] = message
|
request['message'] = message
|
||||||
|
|
||||||
shell_message(nshell = 10)
|
shell_message(nshell = 10)
|
||||||
logging.info("Request V%d Data: \n%s\n" % (self.ver, justify(request.dump(print_to_stdout = False))))
|
logger.info("Request V%d Data: \n%s\n" % (self.ver, justify(request.dump(print_to_stdout = False))))
|
||||||
logging.info("Request V%d: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(request)))))
|
logger.info("Request V%d: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(request)))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
@ -9,6 +9,8 @@ from dcerpc import MSRPCHeader, MSRPCBindAck
|
|||||||
from structure import Structure
|
from structure import Structure
|
||||||
from formatText import shell_message, justify
|
from formatText import shell_message, justify
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
uuidNDR32 = uuid.UUID('8a885d04-1ceb-11c9-9fe8-08002b104860')
|
uuidNDR32 = uuid.UUID('8a885d04-1ceb-11c9-9fe8-08002b104860')
|
||||||
uuidNDR64 = uuid.UUID('71710533-beba-4937-8319-b5dbef9ccc36')
|
uuidNDR64 = uuid.UUID('71710533-beba-4937-8319-b5dbef9ccc36')
|
||||||
uuidTime = uuid.UUID('6cb71c2c-9812-4540-0300-000000000000')
|
uuidTime = uuid.UUID('6cb71c2c-9812-4540-0300-000000000000')
|
||||||
@ -74,8 +76,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
def parseRequest(self):
|
def parseRequest(self):
|
||||||
request = MSRPCHeader(self.data)
|
request = MSRPCHeader(self.data)
|
||||||
shell_message(nshell = 3)
|
shell_message(nshell = 3)
|
||||||
logging.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data)))
|
logger.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data)))
|
||||||
logging.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
logger.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
||||||
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
@ -117,8 +119,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
response['ctx_items'] += str(resp)
|
response['ctx_items'] += str(resp)
|
||||||
|
|
||||||
shell_message(nshell = 4)
|
shell_message(nshell = 4)
|
||||||
logging.debug("RPC Bind Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("RPC Bind Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Bind Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
logger.debug("RPC Bind Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -157,9 +159,9 @@ class handler(rpcBase.rpcBase):
|
|||||||
request['pduData'] = str(bind)
|
request['pduData'] = str(bind)
|
||||||
|
|
||||||
shell_message(nshell = 0)
|
shell_message(nshell = 0)
|
||||||
logging.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
logger.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
||||||
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
||||||
logging.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
logger.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
|
@ -8,12 +8,14 @@ import kmsBase
|
|||||||
import rpcBase
|
import rpcBase
|
||||||
from formatText import justify, shell_message
|
from formatText import justify, shell_message
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class handler(rpcBase.rpcBase):
|
class handler(rpcBase.rpcBase):
|
||||||
def parseRequest(self):
|
def parseRequest(self):
|
||||||
request = MSRPCRequestHeader(self.data)
|
request = MSRPCRequestHeader(self.data)
|
||||||
shell_message(nshell = 14)
|
shell_message(nshell = 14)
|
||||||
logging.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data)))
|
logger.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data)))
|
||||||
logging.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
@ -36,8 +38,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
response['pduData'] = responseData
|
response['pduData'] = responseData
|
||||||
|
|
||||||
shell_message(nshell = 17)
|
shell_message(nshell = 17)
|
||||||
logging.debug("RPC Message Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Message Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
logger.debug("RPC Message Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response))))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -54,8 +56,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
request['pduData'] = str(self.data)
|
request['pduData'] = str(self.data)
|
||||||
|
|
||||||
shell_message(nshell = 11)
|
shell_message(nshell = 11)
|
||||||
logging.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
logger.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
|
@ -15,9 +15,12 @@ import rpcBind, rpcRequest
|
|||||||
from dcerpc import MSRPCHeader
|
from dcerpc import MSRPCHeader
|
||||||
from rpcBase import rpcBase
|
from rpcBase import rpcBase
|
||||||
from formatText import shell_message
|
from formatText import shell_message
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
|
||||||
config = {}
|
config = {}
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
# Valid language identifiers to be used in the EPID (see "kms.c" in vlmcsd)
|
# Valid language identifiers to be used in the EPID (see "kms.c" in vlmcsd)
|
||||||
ValidLcid = [1025, 1026, 1027, 1028, 1029,
|
ValidLcid = [1025, 1026, 1027, 1028, 1029,
|
||||||
1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
|
1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
|
||||||
@ -39,6 +42,15 @@ ValidLcid = [1025, 1026, 1027, 1028, 1029,
|
|||||||
10241, 10249, 10250, 11265, 11273, 11274, 12289, 12297, 12298,
|
10241, 10249, 10250, 11265, 11273, 11274, 12289, 12297, 12298,
|
||||||
13313, 13321, 13322, 14337, 14346, 15361, 15370, 16385, 16394, 17418, 18442, 19466, 20490]
|
13313, 13321, 13322, 14337, 14346, 15361, 15370, 16385, 16394, 17418, 18442, 19466, 20490]
|
||||||
|
|
||||||
|
def createLogger(config):
|
||||||
|
logger.setLevel(config['loglevel'])
|
||||||
|
|
||||||
|
log_formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s', '%a, %d %b %Y %H:%M:%S')
|
||||||
|
log_handler = RotatingFileHandler(filename=config['logfile'], mode='a', maxBytes=int(config['logsize']*1024*512), backupCount=1, encoding=None, delay=0)
|
||||||
|
print int(config['logsize']*1024*512)
|
||||||
|
log_handler.setFormatter(log_formatter)
|
||||||
|
|
||||||
|
logger.addHandler(log_handler)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='py2-kms: KMS Server Emulator written in Python2', epilog="version: py2-kms_2018-11-15")
|
parser = argparse.ArgumentParser(description='py2-kms: KMS Server Emulator written in Python2', epilog="version: py2-kms_2018-11-15")
|
||||||
@ -66,12 +78,13 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
help='Use this flag to set a Loglevel. The default is \"ERROR\".', type=str)
|
help='Use this flag to set a Loglevel. The default is \"ERROR\".', type=str)
|
||||||
parser.add_argument("-f", "--logfile", dest="logfile", action="store", default=os.path.dirname(os.path.abspath( __file__ )) + "/py2kms_server.log",
|
parser.add_argument("-f", "--logfile", dest="logfile", action="store", default=os.path.dirname(os.path.abspath( __file__ )) + "/py2kms_server.log",
|
||||||
help='Use this flag to set an output Logfile. The default is \"pykms_server.log\".', type=str)
|
help='Use this flag to set an output Logfile. The default is \"pykms_server.log\".', type=str)
|
||||||
|
parser.add_argument("-S", "--logsize", dest="logsize", action="store", default=0,
|
||||||
|
help='Use this flag to set a maximum size (in MB) to the output Logfile. Desactivated by default.', type=float)
|
||||||
|
|
||||||
config.update(vars(parser.parse_args()))
|
config.update(vars(parser.parse_args()))
|
||||||
|
|
||||||
logging.basicConfig(level=config['loglevel'], format='%(asctime)s %(levelname)-8s %(message)s',
|
createLogger(config)
|
||||||
datefmt='%a, %d %b %Y %H:%M:%S', filename=config['logfile'], filemode='w')
|
|
||||||
|
|
||||||
# Random HWID.
|
# Random HWID.
|
||||||
if config['hwid'] == "random":
|
if config['hwid'] == "random":
|
||||||
randomhwid = uuid.uuid4().hex
|
randomhwid = uuid.uuid4().hex
|
||||||
@ -81,13 +94,13 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
try:
|
try:
|
||||||
config['hwid'] = binascii.a2b_hex(re.sub(r'[^0-9a-fA-F]', '', config['hwid'].strip('0x')))
|
config['hwid'] = binascii.a2b_hex(re.sub(r'[^0-9a-fA-F]', '', config['hwid'].strip('0x')))
|
||||||
if len(binascii.b2a_hex(config['hwid'])) < 16:
|
if len(binascii.b2a_hex(config['hwid'])) < 16:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Hex string is too short." % binascii.b2a_hex(config['hwid']).upper())
|
logger.error("Error: HWID \"%s\" is invalid. Hex string is too short." % binascii.b2a_hex(config['hwid']).upper())
|
||||||
return
|
return
|
||||||
elif len(binascii.b2a_hex(config['hwid'])) > 16:
|
elif len(binascii.b2a_hex(config['hwid'])) > 16:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Hex string is too long." % binascii.b2a_hex(config['hwid']).upper())
|
logger.error("Error: HWID \"%s\" is invalid. Hex string is too long." % binascii.b2a_hex(config['hwid']).upper())
|
||||||
return
|
return
|
||||||
except TypeError:
|
except TypeError:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Odd-length hex string." % binascii.b2a_hex(config['hwid']).upper())
|
logger.error("Error: HWID \"%s\" is invalid. Odd-length hex string." % binascii.b2a_hex(config['hwid']).upper())
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check LCID.
|
# Check LCID.
|
||||||
@ -110,21 +123,21 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
try:
|
try:
|
||||||
import sqlite3
|
import sqlite3
|
||||||
except:
|
except:
|
||||||
logging.warning("Module \"sqlite3\" is not installed, database support disabled.")
|
logger.warning("Module \"sqlite3\" is not installed, database support disabled.")
|
||||||
config['dbSupport'] = False
|
config['dbSupport'] = False
|
||||||
else:
|
else:
|
||||||
config['dbSupport'] = True
|
config['dbSupport'] = True
|
||||||
|
|
||||||
server = SocketServer.TCPServer((config['ip'], config['port']), kmsServer)
|
server = SocketServer.TCPServer((config['ip'], config['port']), kmsServer)
|
||||||
server.timeout = 5
|
server.timeout = 5
|
||||||
logging.info("TCP server listening at %s on port %d." % (config['ip'], config['port']))
|
logger.info("TCP server listening at %s on port %d." % (config['ip'], config['port']))
|
||||||
logging.info("HWID: %s" % binascii.b2a_hex(config['hwid']).upper())
|
logger.info("HWID: %s" % binascii.b2a_hex(config['hwid']).upper())
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
|
|
||||||
class kmsServer(SocketServer.BaseRequestHandler):
|
class kmsServer(SocketServer.BaseRequestHandler):
|
||||||
def setup(self):
|
def setup(self):
|
||||||
logging.info("Connection accepted: %s:%d" % (self.client_address[0], self.client_address[1]))
|
logger.info("Connection accepted: %s:%d" % (self.client_address[0], self.client_address[1]))
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
while True:
|
while True:
|
||||||
@ -133,42 +146,42 @@ class kmsServer(SocketServer.BaseRequestHandler):
|
|||||||
data = self.request.recv(1024)
|
data = self.request.recv(1024)
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e.errno == errno.ECONNRESET:
|
if e.errno == errno.ECONNRESET:
|
||||||
logging.error("Connection reset by peer.")
|
logger.error("Connection reset by peer.")
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
if not data:
|
if not data:
|
||||||
logging.warning("No data received !")
|
logger.warning("No data received !")
|
||||||
break
|
break
|
||||||
# data = bytearray(self.data.strip())
|
# data = bytearray(self.data.strip())
|
||||||
# logging.debug(binascii.b2a_hex(str(data)))
|
# logger.debug(binascii.b2a_hex(str(data)))
|
||||||
packetType = MSRPCHeader(data)['type']
|
packetType = MSRPCHeader(data)['type']
|
||||||
if packetType == rpcBase.packetType['bindReq']:
|
if packetType == rpcBase.packetType['bindReq']:
|
||||||
logging.info("RPC bind request received.")
|
logger.info("RPC bind request received.")
|
||||||
shell_message(nshell = [-2, 2])
|
shell_message(nshell = [-2, 2])
|
||||||
handler = rpcBind.handler(data, config)
|
handler = rpcBind.handler(data, config)
|
||||||
elif packetType == rpcBase.packetType['request']:
|
elif packetType == rpcBase.packetType['request']:
|
||||||
logging.info("Received activation request.")
|
logger.info("Received activation request.")
|
||||||
shell_message(nshell = [-2, 13])
|
shell_message(nshell = [-2, 13])
|
||||||
handler = rpcRequest.handler(data, config)
|
handler = rpcRequest.handler(data, config)
|
||||||
else:
|
else:
|
||||||
logging.error("Error: Invalid RPC request type ", packetType)
|
logger.error("Error: Invalid RPC request type ", packetType)
|
||||||
break
|
break
|
||||||
|
|
||||||
res = str(handler.populate())
|
res = str(handler.populate())
|
||||||
self.request.send(res)
|
self.request.send(res)
|
||||||
|
|
||||||
if packetType == rpcBase.packetType['bindReq']:
|
if packetType == rpcBase.packetType['bindReq']:
|
||||||
logging.info("RPC bind acknowledged.")
|
logger.info("RPC bind acknowledged.")
|
||||||
shell_message(nshell = [-3, 5, 6])
|
shell_message(nshell = [-3, 5, 6])
|
||||||
elif packetType == rpcBase.packetType['request']:
|
elif packetType == rpcBase.packetType['request']:
|
||||||
logging.info("Responded to activation request.")
|
logger.info("Responded to activation request.")
|
||||||
shell_message(nshell = [-3, 18, 19])
|
shell_message(nshell = [-3, 18, 19])
|
||||||
break
|
break
|
||||||
|
|
||||||
def finish(self):
|
def finish(self):
|
||||||
self.request.close()
|
self.request.close()
|
||||||
logging.info("Connection closed: %s:%d" % (self.client_address[0], self.client_address[1]))
|
logger.info("Connection closed: %s:%d" % (self.client_address[0], self.client_address[1]))
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
@ -19,6 +19,8 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class UUID(Structure):
|
class UUID(Structure):
|
||||||
commonHdr = ()
|
commonHdr = ()
|
||||||
structure = (
|
structure = (
|
||||||
@ -130,7 +132,7 @@ class kmsBase:
|
|||||||
skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)")
|
skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)")
|
||||||
|
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -140,8 +142,8 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
|
|
||||||
shell_message(nshell = 15)
|
shell_message(nshell = 15)
|
||||||
kmsRequest = byterize(kmsRequest)
|
kmsRequest = byterize(kmsRequest)
|
||||||
logging.debug("KMS Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(kmsRequest).encode('latin-1')).decode('utf-8')))
|
logger.debug("KMS Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(kmsRequest).encode('latin-1')).decode('utf-8')))
|
||||||
logging.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout = False)))
|
logger.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout = False)))
|
||||||
|
|
||||||
clientMachineId = kmsRequest['clientMachineId'].get()
|
clientMachineId = kmsRequest['clientMachineId'].get()
|
||||||
applicationId = kmsRequest['applicationId'].get()
|
applicationId = kmsRequest['applicationId'].get()
|
||||||
@ -156,10 +158,10 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
tz = get_localzone()
|
tz = get_localzone()
|
||||||
local_dt = tz.localize(requestDatetime)
|
local_dt = tz.localize(requestDatetime)
|
||||||
except UnknownTimeZoneError:
|
except UnknownTimeZoneError:
|
||||||
logging.warning('Unknown time zone ! Request time not localized.')
|
logger.warning('Unknown time zone ! Request time not localized.')
|
||||||
local_dt = requestDatetime
|
local_dt = requestDatetime
|
||||||
except ImportError:
|
except ImportError:
|
||||||
logging.warning('Module "tzlocal" not available ! Request time not localized.')
|
logger.warning('Module "tzlocal" not available ! Request time not localized.')
|
||||||
local_dt = requestDatetime
|
local_dt = requestDatetime
|
||||||
|
|
||||||
# Get SkuId, AppId and client threshold.
|
# Get SkuId, AppId and client threshold.
|
||||||
@ -205,12 +207,12 @@ skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
#print infoDict
|
#print infoDict
|
||||||
logging.info("Machine Name: %s" % infoDict["machineName"])
|
logger.info("Machine Name: %s" % infoDict["machineName"])
|
||||||
logging.info("Client Machine ID: %s" % infoDict["clientMachineId"])
|
logger.info("Client Machine ID: %s" % infoDict["clientMachineId"])
|
||||||
logging.info("Application ID: %s" % infoDict["appId"])
|
logger.info("Application ID: %s" % infoDict["appId"])
|
||||||
logging.info("SKU ID: %s" % infoDict["skuId"])
|
logger.info("SKU ID: %s" % infoDict["skuId"])
|
||||||
logging.info("License Status: %s" % infoDict["licenseStatus"])
|
logger.info("License Status: %s" % infoDict["licenseStatus"])
|
||||||
logging.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)'))
|
logger.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)'))
|
||||||
|
|
||||||
if self.config['sqlite'] and self.config['dbSupport']:
|
if self.config['sqlite'] and self.config['dbSupport']:
|
||||||
con = None
|
con = None
|
||||||
@ -246,10 +248,10 @@ clientMachineId=:clientMachineId;", infoDict)
|
|||||||
clientMachineId=:clientMachineId;", infoDict)
|
clientMachineId=:clientMachineId;", infoDict)
|
||||||
|
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
|
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
finally:
|
finally:
|
||||||
if con:
|
if con:
|
||||||
@ -290,17 +292,17 @@ clientMachineId=:clientMachineId;", infoDict)
|
|||||||
(str(response["kmsEpid"].decode('utf-16le')), str(kmsRequest['clientMachineId'].get())))
|
(str(response["kmsEpid"].decode('utf-16le')), str(kmsRequest['clientMachineId'].get())))
|
||||||
|
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
|
|
||||||
except sqlite3.Error as e:
|
except sqlite3.Error as e:
|
||||||
logging.error("Error %s:" % e.args[0])
|
logger.error("Error %s:" % e.args[0])
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
finally:
|
finally:
|
||||||
if con:
|
if con:
|
||||||
con.commit()
|
con.commit()
|
||||||
con.close()
|
con.close()
|
||||||
|
|
||||||
logging.info("Server ePID: %s" % response["kmsEpid"].decode('utf-16le'))
|
logger.info("Server ePID: %s" % response["kmsEpid"].decode('utf-16le'))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -312,16 +314,16 @@ def generateKmsResponseData(data, config):
|
|||||||
currentDate = time.strftime("%a %b %d %H:%M:%S %Y")
|
currentDate = time.strftime("%a %b %d %H:%M:%S %Y")
|
||||||
|
|
||||||
if version == 4:
|
if version == 4:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV4.kmsRequestV4(data, config)
|
messagehandler = kmsRequestV4.kmsRequestV4(data, config)
|
||||||
elif version == 5:
|
elif version == 5:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV5.kmsRequestV5(data, config)
|
messagehandler = kmsRequestV5.kmsRequestV5(data, config)
|
||||||
elif version == 6:
|
elif version == 6:
|
||||||
logging.info("Received V%d request on %s." % (version, currentDate))
|
logger.info("Received V%d request on %s." % (version, currentDate))
|
||||||
messagehandler = kmsRequestV6.kmsRequestV6(data, config)
|
messagehandler = kmsRequestV6.kmsRequestV6(data, config)
|
||||||
else:
|
else:
|
||||||
logging.info("Unhandled KMS version V%d." % version)
|
logger.info("Unhandled KMS version V%d." % version)
|
||||||
messagehandler = kmsRequestUnknown.kmsRequestUnknown(data, config)
|
messagehandler = kmsRequestUnknown.kmsRequestUnknown(data, config)
|
||||||
|
|
||||||
return messagehandler.executeRequestLogic()
|
return messagehandler.executeRequestLogic()
|
||||||
|
@ -9,6 +9,8 @@ from structure import Structure
|
|||||||
from aes import AES
|
from aes import AES
|
||||||
from formatText import shell_message, justify, byterize
|
from formatText import shell_message, justify, byterize
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
# v4 AES Key
|
# v4 AES Key
|
||||||
key = bytearray([0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6])
|
key = bytearray([0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, 0xE4, 0xEF, 0xD2, 0xD6])
|
||||||
|
|
||||||
@ -103,8 +105,8 @@ class kmsRequestV4(kmsBase):
|
|||||||
## Debug stuff.
|
## Debug stuff.
|
||||||
shell_message(nshell = 16)
|
shell_message(nshell = 16)
|
||||||
response = byterize(response)
|
response = byterize(response)
|
||||||
logging.debug("KMS V4 Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("KMS V4 Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("KMS V4 Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
logger.debug("KMS V4 Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return str(response)
|
return str(response)
|
||||||
|
|
||||||
@ -122,7 +124,7 @@ class kmsRequestV4(kmsBase):
|
|||||||
## Debug stuff.
|
## Debug stuff.
|
||||||
shell_message(nshell = 10)
|
shell_message(nshell = 10)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.debug("Request V4 Data: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("Request V4 Data: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
logging.debug("Request V4: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
logger.debug("Request V4: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
@ -10,6 +10,8 @@ from kmsBase import kmsBase
|
|||||||
from structure import Structure
|
from structure import Structure
|
||||||
from formatText import justify, shell_message, byterize
|
from formatText import justify, shell_message, byterize
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class kmsRequestV5(kmsBase):
|
class kmsRequestV5(kmsBase):
|
||||||
class RequestV5(Structure):
|
class RequestV5(Structure):
|
||||||
class Message(Structure):
|
class Message(Structure):
|
||||||
@ -138,8 +140,8 @@ class kmsRequestV5(kmsBase):
|
|||||||
|
|
||||||
shell_message(nshell = 16)
|
shell_message(nshell = 16)
|
||||||
response = byterize(response)
|
response = byterize(response)
|
||||||
logging.info("KMS V%d Response: \n%s\n" % (self.ver, justify(response.dump(print_to_stdout = False))))
|
logger.info("KMS V%d Response: \n%s\n" % (self.ver, justify(response.dump(print_to_stdout = False))))
|
||||||
logging.info("KMS V%d Structure Bytes: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8'))))
|
logger.info("KMS V%d Structure Bytes: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8'))))
|
||||||
|
|
||||||
return str(response)
|
return str(response)
|
||||||
|
|
||||||
@ -170,7 +172,7 @@ class kmsRequestV5(kmsBase):
|
|||||||
|
|
||||||
shell_message(nshell = 10)
|
shell_message(nshell = 10)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.info("Request V%d Data: \n%s\n" % (self.ver, justify(request.dump(print_to_stdout = False))))
|
logger.info("Request V%d Data: \n%s\n" % (self.ver, justify(request.dump(print_to_stdout = False))))
|
||||||
logging.info("Request V%d: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8'))))
|
logger.info("Request V%d: \n%s\n" % (self.ver, justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8'))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
@ -9,6 +9,8 @@ from dcerpc import MSRPCHeader, MSRPCBindAck
|
|||||||
from structure import Structure
|
from structure import Structure
|
||||||
from formatText import shell_message, justify, byterize
|
from formatText import shell_message, justify, byterize
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
uuidNDR32 = uuid.UUID('8a885d04-1ceb-11c9-9fe8-08002b104860')
|
uuidNDR32 = uuid.UUID('8a885d04-1ceb-11c9-9fe8-08002b104860')
|
||||||
uuidNDR64 = uuid.UUID('71710533-beba-4937-8319-b5dbef9ccc36')
|
uuidNDR64 = uuid.UUID('71710533-beba-4937-8319-b5dbef9ccc36')
|
||||||
uuidTime = uuid.UUID('6cb71c2c-9812-4540-0300-000000000000')
|
uuidTime = uuid.UUID('6cb71c2c-9812-4540-0300-000000000000')
|
||||||
@ -75,8 +77,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
request = MSRPCHeader(self.data)
|
request = MSRPCHeader(self.data)
|
||||||
shell_message(nshell = 3)
|
shell_message(nshell = 3)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data).decode('utf-8')))
|
logger.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data).decode('utf-8')))
|
||||||
logging.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
logger.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
||||||
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
@ -119,8 +121,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
|
|
||||||
shell_message(nshell = 4)
|
shell_message(nshell = 4)
|
||||||
response = byterize(response)
|
response = byterize(response)
|
||||||
logging.debug("RPC Bind Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("RPC Bind Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Bind Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
logger.debug("RPC Bind Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -161,9 +163,9 @@ class handler(rpcBase.rpcBase):
|
|||||||
shell_message(nshell = 0)
|
shell_message(nshell = 0)
|
||||||
bind = byterize(bind)
|
bind = byterize(bind)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
logger.debug("RPC Bind Request: \n%s\n%s\n" % (justify(request.dump(print_to_stdout = False)),
|
||||||
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
justify(MSRPCBind(request['pduData']).dump(print_to_stdout = False))))
|
||||||
logging.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
logger.debug("RPC Bind Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
|
@ -8,13 +8,15 @@ import kmsBase
|
|||||||
import rpcBase
|
import rpcBase
|
||||||
from formatText import justify, shell_message, byterize
|
from formatText import justify, shell_message, byterize
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
class handler(rpcBase.rpcBase):
|
class handler(rpcBase.rpcBase):
|
||||||
def parseRequest(self):
|
def parseRequest(self):
|
||||||
request = MSRPCRequestHeader(self.data)
|
request = MSRPCRequestHeader(self.data)
|
||||||
shell_message(nshell = 14)
|
shell_message(nshell = 14)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data).decode('utf-8')))
|
logger.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(self.data).decode('utf-8')))
|
||||||
logging.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
@ -38,8 +40,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
|
|
||||||
shell_message(nshell = 17)
|
shell_message(nshell = 17)
|
||||||
response = byterize(response)
|
response = byterize(response)
|
||||||
logging.debug("RPC Message Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Response: \n%s\n" % justify(response.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Message Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
logger.debug("RPC Message Response Bytes: \n%s\n" % justify(binascii.b2a_hex(str(response).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
@ -57,8 +59,8 @@ class handler(rpcBase.rpcBase):
|
|||||||
|
|
||||||
shell_message(nshell = 11)
|
shell_message(nshell = 11)
|
||||||
request = byterize(request)
|
request = byterize(request)
|
||||||
logging.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
logger.debug("RPC Message Request: \n%s\n" % justify(request.dump(print_to_stdout = False)))
|
||||||
logging.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
logger.debug("RPC Message Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(request).encode('latin-1')).decode('utf-8')))
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
|
@ -15,6 +15,9 @@ import rpcBind, rpcRequest
|
|||||||
from dcerpc import MSRPCHeader
|
from dcerpc import MSRPCHeader
|
||||||
from rpcBase import rpcBase
|
from rpcBase import rpcBase
|
||||||
from formatText import shell_message
|
from formatText import shell_message
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
|
||||||
|
logger = logging.getLogger('root')
|
||||||
|
|
||||||
config = {}
|
config = {}
|
||||||
|
|
||||||
@ -39,6 +42,14 @@ ValidLcid = [1025, 1026, 1027, 1028, 1029,
|
|||||||
10241, 10249, 10250, 11265, 11273, 11274, 12289, 12297, 12298,
|
10241, 10249, 10250, 11265, 11273, 11274, 12289, 12297, 12298,
|
||||||
13313, 13321, 13322, 14337, 14346, 15361, 15370, 16385, 16394, 17418, 18442, 19466, 20490]
|
13313, 13321, 13322, 14337, 14346, 15361, 15370, 16385, 16394, 17418, 18442, 19466, 20490]
|
||||||
|
|
||||||
|
def createLogger(config):
|
||||||
|
logger.setLevel(config['loglevel'])
|
||||||
|
|
||||||
|
log_formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s', '%a, %d %b %Y %H:%M:%S')
|
||||||
|
log_handler = RotatingFileHandler(filename=config['logfile'], mode='a', maxBytes=int(config['logsize']*1024*512), backupCount=1, encoding=None, delay=0)
|
||||||
|
log_handler.setFormatter(log_formatter)
|
||||||
|
|
||||||
|
logger.addHandler(log_handler)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='py3-kms: KMS Server Emulator written in Python3', epilog="version: py3-kms_2018-11-15")
|
parser = argparse.ArgumentParser(description='py3-kms: KMS Server Emulator written in Python3', epilog="version: py3-kms_2018-11-15")
|
||||||
@ -66,11 +77,13 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
help='Use this flag to set a Loglevel. The default is \"ERROR\".', type=str)
|
help='Use this flag to set a Loglevel. The default is \"ERROR\".', type=str)
|
||||||
parser.add_argument("-f", "--logfile", dest="logfile", action="store", default=os.path.dirname(os.path.abspath( __file__ )) + "/py3kms_server.log",
|
parser.add_argument("-f", "--logfile", dest="logfile", action="store", default=os.path.dirname(os.path.abspath( __file__ )) + "/py3kms_server.log",
|
||||||
help='Use this flag to set an output Logfile. The default is \"pykms_server.log\".', type=str)
|
help='Use this flag to set an output Logfile. The default is \"pykms_server.log\".', type=str)
|
||||||
|
parser.add_argument("-S", "--logsize", dest="logsize", action="store", default=0,
|
||||||
config.update(vars(parser.parse_args()))
|
help='Use this flag to set a maximum size (in MB) to the output Logfile. Desactivated by default.', type=float)
|
||||||
|
|
||||||
|
config.update(vars(parser.parse_args()))
|
||||||
|
|
||||||
|
createLogger(config)
|
||||||
|
|
||||||
logging.basicConfig(level=config['loglevel'], format='%(asctime)s %(levelname)-8s %(message)s',
|
|
||||||
datefmt='%a, %d %b %Y %H:%M:%S', filename=config['logfile'], filemode='w')
|
|
||||||
# Random HWID.
|
# Random HWID.
|
||||||
if config['hwid'] == "random":
|
if config['hwid'] == "random":
|
||||||
randomhwid = uuid.uuid4().hex
|
randomhwid = uuid.uuid4().hex
|
||||||
@ -80,13 +93,13 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
try:
|
try:
|
||||||
config['hwid'] = binascii.a2b_hex(re.sub(r'[^0-9a-fA-F]', '', config['hwid'].strip('0x')))
|
config['hwid'] = binascii.a2b_hex(re.sub(r'[^0-9a-fA-F]', '', config['hwid'].strip('0x')))
|
||||||
if len(binascii.b2a_hex(config['hwid'])) < 16:
|
if len(binascii.b2a_hex(config['hwid'])) < 16:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Hex string is too short." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
logger.error("Error: HWID \"%s\" is invalid. Hex string is too short." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
||||||
return
|
return
|
||||||
elif len(binascii.b2a_hex(config['hwid'])) > 16:
|
elif len(binascii.b2a_hex(config['hwid'])) > 16:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Hex string is too long." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
logger.error("Error: HWID \"%s\" is invalid. Hex string is too long." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
||||||
return
|
return
|
||||||
except TypeError:
|
except TypeError:
|
||||||
logging.error("Error: HWID \"%s\" is invalid. Odd-length hex string." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
logger.error("Error: HWID \"%s\" is invalid. Odd-length hex string." % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check LCID.
|
# Check LCID.
|
||||||
@ -109,21 +122,21 @@ The default is \"364F463A8863D35F\" or type \"random\" to auto generate the HWID
|
|||||||
try:
|
try:
|
||||||
import sqlite3
|
import sqlite3
|
||||||
except:
|
except:
|
||||||
logging.warning("Module \"sqlite3\" is not installed, database support disabled.")
|
logger.warning("Module \"sqlite3\" is not installed, database support disabled.")
|
||||||
config['dbSupport'] = False
|
config['dbSupport'] = False
|
||||||
else:
|
else:
|
||||||
config['dbSupport'] = True
|
config['dbSupport'] = True
|
||||||
|
|
||||||
server = socketserver.TCPServer((config['ip'], config['port']), kmsServer)
|
server = socketserver.TCPServer((config['ip'], config['port']), kmsServer)
|
||||||
server.timeout = 5
|
server.timeout = 5
|
||||||
logging.info("TCP server listening at %s on port %d." % (config['ip'], config['port']))
|
logger.info("TCP server listening at %s on port %d." % (config['ip'], config['port']))
|
||||||
logging.info("HWID: %s" % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
logger.info("HWID: %s" % binascii.b2a_hex(config['hwid']).decode('utf-8').upper())
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
|
|
||||||
class kmsServer(socketserver.BaseRequestHandler):
|
class kmsServer(socketserver.BaseRequestHandler):
|
||||||
def setup(self):
|
def setup(self):
|
||||||
logging.info("Connection accepted: %s:%d" % (self.client_address[0], self.client_address[1]))
|
logger.info("Connection accepted: %s:%d" % (self.client_address[0], self.client_address[1]))
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
while True:
|
while True:
|
||||||
@ -132,42 +145,42 @@ class kmsServer(socketserver.BaseRequestHandler):
|
|||||||
self.data = self.request.recv(1024)
|
self.data = self.request.recv(1024)
|
||||||
except socket.error as e:
|
except socket.error as e:
|
||||||
if e.errno == errno.ECONNRESET:
|
if e.errno == errno.ECONNRESET:
|
||||||
logging.error("Connection reset by peer.")
|
logger.error("Connection reset by peer.")
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
if self.data == '' or not self.data:
|
if self.data == '' or not self.data:
|
||||||
logging.warning("No data received !")
|
logger.warning("No data received !")
|
||||||
break
|
break
|
||||||
# data = bytearray(self.data.strip())
|
# data = bytearray(self.data.strip())
|
||||||
# logging.debug(binascii.b2a_hex(str(data)))
|
# logger.debug(binascii.b2a_hex(str(data)))
|
||||||
packetType = MSRPCHeader(self.data)['type']
|
packetType = MSRPCHeader(self.data)['type']
|
||||||
if packetType == rpcBase.packetType['bindReq']:
|
if packetType == rpcBase.packetType['bindReq']:
|
||||||
logging.info("RPC bind request received.")
|
logger.info("RPC bind request received.")
|
||||||
shell_message(nshell = [-2, 2])
|
shell_message(nshell = [-2, 2])
|
||||||
handler = rpcBind.handler(self.data, config)
|
handler = rpcBind.handler(self.data, config)
|
||||||
elif packetType == rpcBase.packetType['request']:
|
elif packetType == rpcBase.packetType['request']:
|
||||||
logging.info("Received activation request.")
|
logger.info("Received activation request.")
|
||||||
shell_message(nshell = [-2, 13])
|
shell_message(nshell = [-2, 13])
|
||||||
handler = rpcRequest.handler(self.data, config)
|
handler = rpcRequest.handler(self.data, config)
|
||||||
else:
|
else:
|
||||||
logging.error("Error: Invalid RPC request type ", packetType)
|
logger.error("Error: Invalid RPC request type ", packetType)
|
||||||
break
|
break
|
||||||
|
|
||||||
res = str(handler.populate()).encode('latin-1')
|
res = str(handler.populate()).encode('latin-1')
|
||||||
self.request.send(res)
|
self.request.send(res)
|
||||||
|
|
||||||
if packetType == rpcBase.packetType['bindReq']:
|
if packetType == rpcBase.packetType['bindReq']:
|
||||||
logging.info("RPC bind acknowledged.")
|
logger.info("RPC bind acknowledged.")
|
||||||
shell_message(nshell = [-3, 5, 6])
|
shell_message(nshell = [-3, 5, 6])
|
||||||
elif packetType == rpcBase.packetType['request']:
|
elif packetType == rpcBase.packetType['request']:
|
||||||
logging.info("Responded to activation request.")
|
logger.info("Responded to activation request.")
|
||||||
shell_message(nshell = [-3, 18, 19])
|
shell_message(nshell = [-3, 18, 19])
|
||||||
break
|
break
|
||||||
|
|
||||||
def finish(self):
|
def finish(self):
|
||||||
self.request.close()
|
self.request.close()
|
||||||
logging.info("Connection closed: %s:%d" % (self.client_address[0], self.client_address[1]))
|
logger.info("Connection closed: %s:%d" % (self.client_address[0], self.client_address[1]))
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user