Coverage for /private/tmp/im/impacket/impacket/dcerpc/v5/dcom/wmi.py : 67%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved. # # This software is provided under under a slightly modified version # of the Apache Software License. See the accompanying LICENSE file # for more information. # # Author: Alberto Solino (@agsolino) # # Description: # [MS-WMI]/[MS-WMIO] : Windows Management Instrumentation Remote Protocol. Partial implementation # # Best way to learn how to use these calls is to grab the protocol standard # so you understand what the call does, and then read the test case located # at https://github.com/SecureAuthCorp/impacket/tree/master/tests/SMB_RPC # # Since DCOM is like an OO RPC, instead of helper functions you will see the # classes described in the standards developed. # There are test cases for them too. #
NDRENUM PMInterfacePointer_ARRAY, BYTE_ARRAY, PPMInterfacePointer, OBJREF_CUSTOM
x = "" if isinstance(d, collections.Mapping): lenk = max([len(str(x)) for x in list(d.keys())]) for k, v in list(d.items()): key_text = "\n" + " "*level + " "*(lenk - len(str(k))) + str(k) x += key_text + ": " + format_structure(v, level=level+lenk) elif isinstance(d, collections.Iterable) and not isinstance(d, str): for e in d: x += "\n" + " "*level + "- " + format_structure(e, level=level+4) else: x = str(d) return x except: try: from ordereddict.ordereddict import OrderedDict except: from ordereddict import OrderedDict
else: # Let's see if we have it as WBEMSTATUS except: return 'WMI SessionError: unknown error code: 0x%x' % self.error_code
################################################################################ # WMIO Structures and Constants ################################################################################
# 2.2.6 ObjectFlags
#2.2.77 Signature
# 2.2.4 ObjectEncodingLength
# 2.2.73 EncodingLength
# 2.2.78 Encoded-String
# 2.2.76 ReservedOctet
# 2.2.28 NdTableValueTableLength
# 2.2.80 DictionaryReference 0 : '"', 1 : 'key', 2 : 'NADA', 3 : 'read', 4 : 'write', 5 : 'volatile', 6 : 'provider', 7 : 'dynamic', 8 : 'cimwin32', 9 : 'DWORD', 10 : 'CIMTYPE', }
('Encoded_String_Flag', ENCODED_STRING_FLAG), )
('Character', 'z'), )
('Character', 'u'), )
# Let's first check the commonHdr # Let's search for the end of the string else:
else:
# 2.2.8 DecServerName
# 2.2.9 DecNamespaceName
# 2.2.7 Decoration ('DecServerName', ':', DEC_SERVER_NAME), ('DecNamespaceName', ':', DEC_NAMESPACE_NAME), )
# 2.2.69 HeapRef
# 2.2.68 HeapStringRef
# 2.2.19 ClassNameRef
# 2.2.16 ClassHeader ('EncodingLength', ENCODING_LENGTH), ('ReservedOctet', RESERVED_OCTET), ('ClassNameRef', CLASS_NAME_REF), ('NdTableValueTableLength', NDTABLE_VALUE_TABLE_LENGTH), )
# 2.2.17 DerivationList ('EncodingLength', ENCODING_LENGTH), ('_ClassNameEncoding','_-ClassNameEncoding', 'self["EncodingLength"]-4'), ('ClassNameEncoding', ':'), )
# 2.2.82 CimType
return self.enumItems[attr].value
# __metaclass__ = EnumType
CIM_TYPE_ENUM.CIM_TYPE_SINT8.value : 'b=0', CIM_TYPE_ENUM.CIM_TYPE_UINT8.value : 'B=0', CIM_TYPE_ENUM.CIM_TYPE_SINT16.value : '<h=0', CIM_TYPE_ENUM.CIM_TYPE_UINT16.value : '<H=0', CIM_TYPE_ENUM.CIM_TYPE_SINT32.value : '<l=0', CIM_TYPE_ENUM.CIM_TYPE_UINT32.value : '<L=0', CIM_TYPE_ENUM.CIM_TYPE_SINT64.value : '<q=0', CIM_TYPE_ENUM.CIM_TYPE_UINT64.value : '<Q=0', CIM_TYPE_ENUM.CIM_TYPE_REAL32.value : '<f=0', CIM_TYPE_ENUM.CIM_TYPE_REAL64.value : '<d=0', CIM_TYPE_ENUM.CIM_TYPE_BOOLEAN.value : '<H=0', CIM_TYPE_ENUM.CIM_TYPE_STRING.value : HEAPREF, CIM_TYPE_ENUM.CIM_TYPE_DATETIME.value : HEAPREF, CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value: HEAPREF, CIM_TYPE_ENUM.CIM_TYPE_CHAR16.value : '<H=0', CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value : HEAPREF, }
CIM_TYPE_ENUM.CIM_TYPE_SINT8.value : 'sint8', CIM_TYPE_ENUM.CIM_TYPE_UINT8.value : 'uint8', CIM_TYPE_ENUM.CIM_TYPE_SINT16.value : 'sint16', CIM_TYPE_ENUM.CIM_TYPE_UINT16.value : 'uint16', CIM_TYPE_ENUM.CIM_TYPE_SINT32.value : 'sint32', CIM_TYPE_ENUM.CIM_TYPE_UINT32.value : 'uint32', CIM_TYPE_ENUM.CIM_TYPE_SINT64.value : 'sint64', CIM_TYPE_ENUM.CIM_TYPE_UINT64.value : 'uint64', CIM_TYPE_ENUM.CIM_TYPE_REAL32.value : 'real32', CIM_TYPE_ENUM.CIM_TYPE_REAL64.value : 'real64', CIM_TYPE_ENUM.CIM_TYPE_BOOLEAN.value : 'bool', CIM_TYPE_ENUM.CIM_TYPE_STRING.value : 'string', CIM_TYPE_ENUM.CIM_TYPE_DATETIME.value : 'datetime', CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value: 'reference', CIM_TYPE_ENUM.CIM_TYPE_CHAR16.value : 'char16', CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value : 'object', }
# 2.2.61 QualifierName
# 2.2.62 QualifierFlavor
# 2.2.63 QualifierType
# 2.2.71 EncodedValue ('QualifierName', QUALIFIER_NAME), )
def getValue(cls, cimType, entry, heap): # Let's get the default Values
# We have an array, let's set the right unpackStr and dataSize for the array contents # We have an array of strings # First items are DWORDs with the string pointers # inside the heap. We don't need those ones # Let's now grab the strings elif cimType == CIM_TYPE_ENUM.CIM_ARRAY_OBJECT.value: # Discard the pointers heapData = heapData[dataSize*numItems:] for item in range(numItems): msb = METHOD_SIGNATURE_BLOCK(heapData) unit = ENCODING_UNIT() unit['ObjectEncodingLength'] = msb['EncodingLength'] unit['ObjectBlock'] = msb['ObjectBlock'] array.append(unit) heapData = heapData[msb['EncodingLength']+4:] else: for item in range(numItems): # ToDo: Learn to unpack the rest of the array of things array.append(unpack(unpackStrArray, heapData[:dataSizeArray])[0]) heapData = heapData[dataSizeArray:] else: value = 'False' # If the value type is CIM-TYPE-OBJECT, the EncodedValue is a HeapRef to the object encoded as an # ObjectEncodingLength (section 2.2.4) followed by an ObjectBlock (section 2.2.5).
# ToDo: This is a hack.. We should parse this better. We need to have an ENCODING_UNIT. # I'm going through a METHOD_SIGNATURE_BLOCK first just to parse the ObjectBlock msb = METHOD_SIGNATURE_BLOCK(heapData) unit = ENCODING_UNIT() unit['ObjectEncodingLength'] = msb['EncodingLength'] unit['ObjectBlock'] = msb['ObjectBlock'] value = unit CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value): else: except UnicodeDecodeError: if logging.getLogger().level == logging.DEBUG: LOG.debug('Unicode Error: dumping heapData') hexdump(heapData) raise
# 2.2.64 QualifierValue
# 2.2.60 Qualifier ('QualifierName', QUALIFIER_NAME), ('QualifierFlavor', QUALIFIER_FLAVOR), ('QualifierType', QUALIFIER_TYPE), ) # Let's first check the commonHdr else: self.data = None
# 2.2.59 QualifierSet ('EncodingLength', ENCODING_LENGTH), ('_Qualifier','_-Qualifier', 'self["EncodingLength"]-4'), ('Qualifier', ':'), )
qName = b'' else:
# 2.2.20 ClassQualifierSet
# 2.2.22 PropertyCount
# 2.2.24 PropertyNameRef
# 2.2.25 PropertyInfoRef
# 2.2.23 PropertyLookup ('PropertyNameRef', PROPERTY_NAME_REF), ('PropertyInfoRef', PROPERTY_INFO_REF), )
# 2.2.31 PropertyType
# 2.2.33 DeclarationOrder
# 2.2.34 ValueTableOffset
# 2.2.35 ClassOfOrigin
# 2.2.36 PropertyQualifierSet
# 2.2.30 PropertyInfo ('PropertyType', PROPERTY_TYPE), ('DeclarationOrder', DECLARATION_ORDER), ('ValueTableOffset', VALUE_TABLE_OFFSET), ('ClassOfOrigin', CLASS_OF_ORIGIN), ('PropertyQualifierSet', ':', PROPERTY_QUALIFIER_SET), )
# 2.2.32 Inherited
# 2.2.21 PropertyLookupTable ('PropertyCount', PROPERTY_COUNT), ('_PropertyLookup','_-PropertyLookup', 'self["PropertyCount"]*self.PropertyLookupSize'), ('PropertyLookup', ':'), )
propName = DICTIONARY_REFERENCE[propItem['PropertyNameRef'] & 0x7fffffff] else:
else:
#return properties
# 2.2.66 Heap
('HeapLength', HEAP_LENGTH), # HeapLength is a 32-bit value with the most significant bit always set # (using little-endian binary encoding for the 32-bit value), so that the # length is actually only 31 bits. ('_HeapItem','_-HeapItem', 'self["HeapLength"]&0x7fffffff'), ('HeapItem', ':'), )
# 2.2.37 ClassHeap
# 2.2.15 ClassPart ('ClassHeader', ':', CLASS_HEADER), ('DerivationList', ':', DERIVATION_LIST), ('ClassQualifierSet', ':', CLASS_QUALIFIER_SET), ('PropertyLookupTable', ':', PROPERTY_LOOKUP_TABLE), ('_NdTable_ValueTable','_-NdTable_ValueTable', 'self["ClassHeader"]["NdTableValueTableLength"]'), ('NdTable_ValueTable',':'), ('ClassHeap', ':', CLASS_HEAP), ('_Garbage', '_-Garbage', 'self["ClassHeader"]["EncodingLength"]-len(self)'), ('Garbage', ':=b""'), )
# Let's get the default Values unpackStr = HEAPREF[:-2] else: except: LOG.error("getProperties: Error unpacking!!") itemValue = 0xffffffff
# 2.2.39 MethodCount
# 2.2.40 MethodCountPadding
# 2.2.42 MethodName
# 2.2.43 MethodFlags
# 2.2.44 MethodPadding
# 2.2.45 MethodOrigin
# 2.2.47 HeapQualifierSetRef
# 2.2.46 MethodQualifiers
# 2.2.51 HeapMethodSignatureBlockRef
# 2.2.50 MethodSignature
# 2.2.48 InputSignature
# 2.2.49 OutputSignature
# 2.2.52 MethodHeap
# 2.2.41 MethodDescription ('MethodName',METHOD_NAME), ('MethodFlags', METHOD_FLAGS), ('MethodPadding', METHOD_PADDING), ('MethodOrigin', METHOD_ORIGIN), ('MethodQualifiers', METHOD_QUALIFIERS), ('InputSignature', INPUT_SIGNATURE), ('OutputSignature', OUTPUT_SIGNATURE), )
# 2.2.38 MethodsPart ('EncodingLength',ENCODING_LENGTH), ('MethodCount', METHOD_COUNT), ('MethodCountPadding', METHOD_COUNT_PADDING), ('_MethodDescription', '_-MethodDescription', 'self["MethodCount"]*self.MethodDescriptionSize'), ('MethodDescription', ':'), ('MethodHeap', ':', METHOD_HEAP), )
# ToDo #print "WBEM_FLAVOR_ORIGIN_PROPAGATED not yet supported!" #raise pass # There are qualifiers #print methodDict['InParams'] else: else: methodDict['OutParams'] = None
# 2.2.14 ClassAndMethodsPart ('ClassPart', ':', CLASS_PART), ('MethodsPart', ':', METHODS_PART), )
return 'None' else:
#print format_structure(self["ClassPart"].getProperties())
# 2.2.13 CurrentClass
# 2.2.54 InstanceFlags
# 2.2.55 InstanceClassName
# 2.2.27 NullAndDefaultFlag
# 2.2.26 NdTable
# 2.2.56 InstanceData #InstanceData = ValueTable
('ClassPart', ':', CLASS_PART), )
# 2.2.65 InstancePropQualifierSet ('InstPropQualSetFlag', INST_PROP_QUAL_SET_FLAG), ) # ToDo: this is wrong.. this should be an array of QualifierSet, see documentation #('QualifierSet', ':', QualifierSet), ('QualifierSet', ':', QUALIFIER_SET), )
# Let's first check the commonHdr # We don't support this yet! raise Exception("self['InstPropQualSetFlag'] == 2") else: self.data = None
# 2.2.57 InstanceQualifierSet ('QualifierSet', ':', QUALIFIER_SET), ('InstancePropQualifierSet', ':', INSTANCE_PROP_QUALIFIER_SET), )
# 2.2.58 InstanceHeap
# 2.2.53 InstanceType ('CurrentClass', ':', CURRENT_CLASS_NO_METHODS), ('EncodingLength', ENCODING_LENGTH), ('InstanceFlags', INSTANCE_FLAGS), ('InstanceClassName', INSTANCE_CLASS_NAME), ('_NdTable_ValueTable', '_-NdTable_ValueTable', 'self["CurrentClass"]["ClassPart"]["ClassHeader"]["NdTableValueTableLength"]'), ('NdTable_ValueTable',':'), ('InstanceQualifierSet', ':', INSTANCE_QUALIFIER_SET), ('InstanceHeap', ':', INSTANCE_HEAP), )
# Let's first check the commonHdr #hexdump(data[len(self.getData()):]) #self.InstanceDataSize = self['CurrentClass']['ClassPart']['PropertyLookupTable']['PropertyCount'] * len(InstanceData()) else:
unpackStr = HEAPREF[:-2] else: except: LOG.error("getValues: Error Unpacking!") itemValue = 0xffffffff
# if itemValue == 0, default value remains
# 2.2.12 ParentClass
# 2.2.13 CurrentClass
('ParentClass', ':', PARENT_CLASS), ('CurrentClass', ':', CURRENT_CLASS), )
# 2.2.5 ObjectBlock ('ObjectFlags', OBJECT_FLAGS), )
('Decoration', ':', DECORATION), )
('InstanceType', ':', INSTANCE_TYPE), )
('ClassType', ':', CLASS_TYPE), )
# WMIO - 2.2.6 - 0x04 If this flag is set, the object has a Decoration block. # The object is a CIM class. else:
else:
qualifiers = pClass.getQualifiers()
for qualifier in qualifiers: print("[%s]" % qualifier)
className = pClass.getClassName()
print("class %s \n{" % className)
properties = pClass.getProperties() if cInstance is not None: properties = cInstance.getValues(properties)
for pName in properties: #if property['inherited'] == 0: qualifiers = properties[pName]['qualifiers'] for qName in qualifiers: if qName != 'CIMTYPE': print('\t[%s(%s)]' % (qName, qualifiers[qName])) print("\t%s %s" % (properties[pName]['stype'], properties[pName]['name']), end=' ') if properties[pName]['value'] is not None: if properties[pName]['type'] == CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value: print('= IWbemClassObject\n') elif properties[pName]['type'] == CIM_TYPE_ENUM.CIM_ARRAY_OBJECT.value: if properties[pName]['value'] == 0: print('= %s\n' % properties[pName]['value']) else: print('= %s\n' % list('IWbemClassObject' for _ in range(len(properties[pName]['value'])))) else: print('= %s\n' % properties[pName]['value']) else: print('\n')
print() methods = pClass.getMethods() for methodName in methods: for qualifier in methods[methodName]['qualifiers']: print('\t[%s]' % qualifier)
if methods[methodName]['InParams'] is None and methods[methodName]['OutParams'] is None: print('\t%s %s();\n' % ('void', methodName)) if methods[methodName]['InParams'] is None and len(methods[methodName]['OutParams']) == 1: print('\t%s %s();\n' % (methods[methodName]['OutParams']['ReturnValue']['stype'], methodName)) else: returnValue = b'' if methods[methodName]['OutParams'] is not None: # Search the Return Value #returnValue = (item for item in method['OutParams'] if item["name"] == "ReturnValue").next() if 'ReturnValue' in methods[methodName]['OutParams']: returnValue = methods[methodName]['OutParams']['ReturnValue']['stype']
print('\t%s %s(\n' % (returnValue, methodName), end=' ') if methods[methodName]['InParams'] is not None: for pName in methods[methodName]['InParams']: print('\t\t[in] %s %s,' % (methods[methodName]['InParams'][pName]['stype'], pName))
if methods[methodName]['OutParams'] is not None: for pName in methods[methodName]['OutParams']: if pName != 'ReturnValue': print('\t\t[out] %s %s,' % (methods[methodName]['OutParams'][pName]['stype'], pName))
print('\t);\n')
print("}")
else:
# instance else:
# First off, do we have a class? if (self['ObjectFlags'] & 0x01) == 0: # instance ctCurrent = self['InstanceType']['CurrentClass'] currentName = ctCurrent.getClassName() if currentName is not None: self.printClass(ctCurrent, self['InstanceType']) return else: ctParent = self['ClassType']['ParentClass'] ctCurrent = self['ClassType']['CurrentClass']
parentName = ctParent.getClassName() if parentName is not None: self.printClass(ctParent)
currentName = ctCurrent.getClassName() if currentName is not None: self.printClass(ctCurrent)
# 2.2.70 MethodSignatureBlock ('EncodingLength', ENCODING_LENGTH), ) ('_ObjectBlock', '_-ObjectBlock', 'self["EncodingLength"]'), ('ObjectBlock', ':', OBJECT_BLOCK), ) else: self.data = None
# 2.2.1 EncodingUnit ('Signature', SIGNATURE), ('ObjectEncodingLength', OBJECT_ENCODING_LENGTH), ('_ObjectBlock', '_-ObjectBlock', 'self["ObjectEncodingLength"]'), ('ObjectBlock', ':', OBJECT_BLOCK), )
################################################################################ # CONSTANTS ################################################################################ # 1.9 Standards Assignments
# lFlags
################################################################################ # STRUCTURES ################################################################################
('Data', UCHAR_ARRAY_CV), )
('Data', ULONG_ARRAY), )
# 2.2.5 WBEM_CHANGE_FLAG_TYPE Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.6 WBEM_GENERIC_FLAG_TYPE Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.7 WBEM_STATUS_TYPE Enumeration
# 2.2.8 WBEM_TIMEOUT_TYPE Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.9 WBEM_QUERY_FLAG_TYPE Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.10 WBEM_BACKUP_RESTORE_FLAGS Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.11 WBEMSTATUS Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.12 WBEM_CONNECT_OPTIONS Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.14 ObjectArray Structure ('dwByteOrdering', '<L=0'), ('abSignature', '8s="WBEMDATA"'), ('dwSizeOfHeader1', '<L=0x1a'), ('dwDataSize1', '<L=0'), ('dwFlags', '<L=0'), ('bVersion', 'B=1'), ('bPacketType', 'B=0'), ('dwSizeOfHeader2', '<L=8'), ('dwDataSize2', '<L', 'len(self["wbemObjects"])+12'), ('dwSizeOfHeader3', '<L=12'), ('dwDataSize3', '<L', 'len(self["dwDataSize2"])-12)'), ('dwNumObjects', '<L=0'), ('_wbemObjects', '_-wbemObjects', 'self["dwDataSize3"]'), ('wbemObjects', ':'), )
# 2.2.14.1 WBEM_DATAPACKET_OBJECT Structure ('dwSizeOfHeader', '<L=9'), ('dwSizeOfData', '<L','len(self["Object"])'), ('bObjectType', 'B=0'), ('_Object', '_-Object', 'self["dwSizeOfData"]'), ('Object', ':'), )
# 2.2.14.2 WBEMOBJECT_CLASS Structure ('dwSizeOfHeader', '<L=8'), ('dwSizeOfData', '<L','len(self["ObjectData"])'), ('_ObjectData', '_-ObjectData', 'self["dwSizeOfData"]'), ('ObjectData', ':'), )
# 2.2.14.3 WBEMOBJECT_INSTANCE Structure ('dwSizeOfHeader', '<L=0x18'), ('dwSizeOfData', '<L','len(self["ObjectData"])'), ('classID', '16s=b"\x00"*16'), ('_ObjectData', '_-ObjectData', 'self["dwSizeOfData"]'), ('ObjectData', ':'), )
# 2.2.14.4 WBEMOBJECT_INSTANCE_NOCLASS Structure ('dwSizeOfHeader', '<L=0x18'), ('dwSizeOfData', '<L','len(self["ObjectData"])'), ('classID', '16s=b"\x00"*16'), ('_ObjectData', '_-ObjectData', 'self["dwSizeOfData"]'), ('ObjectData', ':'), )
# 2.2.15 WBEM_REFRESHED_OBJECT Structure ('m_lRequestId', LONG), ('m_lBlobType', LONG), ('m_lBlobLength', LONG), ('m_pBlob', BYTE_ARRAY), )
('Data', WBEM_REFRESHED_OBJECT_ARRAY), )
# 2.2.16 WBEM_INSTANCE_BLOB Enumeration ('Version', '<L=0x1'), ('numObjects', '<L=0'), ('Objects', ':'), )
# 2.2.17 WBEM_INSTANCE_BLOB_TYPE Enumeration # [v1_enum] type ('Data', '<L'), )
# 2.2.26 _WBEM_REFRESH_INFO_NON_HIPERF Structure ('m_wszNamespace', LPWSTR), ('m_pTemplate', PMInterfacePointer), )
# 2.2.27 _WBEM_REFRESH_INFO_REMOTE Structure ('m_pRefresher', PMInterfacePointer), ('m_pTemplate', PMInterfacePointer), ('m_Guid', GUID), )
# 2.2.25 WBEM_REFRESH_TYPE Enumeration
# 2.2.28 _WBEM_REFRESH_INFO_UNION Union ('tag', LONG), ) WBEM_REFRESH_TYPE.WBEM_REFRESH_TYPE_REMOTE : ('m_Remote', _WBEM_REFRESH_INFO_REMOTE), WBEM_REFRESH_TYPE.WBEM_REFRESH_TYPE_NON_HIPERF: ('m_NonHiPerf', _WBEM_REFRESH_INFO_NON_HIPERF), WBEM_REFRESH_TYPE.WBEM_REFRESH_TYPE_INVALID : ('m_hres', HRESULT), }
# 2.2.20 _WBEM_REFRESH_INFO Structure ('m_lType', LONG), ('m_Info', _WBEM_REFRESH_INFO_UNION), ('m_lCancelId', LONG), )
# 2.2.21 _WBEM_REFRESHER_ID Structure ('m_szMachineName', LPCSTR), ('m_dwProcessId', DWORD), ('m_guidRefresherId', GUID), )
# 2.2.22 _WBEM_RECONNECT_INFO Structure ('m_lType', LPCSTR), ('m_pwcsPath', LPWSTR), )
# 2.2.23 _WBEM_RECONNECT_RESULTS Structure ('m_lId', LONG), ('m_hr', HRESULT), )
################################################################################ # RPC CALLS ################################################################################ # 3.1.4.1 IWbemLevel1Login Interface # 3.1.4.1.1 IWbemLevel1Login::EstablishPosition (Opnum 3) ('reserved1', LPWSTR), ('reserved2', DWORD), )
('LocaleVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.1.2 IWbemLevel1Login::RequestChallenge (Opnum 4) ('reserved1', LPWSTR), ('reserved2', LPWSTR), )
('reserved3', UCHAR_ARRAY_CV), ('ErrorCode', error_status_t), )
# 3.1.4.1.3 IWbemLevel1Login::WBEMLogin (Opnum 5) ('reserved1', LPWSTR), ('reserved2', PUCHAR_ARRAY_CV), ('reserved3', LONG), ('reserved4', PMInterfacePointer), )
('reserved5', UCHAR_ARRAY_CV), ('ErrorCode', error_status_t), )
# 3.1.4.1.4 IWbemLevel1Login::NTLMLogin (Opnum 6) ('wszNetworkResource', LPWSTR), ('wszPreferredLocale', LPWSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), )
('ppNamespace', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.2 IWbemObjectSink Interface Server Details # 3.1.4.2.1 IWbemObjectSink::Indicate (Opnum 3) Server details ('lObjectCount', LONG), ('apObjArray', PMInterfacePointer_ARRAY), )
('ErrorCode', error_status_t), )
# 3.1.4.2.2 IWbemObjectSink::SetStatus (Opnum 4) Server Details ('lFlags', LONG), ('hResult', HRESULT), ('strParam', BSTR), ('pObjParam', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3 IWbemServices Interface # 3.1.4.3.1 IWbemServices::OpenNamespace (Opnum 3) ('strNamespace', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('ppWorkingNamespace', PMInterfacePointer), ('ppResult', PMInterfacePointer), )
('ppWorkingNamespace', PPMInterfacePointer), ('ppResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.2 IWbemServices::CancelAsyncCall (Opnum 4) ('IWbemObjectSink', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.3 IWbemServices::QueryObjectSink (Opnum 5) ('lFlags', LONG), )
('ppResponseHandler', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.4 IWbemServices::GetObject (Opnum 6) ('strObjectPath', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('ppObject', PMInterfacePointer), ('ppCallResult', PMInterfacePointer), )
('ppObject', PPMInterfacePointer), ('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.5 IWbemServices::GetObjectAsync (Opnum 7) ('strObjectPath', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.6 IWbemServices::PutClass (Opnum 8) ('pObject', PMInterfacePointer), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), ('ppCallResult', PMInterfacePointer), )
('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.7 IWbemServices::PutClassAsync (Opnum 9) ('pObject', PMInterfacePointer), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.8 IWbemServices::DeleteClass (Opnum 10) ('strClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('ppCallResult', PMInterfacePointer), )
('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.9 IWbemServices::DeleteClassAsync (Opnum 11) ('strClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.10 IWbemServices::CreateClassEnum (Opnum 12) ('strSuperClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.11 IWbemServices::CreateClassEnumAsync (Opnum 13) ('strSuperClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.12 IWbemServices::PutInstance (Opnum 14) ('pInst', PMInterfacePointer), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('ppCallResult', PMInterfacePointer), )
('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.13 IWbemServices::PutInstanceAsync (Opnum 15) ('pInst', PMInterfacePointer), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.14 IWbemServices::DeleteInstance (Opnum 16) ('strObjectPath', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('ppCallResult', PMInterfacePointer), )
('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.15 IWbemServices::DeleteInstanceAsync (Opnum 17) ('strObjectPath', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.16 IWbemServices::CreateInstanceEnum (Opnum 18) ('strSuperClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.17 IWbemServices::CreateInstanceEnumAsync (Opnum 19) ('strSuperClass', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.18 IWbemServices::ExecQuery (Opnum 20) ('strQueryLanguage', BSTR), ('strQuery', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.19 IWbemServices::ExecQueryAsync (Opnum 21) ('strQueryLanguage', BSTR), ('strQuery', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.20 IWbemServices::ExecNotificationQuery (Opnum 22) ('strQueryLanguage', BSTR), ('strQuery', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.21 IWbemServices::ExecNotificationQueryAsync (Opnum 23) ('strQueryLanguage', BSTR), ('strQuery', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.3.22 IWbemServices::ExecMethod (Opnum 24) ('strObjectPath', BSTR), ('strMethodName', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pInParams', PMInterfacePointer), ('ppOutParams', PPMInterfacePointer), ('ppCallResult', PPMInterfacePointer), )
('ppOutParams', PPMInterfacePointer), ('ppCallResult', PPMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.3.23 IWbemServices::ExecMethodAsync (Opnum 25) ('strObjectPath', BSTR), ('strMethodName', BSTR), ('lFlags', LONG), ('pCtx', PMInterfacePointer), ('pInParams', PMInterfacePointer), ('pResponseHandler', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.4 IEnumWbemClassObject Interface # 3.1.4.4.1 IEnumWbemClassObject::Reset (Opnum 3) )
('ErrorCode', error_status_t), )
# 3.1.4.4.2 IEnumWbemClassObject::Next (Opnum 4) ('lTimeout', ULONG), ('uCount', ULONG), )
('apObjects', PMInterfacePointer_ARRAY_CV), ('puReturned', ULONG), ('ErrorCode', error_status_t), )
# 3.1.4.4.3 IEnumWbemClassObject::NextAsync (Opnum 5) ('lTimeout', LONG), ('pSink', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.4.4 IEnumWbemClassObject::Clone (Opnum 6) )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.4.5 IEnumWbemClassObject::Skip (Opnum 7) ('lTimeout', LONG), ('uCount', ULONG), )
('ErrorCode', error_status_t), )
# 3.1.4.5 IWbemCallResult Interface # 3.1.4.5.1 IWbemCallResult::GetResultObject (Opnum 3) ('lTimeout', LONG), )
('ppResultObject', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.5.2 IWbemCallResult::GetResultString (Opnum 4) ('lTimeout', LONG), )
('pstrResultString', BSTR), ('ErrorCode', error_status_t), )
# 3.1.4.5.3 IWbemCallResult::GetResultServices (Opnum 5) ('lTimeout', LONG), )
('ppServices', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.5.4 IWbemCallResult::GetCallStatus (Opnum 6) ('lTimeout', LONG), )
('plStatus', LONG), ('ErrorCode', error_status_t), )
# 3.1.4.6 IWbemFetchSmartEnum Interface # 3.1.4.6.1 IWbemFetchSmartEnum::GetSmartEnum (Opnum 3) )
('ppSmartEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.7 IWbemWCOSmartEnum Interface # 3.1.4.7.1 IWbemWCOSmartEnum::Next (Opnum 3) ('proxyGUID', REFGUID), ('lTimeout', LONG), ('uCount', ULONG), )
('puReturned', ULONG), ('pdwBuffSize', ULONG), ('pBuffer', BYTE_ARRAY), ('ErrorCode', error_status_t), )
# 3.1.4.8 IWbemLoginClientID Interface # 3.1.4.8.1 IWbemLoginClientID::SetClientInfo (Opnum 3) ('wszClientMachine', LPWSTR), ('lClientProcId', LONG), ('lReserved', LONG), )
('ErrorCode', error_status_t), )
# 3.1.4.9 IWbemLoginHelper Interface # 3.1.4.9.1 IWbemLoginHelper::SetEvent (Opnum 3) ('sEventToSet', LPCSTR), )
('ErrorCode', error_status_t), )
#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # 3.1.4.10 IWbemBackupRestore Interface # 3.1.4.10.1 IWbemBackupRestore::Backup (Opnum 3) ('strBackupToFile', LPWSTR), ('lFlags', LONG), )
('ErrorCode', error_status_t), )
# 3.1.4.10.2 IWbemBackupRestore::Restore (Opnum 4) ('strRestoreFromFile', LPWSTR), ('lFlags', LONG), )
('ErrorCode', error_status_t), )
# 3.1.4.11 IWbemBackupRestoreEx Interface # 3.1.4.11.1 IWbemBackupRestoreEx::Pause (Opnum 5) )
('ErrorCode', error_status_t), )
# 3.1.4.11.2 IWbemBackupRestoreEx::Resume (Opnum 6) )
('ErrorCode', error_status_t), )
# 3.1.4.12 IWbemRefreshingServices Interface # 3.1.4.12.1 IWbemRefreshingServices::AddObjectToRefresher (Opnum 3) ('pRefresherId', _WBEM_REFRESHER_ID), ('wszPath', LPWSTR), ('lFlags', LONG), ('pContext', PMInterfacePointer), ('dwClientRefrVersion', DWORD), )
('pInfo', _WBEM_REFRESH_INFO), ('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.12.2 IWbemRefreshingServices::AddObjectToRefresherByTemplate (Opnum 4) ('pRefresherId', _WBEM_REFRESHER_ID), ('pTemplate', PMInterfacePointer), ('lFlags', LONG), ('pContext', PMInterfacePointer), ('dwClientRefrVersion', DWORD), )
('pInfo', _WBEM_REFRESH_INFO), ('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.12.3 IWbemRefreshingServices::AddEnumToRefresher (Opnum 5) ('pRefresherId', _WBEM_REFRESHER_ID), ('wszClass', LPWSTR), ('lFlags', LONG), ('pContext', PMInterfacePointer), ('dwClientRefrVersion', DWORD), )
('pInfo', _WBEM_REFRESH_INFO), ('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.12.4 IWbemRefreshingServices::RemoveObjectFromRefresher (Opnum 6) ('pRefresherId', _WBEM_REFRESHER_ID), ('lId', LONG), ('lFlags', LONG), ('dwClientRefrVersion', DWORD), )
('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.12.5 IWbemRefreshingServices::GetRemoteRefresher (Opnum 7) ('pRefresherId', _WBEM_REFRESHER_ID), ('lFlags', LONG), ('dwClientRefrVersion', DWORD), )
('ppRemRefresher', PMInterfacePointer), ('pGuid', GUID), ('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.12.6 IWbemRefreshingServices::ReconnectRemoteRefresher (Opnum 8) ('pRefresherId', _WBEM_REFRESHER_ID), ('lFlags', LONG), ('lNumObjects', LONG), ('dwClientRefrVersion', DWORD), ('apReconnectInfo', _WBEM_RECONNECT_INFO_ARRAY), )
('apReconnectResults', _WBEM_RECONNECT_RESULTS_ARRAY), ('pdwSvrRefrVersion', DWORD), ('ErrorCode', error_status_t), )
# 3.1.4.13 IWbemRemoteRefresher Interface # 3.1.4.13.1 IWbemRemoteRefresher::RemoteRefresh (Opnum 3) ('lFlags', LONG), )
('plNumObjects', _WBEM_RECONNECT_RESULTS_ARRAY), ('paObjects', PWBEM_REFRESHED_OBJECT_ARRAY), ('ErrorCode', error_status_t), )
# 3.1.4.13.2 IWbemRemoteRefresher::StopRefreshing (Opnum 4) ('lNumIds', LONG), ('aplIds', PULONG_ARRAY), ('lFlags', LONG), )
('ErrorCode', error_status_t), )
# 3.1.4.14 IWbemShutdown Interface # 3.1.4.14.1 IWbemShutdown::Shutdown (Opnum 3) ('reserved1', LONG), ('reserved2', ULONG), ('reserved3', PMInterfacePointer), )
('ErrorCode', error_status_t), )
# 3.1.4.15 IUnsecuredApartment Interface # 3.1.4.15.1 IUnsecuredApartment::CreateObjectStub (Opnum 3) ('reserved1', PMInterfacePointer), )
('reserved2', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.16 IWbemUnsecuredApartment Interface # 3.1.4.16.1 IWbemUnsecuredApartment::CreateSinkStub (Opnum 3) ('reserved1', PMInterfacePointer), ('reserved2', DWORD), ('reserved3', LPWSTR), )
('reserved4', PMInterfacePointer), ('ErrorCode', error_status_t), )
################################################################################ # OPNUMs and their corresponding structures ################################################################################ }
################################################################################ # HELPER FUNCTIONS AND INTERFACES ################################################################################
else: return string
else:
# Let's see if there's a key property so we can ExecMethod
LOG.error("I don't have a key property in this set!") else:
# Now we gotta build the class name to be called through ExecMethod instanceName = '%s.%s=%s' % ( self.getClassName(), keyProperty, self.getProperties()[keyProperty]['value']) else: self.getClassName(), keyProperty, self.getProperties()[keyProperty]['value'])
#print dir(self)
raise AttributeError("%r object has no attribute %r" % (self.__class__, attr))
return self.encodingUnit['ObjectBlock']
else:
return self.encodingUnit['ObjectBlock'].printInformation()
return ()
return ()
# So, in theory, we have the OBJCUSTOM built, but # we need to update the values # That's what we'll do
instanceHeap = b'' valueTable = b'' ndTable = 0 parametersClass = ENCODED_STRING() parametersClass['Character'] = self.getClassName() instanceHeap += parametersClass.getData() curHeapPtr = len(instanceHeap) properties = self.getProperties() for i, propName in enumerate(properties): propRecord = properties[propName] itemValue = getattr(self, propName) print("PropName %r, Value: %r" % (propName,itemValue))
pType = propRecord['type'] & (~(CIM_ARRAY_FLAG|Inherited)) if propRecord['type'] & CIM_ARRAY_FLAG: # Not yet ready packStr = HEAPREF[:-2] else: packStr = CIM_TYPES_REF[pType][:-2]
if propRecord['type'] & CIM_ARRAY_FLAG: if itemValue is None: valueTable += pack(packStr, 0) else: valueTable += pack('<L', curHeapPtr) arraySize = pack(HEAPREF[:-2], len(itemValue)) packStrArray = CIM_TYPES_REF[pType][:-2] arrayItems = b'' for j in range(len(itemValue)): arrayItems += pack(packStrArray, itemValue[j]) instanceHeap += arraySize + arrayItems curHeapPtr = len(instanceHeap) elif pType not in (CIM_TYPE_ENUM.CIM_TYPE_STRING.value, CIM_TYPE_ENUM.CIM_TYPE_DATETIME.value, CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value, CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value): if itemValue is None: valueTable += pack(packStr, -1) else: valueTable += pack(packStr, itemValue) elif pType == CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value: # For now we just pack None valueTable += b'\x00'*4 # The default property value is NULL, and it is # inherited from a parent class. if itemValue is None: ndTable |= 3 << (2*i) else: if itemValue is '': ndTable |= 1 << (2*i) valueTable += pack('<L', 0) else: strIn = ENCODED_STRING() strIn['Character'] = itemValue valueTable += pack('<L', curHeapPtr) instanceHeap += strIn.getData() curHeapPtr = len(instanceHeap)
ndTableLen = (len(properties) - 1) // 4 + 1 packedNdTable = b'' for i in range(ndTableLen): packedNdTable += pack('B', ndTable & 0xff) ndTable >>= 8
# Now let's update the structure objRef = self.get_objRef() objRef = OBJREF_CUSTOM(objRef) encodingUnit = ENCODING_UNIT(objRef['pObjectData'])
currentClass = encodingUnit['ObjectBlock']['InstanceType']['CurrentClass'] encodingUnit['ObjectBlock']['InstanceType']['CurrentClass'] = b''
encodingUnit['ObjectBlock']['InstanceType']['NdTable_ValueTable'] = packedNdTable + valueTable encodingUnit['ObjectBlock']['InstanceType']['InstanceHeap']['HeapLength'] = len(instanceHeap) | 0x80000000 encodingUnit['ObjectBlock']['InstanceType']['InstanceHeap']['HeapItem'] = instanceHeap
encodingUnit['ObjectBlock']['InstanceType']['EncodingLength'] = len(encodingUnit['ObjectBlock']['InstanceType']) encodingUnit['ObjectBlock']['InstanceType']['CurrentClass'] = currentClass
encodingUnit['ObjectEncodingLength'] = len(encodingUnit['ObjectBlock'])
#encodingUnit.dump() #ENCODING_UNIT(str(encodingUnit)).dump()
objRef['pObjectData'] = encodingUnit
return objRef
# Doing something similar to: # https://docs.microsoft.com/windows/desktop/api/wbemcli/nf-wbemcli-iwbemclassobject-spawninstance # if self.encodingUnit['ObjectBlock'].isInstance() is False: # We need to convert some things to transform a class into an instance encodingUnit = ENCODING_UNIT()
instanceData = OBJECT_BLOCK() instanceData.structure += OBJECT_BLOCK.decoration instanceData.structure += OBJECT_BLOCK.instanceType instanceData['ObjectFlags'] = 6 instanceData['Decoration'] = self.encodingUnit['ObjectBlock']['Decoration'].getData()
instanceType = INSTANCE_TYPE() instanceType['CurrentClass'] = b''
# Let's create the heap for the parameters instanceHeap = b'' valueTable = b'' parametersClass = ENCODED_STRING() parametersClass['Character'] = self.getClassName() instanceHeap += parametersClass.getData() curHeapPtr = len(instanceHeap)
ndTable = 0 properties = self.getProperties()
# Let's initialize the values for i, propName in enumerate(properties): propRecord = properties[propName]
pType = propRecord['type'] & (~(CIM_ARRAY_FLAG|Inherited)) if propRecord['type'] & CIM_ARRAY_FLAG: # Not yet ready #print paramDefinition #raise packStr = HEAPREF[:-2] else: packStr = CIM_TYPES_REF[pType][:-2]
if propRecord['type'] & CIM_ARRAY_FLAG: valueTable += pack(packStr, 0) elif pType not in (CIM_TYPE_ENUM.CIM_TYPE_STRING.value, CIM_TYPE_ENUM.CIM_TYPE_DATETIME.value, CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value, CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value): valueTable += pack(packStr, 0) elif pType == CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value: # For now we just pack None valueTable += b'\x00'*4 # The default property value is NULL, and it is # inherited from a parent class. ndTable |= 3 << (2*i) else: strIn = ENCODED_STRING() strIn['Character'] = '' valueTable += pack('<L', curHeapPtr) instanceHeap += strIn.getData() curHeapPtr = len(instanceHeap)
ndTableLen = (len(properties) - 1) // 4 + 1 packedNdTable = b'' for i in range(ndTableLen): packedNdTable += pack('B', ndTable & 0xff) ndTable >>= 8
instanceType['NdTable_ValueTable'] = packedNdTable + valueTable
instanceType['InstanceQualifierSet'] = b'\x04\x00\x00\x00\x01'
instanceType['InstanceHeap'] = HEAP() instanceType['InstanceHeap']['HeapItem'] = instanceHeap instanceType['InstanceHeap']['HeapLength'] = len(instanceHeap) | 0x80000000 instanceType['EncodingLength'] = len(instanceType)
instanceType['CurrentClass'] = self.encodingUnit['ObjectBlock']['ClassType']['CurrentClass']['ClassPart'] instanceData['InstanceType'] = instanceType.getData()
encodingUnit['ObjectBlock'] = instanceData encodingUnit['ObjectEncodingLength'] = len(instanceData)
#ENCODING_UNIT(str(encodingUnit)).dump()
objRefCustomIn = OBJREF_CUSTOM() objRefCustomIn['iid'] = self._iid objRefCustomIn['clsid'] = CLSID_WbemClassObject objRefCustomIn['cbExtension'] = 0 objRefCustomIn['ObjectReferenceSize'] = len(encodingUnit) objRefCustomIn['pObjectData'] = encodingUnit
# There's gotta be a better way to do this # I will reimplement this stuff once I know it works import copy newObj = copy.deepcopy(self) newObj.set_objRef(objRefCustomIn.getData()) newObj.process_interface(objRefCustomIn.getData()) newObj.encodingUnit = ENCODING_UNIT(encodingUnit.getData()) newObj.parseObject() if newObj.encodingUnit['ObjectBlock'].isInstance() is False: newObj.createMethods(newObj.getClassName(), newObj.getMethods()) else: newObj.createProperties(newObj.getProperties())
return newObj else: return self
# Do we have an object property? # Yes.. let's create an Object for it too objRef = OBJREF_CUSTOM() objRef['iid'] = self._iid objRef['clsid'] = CLSID_WbemClassObject objRef['cbExtension'] = 0 objRef['ObjectReferenceSize'] = len(properties[property]['value'].getData()) objRef['pObjectData'] = properties[property]['value'] value = IWbemClassObject( INTERFACE(self.get_cinstance(), objRef.getData(), self.get_ipidRemUnknown(), oxid=self.get_oxid(), target=self.get_target())) if isinstance(properties[property]['value'], list): value = list() for item in properties[property]['value']: # Yes.. let's create an Object for it too objRef = OBJREF_CUSTOM() objRef['iid'] = self._iid objRef['clsid'] = CLSID_WbemClassObject objRef['cbExtension'] = 0 objRef['ObjectReferenceSize'] = len(item.getData()) objRef['pObjectData'] = item wbemClass = IWbemClassObject( INTERFACE(self.get_cinstance(), objRef.getData(), self.get_ipidRemUnknown(), oxid=self.get_oxid(), target=self.get_target())) value.append(wbemClass) else: value = properties[property]['value'] else:
def innerMethod(staticArgs, *args): LOG.error("Function called with %d parameters instead of %d!" % (len(args), len(methodDefinition['InParams']))) return None # In Params
# Let's create the heap for the parameters
# Not yet ready #print paramDefinition #raise packStr = HEAPREF[:-2] else:
if inArg is None: valueTable += pack(packStr, 0) else: # ToDo # Not yet ready raise Exception('inArg not None') CIM_TYPE_ENUM.CIM_TYPE_REFERENCE.value, CIM_TYPE_ENUM.CIM_TYPE_OBJECT.value): # For now we just pack None # The default property value is NULL, and it is # inherited from a parent class. else: # The Encoded-String-Flag is set to 0x01 if the sequence of characters that follows # consists of UTF-16 characters (as specified in [UNICODE]) followed by a UTF-16 null # terminator. else: strIn['Character'] = inArg
methodDefinition['InParamsRaw']['ClassType']['CurrentClass']['ClassPart'].getData())
else: objRefCustomIn = NULL
### OutParams
#return self.__iWbemServices.ExecMethod('Win32_Process.Handle="436"', methodDefinition['name'], # pInParams=objRefCustomIn).getObject().ctCurrent['properties'] except Exception as e: if LOG.level == logging.DEBUG: import traceback traceback.print_exc() LOG.error(str(e))
#methods = self.encodingUnit['ObjectBlock']
IRemUnknown.__init__(self,interface) self._iid = IID_IWbemLoginClientID
request = IWbemLoginClientID_SetClientInfo() request['wszClientMachine'] = checkNullString(wszClientMachine) request['lClientProcId'] = lClientProcId request['lReserved'] = 0 resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return resp
IRemUnknown.__init__(self,interface) self._iid = IID_IWbemLoginHelper
request = IWbemLoginHelper_SetEvent() request['sEventToSet'] = sEventToSet resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
IRemUnknown.__init__(self,interface) self._iid = IID_IWbemWCOSmartEnum
request = IWbemWCOSmartEnum_Next() request['proxyGUID'] = proxyGUID request['lTimeout'] = lTimeout request['uCount'] = uCount resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
IRemUnknown.__init__(self,interface) self._iid = IID_IWbemFetchSmartEnum
request = IWbemFetchSmartEnum_GetSmartEnum() resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemCallResult_GetResultObject() request['lTimeout'] = lTimeout resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemCallResult_GetResultString() request['lTimeout'] = lTimeout resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemCallResult_GetResultServices() request['lTimeout'] = lTimeout resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemCallResult_GetCallStatus() request['lTimeout'] = lTimeout resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return resp['plStatus']
request = IEnumWbemClassObject_Reset() resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
INTERFACE(self.get_cinstance(), b''.join(interface['abData']), self.get_ipidRemUnknown(), oxid=self.get_oxid(), target=self.get_target()), self.__iWbemServices))
request = IEnumWbemClassObject_NextAsync() request['lTimeout'] = lTimeout request['pSink'] = pSink resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IEnumWbemClassObject_Clone() resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IEnumWbemClassObject_Skip() request['lTimeout'] = lTimeout request['uCount'] = uCount resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_OpenNamespace() request['strNamespace']['asData'] = strNamespace request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_CancelAsyncCall() request['IWbemObjectSink'] = IWbemObjectSink resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return resp['ErrorCode']
request = IWbemServices_QueryObjectSink() request['lFlags'] = 0 resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return INTERFACE(self.get_cinstance(), b''.join(resp['ppResponseHandler']['abData']), self.get_ipidRemUnknown(), target=self.get_target())
INTERFACE(self.get_cinstance(), b''.join(resp['ppObject']['abData']), self.get_ipidRemUnknown(), oxid=self.get_oxid(), target=self.get_target()), self) INTERFACE(self.get_cinstance(), b''.join(resp['ppObject']['abData']), self.get_ipidRemUnknown(), target=self.get_target())) else: ppcallResult = NULL
request = IWbemServices_GetObjectAsync() request['strObjectPath']['asData'] = checkNullString(strNamespace) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_PutClass() request['pObject'] = pObject request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_PutClassAsync() request['pObject'] = pObject request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_DeleteClass() request['strClass']['asData'] = checkNullString(strClass) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_DeleteClassAsync() request['strClass']['asData'] = checkNullString(strClass) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_CreateClassEnum() request['strSuperClass']['asData'] = checkNullString(strSuperClass) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_CreateClassEnumAsync() request['strSuperClass']['asData'] = checkNullString(strSuperClass) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_PutInstance()
if pInst is NULL: request['pInst'] = pInst else: request['pInst']['ulCntData'] = len(pInst) request['pInst']['abData'] = list(pInst.getData()) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return IWbemCallResult( INTERFACE(self.get_cinstance(), b''.join(resp['ppCallResult']['abData']), self.get_ipidRemUnknown(), target=self.get_target()))
request = IWbemServices_PutInstanceAsync() request['pInst'] = pInst request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_DeleteInstance() request['strObjectPath']['asData'] = checkNullString(strObjectPath) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return IWbemCallResult( INTERFACE(self.get_cinstance(), b''.join(resp['ppCallResult']['abData']), self.get_ipidRemUnknown(), target=self.get_target()))
request = IWbemServices_DeleteInstanceAsync() request['strObjectPath']['asData'] = checkNullString(strObjectPath) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_CreateInstanceEnum() request['strSuperClass']['asData'] = strSuperClass request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return IEnumWbemClassObject( INTERFACE(self.get_cinstance(), b''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target=self.get_target()))
request = IWbemServices_CreateInstanceEnumAsync() request['strSuperClass']['asData'] = checkNullString(strSuperClass) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
#def ExecQuery(self, strQuery, lFlags=WBEM_QUERY_FLAG_TYPE.WBEM_FLAG_PROTOTYPE, pCtx=NULL): INTERFACE(self.get_cinstance(), b''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target=self.get_target()), self)
request = IWbemServices_ExecQueryAsync() request['strQueryLanguage']['asData'] = checkNullString('WQL') request['strQuery']['asData'] = checkNullString(strQuery) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request = IWbemServices_ExecNotificationQuery() request['strQueryLanguage']['asData'] = checkNullString('WQL') request['strQuery']['asData'] = checkNullString(strQuery) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) return IEnumWbemClassObject( INTERFACE(self.get_cinstance(), b''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target=self.get_target()), self)
request = IWbemServices_ExecNotificationQueryAsync() request['strQueryLanguage']['asData'] = checkNullString('WQL') request['strQuery']['asData'] = checkNullString(strQuery) request['lFlags'] = lFlags request['pCtx'] = pCtx resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
request['pInParams'] = pInParams else:
else: request['ppOutParams']['ulCntData'] = len(ppOutParams.getData()) request['ppOutParams']['abData'] = list(ppOutParams.getData()) INTERFACE(self.get_cinstance(), b''.join(resp['ppOutParams']['abData']), self.get_ipidRemUnknown(), oxid=self.get_oxid(), target=self.get_target()))
request = IWbemServices_ExecMethodAsync() request['strObjectPath']['asData'] = checkNullString(strObjectPath) request['strMethodName']['asData'] = checkNullString(strMethodName) request['lFlags'] = lFlags request['pCtx'] = pCtx request['pInParams'] = pInParams resp = self.request(request, iid = self._iid, uuid = self.get_iPid()) resp.dump() return resp
return resp['reserved3']
return resp['reserved5']
INTERFACE(self.get_cinstance(), b''.join(resp['ppNamespace']['abData']), self.get_ipidRemUnknown(), target=self.get_target()))
# Example 1 baseClass = b'xV4\x12\xd0\x00\x00\x00\x05\x00DPRAVAT-DEV\x00\x00ROOT\x00\x1d\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80f\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x05\xff\xff\xff\xff<\x00\x00\x80\x00Base\x00\x00Id\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x004\x00\x00\x00\x01\x00\x00\x80\x13\x0b\x00\x00\x00\xff\xff\x00sint32\x00\x0c\x00\x00\x00\x00\x004\x00\x00\x00\x00\x80\x00\x80\x13\x0b\x00\x00\x00\xff\xff\x00sint32\x00'
#encodingUnit = ENCODING_UNIT(baseClass) #encodingUnit.dump() #encodingUnit['ObjectBlock'].printInformation() #print "LEN ", len(baseClass), len(encodingUnit)
#myClass = b"xV4\x12.\x02\x00\x00\x05\x00DPRAVAT-DEV\x00\x00ROOT\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\n\x00\x00\x00\x05\xff\xff\xff\xff<\x00\x00\x80\x00Base\x00\x00Id\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x004\x00\x00\x00\x01\x00\x00\x80\x13\x0b\x00\x00\x00\xff\xff\x00sint32\x00\x0c\x00\x00\x00\x00\x004\x00\x00\x00\x00\x80v\x01\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x0e\x00\x00\x00\x00Base\x00\x06\x00\x00\x00\x11\x00\x00\x00\t\x00\x00\x00\x00\x08\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00'\x00\x00\x00.\x00\x00\x00U\x00\x00\x00\\\x00\x00\x00\x99\x00\x00\x00\xa0\x00\x00\x00\xc7\x00\x00\x00\xcb\x00\x00\x00G\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x00\x00\x00\xff\xff\xff\xff\x11\x01\x00\x80\x00MyClass\x00\x00Description\x00\x00MyClass Example\x00\x00Array\x00\x13 \x00\x00\x03\x00\x0c\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00M\x00\x00\x00\x00uint32\x00\x00Data1\x00\x08\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00'\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00\x91\x00\x00\x00\x03\x00\x00\x80\x00\x0b\x00\x00\x00\xff\xff\x04\x00\x00\x80\x00\x0b\x00\x00\x00\xff\xff\x00string\x00\x00Data2\x00\x08\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00\xbf\x00\x00\x00\x00string\x00\x00Id\x00\x03@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\n\x00\x00\x80#\x08\x00\x00\x00\xf5\x00\x00\x00\x01\x00\x00\x803\x0b\x00\x00\x00\xff\xff\x00sint32\x00\x00defaultValue\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00s\x00\x00\x00\x802\x00\x00defaultValue\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00" #hexdump(myClass) #encodingUnit = ENCODING_UNIT(myClass) #print "LEN ", len(myClass), len(encodingUnit) #encodingUnit.dump() #encodingUnit['ObjectBlock'].printInformation()
#instanceMyClass = b"xV4\x12\xd3\x01\x00\x00\x06\x00DPRAVAT-DEV\x00\x00ROOT\x00v\x01\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x0e\x00\x00\x00\x00Base\x00\x06\x00\x00\x00\x11\x00\x00\x00\t\x00\x00\x00\x00\x08\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00'\x00\x00\x00.\x00\x00\x00U\x00\x00\x00\\\x00\x00\x00\x99\x00\x00\x00\xa0\x00\x00\x00\xc7\x00\x00\x00\xcb\x00\x00\x00G\xff\xff\xff\xff\xff\xff\xff\xff\xfd\x00\x00\x00\xff\xff\xff\xff\x11\x01\x00\x80\x00MyClass\x00\x00Description\x00\x00MyClass Example\x00\x00Array\x00\x13 \x00\x00\x03\x00\x0c\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00M\x00\x00\x00\x00uint32\x00\x00Data1\x00\x08\x00\x00\x00\x01\x00\x04\x00\x00\x00\x01\x00\x00\x00'\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00\x91\x00\x00\x00\x03\x00\x00\x80\x00\x0b\x00\x00\x00\xff\xff\x04\x00\x00\x80\x00\x0b\x00\x00\x00\xff\xff\x00string\x00\x00Data2\x00\x08\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\n\x00\x00\x80\x03\x08\x00\x00\x00\xbf\x00\x00\x00\x00string\x00\x00Id\x00\x03@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\n\x00\x00\x80#\x08\x00\x00\x00\xf5\x00\x00\x00\x01\x00\x00\x803\x0b\x00\x00\x00\xff\xff\x00sint32\x00\x00defaultValue\x00\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00\x00 {\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x04\x00\x00\x00\x01&\x00\x00\x80\x00MyClass\x00\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x00StringField\x00" #encodingUnit = ENCODING_UNIT(instanceMyClass) #encodingUnit.dump() #encodingUnit['ObjectBlock'].printInformation() |