Improve ApiSetMap resolve to match ntdll behavior + add sizekey option to encryption_demo genkey option

This commit is contained in:
hakril
2017-12-06 10:21:40 +01:00
parent 23837a0713
commit 32de3cb824
7 changed files with 231 additions and 8 deletions
@@ -893,6 +893,45 @@ typedef enum tag_WBEMSTATUS {
WBEMMOF_E_INVALID_DELETECLASS_SYNTAX = 0x80044031
} WBEMSTATUS;
typedef enum tag_WBEM_CHANGE_FLAG_TYPE {
WBEM_FLAG_CREATE_OR_UPDATE = 0,
WBEM_FLAG_UPDATE_ONLY = 0x1,
WBEM_FLAG_CREATE_ONLY = 0x2,
WBEM_FLAG_UPDATE_COMPATIBLE = 0,
WBEM_FLAG_UPDATE_SAFE_MODE = 0x20,
WBEM_FLAG_UPDATE_FORCE_MODE = 0x40,
WBEM_MASK_UPDATE_MODE = 0x60,
WBEM_FLAG_ADVISORY = 0x10000
} WBEM_CHANGE_FLAG_TYPE;
typedef enum tag_WBEM_TIMEOUT_TYPE
{
WBEM_NO_WAIT = 0,
WBEM_INFINITE = 0xffffffff
} WBEM_TIMEOUT_TYPE;
typedef enum tag_WBEM_GENERIC_FLAG_TYPE {
WBEM_FLAG_RETURN_IMMEDIATELY = 0x10,
WBEM_FLAG_RETURN_WBEM_COMPLETE = 0,
WBEM_FLAG_BIDIRECTIONAL = 0,
WBEM_FLAG_FORWARD_ONLY = 0x20,
WBEM_FLAG_NO_ERROR_OBJECT = 0x40,
WBEM_FLAG_RETURN_ERROR_OBJECT = 0,
WBEM_FLAG_SEND_STATUS = 0x80,
WBEM_FLAG_DONT_SEND_STATUS = 0,
WBEM_FLAG_ENSURE_LOCATABLE = 0x100,
WBEM_FLAG_DIRECT_READ = 0x200,
WBEM_FLAG_SEND_ONLY_SELECTED = 0,
WBEM_RETURN_WHEN_COMPLETE = 0,
WBEM_RETURN_IMMEDIATELY = 0x10,
WBEM_MASK_RESERVED_FLAGS = 0x1f000,
WBEM_FLAG_USE_AMENDED_QUALIFIERS = 0x20000,
WBEM_FLAG_STRONG_VALIDATION = 0x100000
} WBEM_GENERIC_FLAG_TYPE;
typedef enum tagCLSCTX {
CLSCTX_INPROC_SERVER = 0x1,
CLSCTX_INPROC_HANDLER = 0x2,
+102
View File
@@ -14541,6 +14541,108 @@ tag_WBEMSTATUS
.. attribute:: WBEMMOF_E_INVALID_DELETECLASS_SYNTAX(2147762225)
tag_WBEM_CHANGE_FLAG_TYPE
'''''''''''''''''''''''''
.. class:: WBEM_CHANGE_FLAG_TYPE
Alias for :class:`tag_WBEM_CHANGE_FLAG_TYPE`
.. class:: tag_WBEM_CHANGE_FLAG_TYPE
.. attribute:: WBEM_FLAG_CREATE_OR_UPDATE(0)
.. attribute:: WBEM_FLAG_UPDATE_ONLY(1)
.. attribute:: WBEM_FLAG_CREATE_ONLY(2)
.. attribute:: WBEM_FLAG_UPDATE_COMPATIBLE(0)
.. attribute:: WBEM_FLAG_UPDATE_SAFE_MODE(32)
.. attribute:: WBEM_FLAG_UPDATE_FORCE_MODE(64)
.. attribute:: WBEM_MASK_UPDATE_MODE(96)
.. attribute:: WBEM_FLAG_ADVISORY(65536)
tag_WBEM_TIMEOUT_TYPE
'''''''''''''''''''''
.. class:: WBEM_TIMEOUT_TYPE
Alias for :class:`tag_WBEM_TIMEOUT_TYPE`
.. class:: tag_WBEM_TIMEOUT_TYPE
.. attribute:: WBEM_NO_WAIT(0)
.. attribute:: WBEM_INFINITE(4294967295)
tag_WBEM_GENERIC_FLAG_TYPE
''''''''''''''''''''''''''
.. class:: WBEM_GENERIC_FLAG_TYPE
Alias for :class:`tag_WBEM_GENERIC_FLAG_TYPE`
.. class:: tag_WBEM_GENERIC_FLAG_TYPE
.. attribute:: WBEM_FLAG_RETURN_IMMEDIATELY(16)
.. attribute:: WBEM_FLAG_RETURN_WBEM_COMPLETE(0)
.. attribute:: WBEM_FLAG_BIDIRECTIONAL(0)
.. attribute:: WBEM_FLAG_FORWARD_ONLY(32)
.. attribute:: WBEM_FLAG_NO_ERROR_OBJECT(64)
.. attribute:: WBEM_FLAG_RETURN_ERROR_OBJECT(0)
.. attribute:: WBEM_FLAG_SEND_STATUS(128)
.. attribute:: WBEM_FLAG_DONT_SEND_STATUS(0)
.. attribute:: WBEM_FLAG_ENSURE_LOCATABLE(256)
.. attribute:: WBEM_FLAG_DIRECT_READ(512)
.. attribute:: WBEM_FLAG_SEND_ONLY_SELECTED(0)
.. attribute:: WBEM_RETURN_WHEN_COMPLETE(0)
.. attribute:: WBEM_RETURN_IMMEDIATELY(16)
.. attribute:: WBEM_MASK_RESERVED_FLAGS(126976)
.. attribute:: WBEM_FLAG_USE_AMENDED_QUALIFIERS(131072)
.. attribute:: WBEM_FLAG_STRONG_VALIDATION(1048576)
tagCLSCTX
'''''''''
.. class:: CLSCTX
+23 -4
View File
@@ -20,26 +20,31 @@ def crypt(src, dst, certs, **kwargs):
dst.close()
src.close()
def decrypt(src, pfxfile, password, **kwargs):
def decrypt(src, pfxfile, password, outfile=None, **kwargs):
"""Decrypt the content of 'src' with the private key in 'pfxfile'. the 'pfxfile' is open using the 'password'"""
# Open the 'pfx' with the given password
pfx = crypto.import_pfx(pfxfile.read(), password)
# Decrypt the content of the file
decrypted = crypto.decrypt(pfx, src.read())
print(u"Result = <{0}>".format(decrypted))
if outfile is None:
print(u"Result = <{0}>".format(decrypted))
else:
with open(outfile, "wb") as f:
f.write(decrypted)
return decrypted
PFW_TMP_KEY_CONTAINER = "PythonForWindowsTMPContainer"
def genkeys(common_name, pfxpassword, outname, **kwargs):
def genkeys(common_name, pfxpassword, outname, keysize=2048, **kwargs):
"""Generate a SHA256/RSA key pair. A self-signed certificate with 'common_name' is stored as 'outname'.cer.
The private key is stored in 'outname'.pfx protected with 'pfxpassword'"""
cert_store = crypto.EHCERTSTORE.new_in_memory()
# Create a TMP context that will hold our newly generated key-pair
with crypto.CryptContext(PFW_TMP_KEY_CONTAINER, None, PROV_RSA_FULL, 0, retrycreate=True) as ctx:
key = HCRYPTKEY()
keysize_flags = keysize << 16
# Generate a key-pair that is exportable
winproxy.CryptGenKey(ctx, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, key)
winproxy.CryptGenKey(ctx, AT_KEYEXCHANGE, CRYPT_EXPORTABLE | keysize_flags, key)
# It does NOT destroy the key-pair from the container,
# It only release the key handle
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa379918(v=vs.85).aspx
@@ -80,6 +85,18 @@ def genkeys(common_name, pfxpassword, outname, **kwargs):
prov = HCRYPTPROV()
winproxy.CryptAcquireContextW(prov, PFW_TMP_KEY_CONTAINER, None, PROV_RSA_FULL, CRYPT_DELETEKEYSET)
# Openssl commands to check ce certif/pfx
## Read certificate info (.cer)
### openssl x509 -inform der -in {certif} -text -noout
## Read pfx info (ask to another password to encrypt Private key before print/export)
### openssl pkcs12 -info -in {pfx} -nokeys
## Read pfx info !!!! PRINT PRIVATE KEY !!!!
### openssl pkcs12 -info -in {pfx} -nodes
parser = argparse.ArgumentParser(prog=__file__)
subparsers = parser.add_subparsers(description='valid subcommands',)
@@ -96,12 +113,14 @@ decryptparse.set_defaults(func=decrypt)
decryptparse.add_argument('src', type=argparse.FileType('rb'), help='File to decrypt')
decryptparse.add_argument('pfxfile', type=argparse.FileType('rb'), help='PFX file to use')
decryptparse.add_argument('password', help='Password of the PFX')
decryptparse.add_argument('--outfile', default=None, help='The outputfile default is print')
genkeysparse = subparsers.add_parser('genkey')
genkeysparse.set_defaults(func=genkeys)
genkeysparse.add_argument('common_name', nargs='?', metavar='CommonName', default='DEFAULT', help='the common name of the certificate')
genkeysparse.add_argument('outname', nargs='?',help='The filename base for the generated files')
genkeysparse.add_argument('--pfxpassword', nargs='?', help='Password to protect the PFX')
genkeysparse.add_argument('--keysize', nargs='?', type=lambda x: int(x, 0), default=2048, help='The size of the RSA key')
res = parser.parse_args()
res.func(**res.__dict__)
+1 -1
View File
@@ -15,7 +15,7 @@ def read_apisetmap():
parser = argparse.ArgumentParser(prog=__file__)
parser.add_argument('filename', default="apisetmap.dmp", help='The filename in which the ApiSetMap is dumped')
parser.add_argument('--filename', default="apisetmap.dmp", help='The filename in which the ApiSetMap is dumped')
res = parser.parse_args()
with open(res.filename, "wb") as f:
File diff suppressed because one or more lines are too long
+44
View File
@@ -873,6 +873,50 @@ class tag_WBEMSTATUS(EnumType):
WBEMSTATUS = tag_WBEMSTATUS
WBEM_FLAG_CREATE_OR_UPDATE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_CREATE_OR_UPDATE", 0x0)
WBEM_FLAG_UPDATE_ONLY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_ONLY", 0x1)
WBEM_FLAG_CREATE_ONLY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_CREATE_ONLY", 0x2)
WBEM_FLAG_UPDATE_COMPATIBLE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_COMPATIBLE", 0x0)
WBEM_FLAG_UPDATE_SAFE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_SAFE_MODE", 0x20)
WBEM_FLAG_UPDATE_FORCE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_UPDATE_FORCE_MODE", 0x40)
WBEM_MASK_UPDATE_MODE = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_MASK_UPDATE_MODE", 0x60)
WBEM_FLAG_ADVISORY = EnumValue("tag_WBEM_CHANGE_FLAG_TYPE", "WBEM_FLAG_ADVISORY", 0x10000)
class tag_WBEM_CHANGE_FLAG_TYPE(EnumType):
values = [WBEM_FLAG_CREATE_OR_UPDATE, WBEM_FLAG_UPDATE_ONLY, WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_UPDATE_COMPATIBLE, WBEM_FLAG_UPDATE_SAFE_MODE, WBEM_FLAG_UPDATE_FORCE_MODE, WBEM_MASK_UPDATE_MODE, WBEM_FLAG_ADVISORY]
mapper = {x:x for x in values}
WBEM_CHANGE_FLAG_TYPE = tag_WBEM_CHANGE_FLAG_TYPE
WBEM_NO_WAIT = EnumValue("tag_WBEM_TIMEOUT_TYPE", "WBEM_NO_WAIT", 0x0)
WBEM_INFINITE = EnumValue("tag_WBEM_TIMEOUT_TYPE", "WBEM_INFINITE", 0xffffffff)
class tag_WBEM_TIMEOUT_TYPE(EnumType):
values = [WBEM_NO_WAIT, WBEM_INFINITE]
mapper = {x:x for x in values}
WBEM_TIMEOUT_TYPE = tag_WBEM_TIMEOUT_TYPE
WBEM_FLAG_RETURN_IMMEDIATELY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_IMMEDIATELY", 0x10)
WBEM_FLAG_RETURN_WBEM_COMPLETE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_WBEM_COMPLETE", 0x0)
WBEM_FLAG_BIDIRECTIONAL = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_BIDIRECTIONAL", 0x0)
WBEM_FLAG_FORWARD_ONLY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_FORWARD_ONLY", 0x20)
WBEM_FLAG_NO_ERROR_OBJECT = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_NO_ERROR_OBJECT", 0x40)
WBEM_FLAG_RETURN_ERROR_OBJECT = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_RETURN_ERROR_OBJECT", 0x0)
WBEM_FLAG_SEND_STATUS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_SEND_STATUS", 0x80)
WBEM_FLAG_DONT_SEND_STATUS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_DONT_SEND_STATUS", 0x0)
WBEM_FLAG_ENSURE_LOCATABLE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_ENSURE_LOCATABLE", 0x100)
WBEM_FLAG_DIRECT_READ = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_DIRECT_READ", 0x200)
WBEM_FLAG_SEND_ONLY_SELECTED = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_SEND_ONLY_SELECTED", 0x0)
WBEM_RETURN_WHEN_COMPLETE = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_RETURN_WHEN_COMPLETE", 0x0)
WBEM_RETURN_IMMEDIATELY = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_RETURN_IMMEDIATELY", 0x10)
WBEM_MASK_RESERVED_FLAGS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_MASK_RESERVED_FLAGS", 0x1f000)
WBEM_FLAG_USE_AMENDED_QUALIFIERS = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_USE_AMENDED_QUALIFIERS", 0x20000)
WBEM_FLAG_STRONG_VALIDATION = EnumValue("tag_WBEM_GENERIC_FLAG_TYPE", "WBEM_FLAG_STRONG_VALIDATION", 0x100000)
class tag_WBEM_GENERIC_FLAG_TYPE(EnumType):
values = [WBEM_FLAG_RETURN_IMMEDIATELY, WBEM_FLAG_RETURN_WBEM_COMPLETE, WBEM_FLAG_BIDIRECTIONAL, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_NO_ERROR_OBJECT, WBEM_FLAG_RETURN_ERROR_OBJECT, WBEM_FLAG_SEND_STATUS, WBEM_FLAG_DONT_SEND_STATUS, WBEM_FLAG_ENSURE_LOCATABLE, WBEM_FLAG_DIRECT_READ, WBEM_FLAG_SEND_ONLY_SELECTED, WBEM_RETURN_WHEN_COMPLETE, WBEM_RETURN_IMMEDIATELY, WBEM_MASK_RESERVED_FLAGS, WBEM_FLAG_USE_AMENDED_QUALIFIERS, WBEM_FLAG_STRONG_VALIDATION]
mapper = {x:x for x in values}
WBEM_GENERIC_FLAG_TYPE = tag_WBEM_GENERIC_FLAG_TYPE
CLSCTX_INPROC_SERVER = EnumValue("tagCLSCTX", "CLSCTX_INPROC_SERVER", 0x1)
CLSCTX_INPROC_HANDLER = EnumValue("tagCLSCTX", "CLSCTX_INPROC_HANDLER", 0x2)
CLSCTX_LOCAL_SERVER = EnumValue("tagCLSCTX", "CLSCTX_LOCAL_SERVER", 0x4)
+21 -2
View File
@@ -35,7 +35,7 @@ class ApiSetMap(object):
raise NotImplementedError("Should be implemented by subclasses")
@utils.fixedpropety
def resolution_dict(self):
def apisetmap_dict(self):
res = {}
for entry in self.entries_array():
values = self.values_for_entry(entry)
@@ -46,8 +46,27 @@ class ApiSetMap(object):
res[self.get_entry_name(entry)] = final_value
return res
@utils.fixedpropety
def resolution_dict(self):
res = {}
for name, resolved_name in self.apisetmap_dict.items():
# ApiSetResolveToHost does not care about last version + extension
# It remove everything after the last '-'
# Possible to have no '-' ?
try:
cutname = name[:name.rindex("-") + 1]
except ValueError as e:
cutname = name
res[cutname] = resolved_name
return res
def resolve(self, dllname):
return self.resolution_dict[dllname]
try:
cutname = dllname[:dllname.rindex("-") + 1]
except ValueError as e:
return None
return self.resolution_dict[cutname]