def processClassComp(self, descCmp): classCount = 0 start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print(' tag, ' + infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' size, ' + "0x" + size) start += length length = 4 sigLength = (int)(Util.convertDataToPrint(self.binData, start, length)) print(' signature pool length, ', sigLength) while ((sigLength) > 0): #define when package defines any remote interfaces or remote classes. start, length = self.typeDescriptor(start, length) sigLength -= 1 #get class count from descriptor component while (classCount < descCmp.getClassCount()): print(' class, ', classCount + 1) start, length = self.interfaceClassInfo(start, length) classCount += 1 print(' ')
def processMethodComp(self, cpCmp, prnt): start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) Util.printOnConsole((' tag, ' + infTag), prnt) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) Util.printOnConsole((' size, ' + "0x" + size), prnt) start += length length = 2 hndlrCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) Util.printOnConsole( (' exception handlers count, ' + str(hndlrCount)), prnt) while ((hndlrCount) > 0): start, length = self.processExceptionHandlerInfo( cpCmp, start, length, prnt) hndlrCount -= 1 byteCodeCount = (int)(size, 16) - (start) start, length = self.parseMethodInfo(start, length, byteCodeCount, prnt)
def processClassExportInfo(self, start, length): start += length length = 4 classOffset = Util.convertDataToPrint(self.binData, start, length) print(' class_offset, ', classOffset) start += length length = 2 static_field_count = (int)(Util.convertDataToPrint( self.binData, start, length), 16) print(' static_field_count, ', static_field_count) start += length length = 2 static_method_count = (int)(Util.convertDataToPrint( self.binData, start, length), 16) print(' static_method_count, ', static_method_count) index = 0 while index < static_field_count: start += length length = 4 static_field_offsets = Util.convertDataToPrint( self.binData, start, length) print(' static_field_offsets, ', static_field_offsets) index = 0 while index < static_method_count: start += length length = 4 static_method_offsets = Util.convertDataToPrint( self.binData, start, length) print(' static_method_offsets, ', static_method_offsets) return start, length
def processPackageInfo(self, binData, start, length): start += length length = 2 minVrsn = Util.convertDataToPrint(binData, start, length) start += length length = 2 majVrsn = Util.convertDataToPrint(binData, start, length) print(' package version ', majVrsn + '.' + minVrsn) start += length length = 2 aidLength = (int)(Util.convertDataToPrint(binData, start, length), 16) print(' package aid length, ', aidLength) aid = '' index = 0 while index < aidLength: start += length length = 2 aid += '0x' + Util.convertDataToPrint(binData, start, length) + ':' index += 1 print(' package aid ' + aid) return start, length
def customComponentInfo(self, start, length): start += length length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print(' custom component tag, ' + infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' custom component size, ' + "0x" + size) start += length length = 2 aidLength = Util.convertDataToPrint(self.binData, start, length) print(' custom component aid length, ' + "0x" + aidLength) aid = '' for item in range((int)(aidLength, 16)): start += length length = 2 aid += '0x' + Util.convertDataToPrint(self.binData, start, length) + ':' print(' custom component aid ' + aid) return start, length
def processIntegerInfo(self, binData, start, length): infTag = Util.convertDataToPrint(binData, start, length) print(' tag, ' + infTag) start += length length = 8 value = Util.convertDataToPrint(binData, start, length) print(' bytes, ' + value) return start, length
def processClassRefInfo(self, binData, start, length): infTag = Util.convertDataToPrint(binData, start, length) print(' tag, ' + infTag) start += length length = 4 nameIndex = Util.convertDataToPrint(binData, start, length) print(' name index into the constant_pool table, ' + nameIndex) return start, length
def processDescriptorInfo(self, binData, start, length, prnt): start += length length = 2 accessFlag = (int)(Util.convertDataToPrint( binData, start, length), 16) if (0x01 == accessFlag): Util.printOnConsole((' Field is Public '), prnt) if (0x02 == accessFlag): Util.printOnConsole((' Field is Private '), prnt) if (0x04 == accessFlag): Util.printOnConsole((' Field is Protected '), prnt) if (0x08 == accessFlag): Util.printOnConsole((' Field is Static '), prnt) if (0x10 == accessFlag): Util.printOnConsole((' Field is Final '), prnt) if (0x08 == accessFlag): start, length = ConstantPoolComp().staticFieldRefInfo( binData, start, length, prnt) else: start, length = ConstantPoolComp().classRefProcess( binData, start, length, prnt) start += length length = 2 token = (int)(Util.convertDataToPrint( binData, start, length), 16) Util.printOnConsole(( ' Token of the class which declares this field ' + str(token)), prnt) start += length length = 4 dataType = (int)(Util.convertDataToPrint( binData, start, length), 16) if ((dataType & 0x8000) == 0x8000): if (0x0002 == (dataType & 0x000F)): Util.printOnConsole( (' The field type is boolean'), prnt) if (0x0003 == (dataType & 0x000F)): Util.printOnConsole((' The field type is byte'), prnt) if (0x0004 == (dataType & 0x000F)): Util.printOnConsole( (' The field type is short'), prnt) if (0x0005 == (dataType & 0x000F)): Util.printOnConsole((' The field type is int'), prnt) else: Util.printOnConsole(( ' The field type is reference and the offset into type descriptor info ' + str((dataType & 0x7FFF))), prnt) return start, length, self
def itableswitch(self, index, byteCode, start, prnt): Util.printOnConsole((' '+ self.ByteCodeTable[byteCode]), prnt) start += 2 length = 4 start += length length = 8 low = (int)(Util.convertDataToPrint(self.binData, start, length), 16) start += length length = 8 high = (int)(Util.convertDataToPrint(self.binData, start, length), 16) arrsize = high - low + 1; return (11 + (arrsize*2))
def typeDescriptor(self, start, length): start += length length = 2 nibbleCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) indx = 0 while (indx < ((nibbleCount + 1) / 2)): start += length length = 1 typeNibble = (int)(Util.convertDataToPrint(self.binData, start, length), 16) if (0x1 == typeNibble): print(' The type is void') if (0x2 == typeNibble): print(' The type is boolean') if (0x3 == typeNibble): print(' The type is byte') if (0x4 == typeNibble): print(' The type is short') if (0x5 == typeNibble): print(' The type is int') if (0x6 == typeNibble): print(' The type is reference') start, length = ConstantPoolComp().classRefProcess( self.binData, start, length, 'printOnConsole') #padding start += length if (0xA == typeNibble): print(' The type is array of boolean') if (0xB == typeNibble): print(' The type is array of byte') #padding start += length if (0xC == typeNibble): print(' The type is array of short') if (0xD == typeNibble): print(' The type is array of int') if (0xE == typeNibble): print(' The type is array of reference') start, length = ConstantPoolComp().classRefProcess( self.binData, start, length, 'printOnConsole') #padding start += length return start, length
def parseTheInfoForTheGivenIndex(self, index, prnt): start = self.constantPoolTable[index] length = 2 tag = Util.convertDataToPrint(self.binData, start, length) if (tag == '01'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_ClassRefInfo '), prnt) return self.classRefInfo(start, length, prnt) elif (tag == '02'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_InstanceFieldRefInfo '), prnt) return self.instanceFieldRefInfo(start, length, prnt) elif (tag == '03'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_VirtualMethodRefInfo '), prnt) return self.virtualMethoddRefInfo(start, length, prnt) elif (tag == '04'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_SuperMethodRefInfo '), prnt) return self.superMethoddRefInfo(start, length, prnt) elif (tag == '05'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_StaticFieldRefInfo '), prnt) return self.staticFieldRefInfo(self.binData, start, length, prnt) elif (tag == '06'): Util.printOnConsole((' tag ' + tag), prnt) Util.printOnConsole((' CONSTANT_StaticMethodRefInfo '), prnt) return self.staticMethodRefInfo(start, length, prnt)
def arrayInitValues(self, start, length, valueSize): start += length length = 4 count = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' count, ', count) index = 0 print(' initial values of the array, ') while (index < count): start += length length = valueSize value = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' ', value) index += 1 return start, length
def processExceptionHandlerInfo(self, cpCmp, start, length, prnt): start += length length = 4 startOffset = (int)(Util.convertDataToPrint(self.binData, start, length), 16) Util.printOnConsole( (' start offset (beginning of the try block), ' + str(startOffset)), prnt) start += length length = 4 bitField = (int)(Util.convertDataToPrint(self.binData, start, length), 16) stopBit = ((bitField & 0x8000) == 0x8000) if (stopBit): Util.printOnConsole((' stop bit is high'), prnt) else: Util.printOnConsole((' stop bit is low'), prnt) activeLength = (bitField & 0x7FFF) Util.printOnConsole( (' active length of the handler block, ' + str(activeLength)), prnt) start += length length = 4 handlerOffset = (int)(Util.convertDataToPrint(self.binData, start, length), 16) Util.printOnConsole(( ' handler offset in the method component (catch/finally block), ' + str(handlerOffset)), prnt) start += length length = 4 catchTypeIndex = (int)(Util.convertDataToPrint(self.binData, start, length), 16) Util.printOnConsole((' catch type index, ' + str(catchTypeIndex)), prnt) if (catchTypeIndex): Util.printOnConsole(( ' class info of the exception class caught by the exception handler, ' ), prnt) cpCmp.parseTheInfoForTheGivenIndex(catchTypeIndex) return start, length
def processUtf8Info(self, binData, start, length): infTag = Util.convertDataToPrint(binData, start, length) print(' tag, ' + infTag) start += length length = 4 byteLenth = Util.convertDataToPrint(binData, start, length) print(' string length, ' + byteLenth) nameBytes = '' for item in range((int)(byteLenth, 16)): start += length length = 2 nameBytes += chr( int(Util.convertDataToPrint(binData, start, length), 16)) print(' string, ' + nameBytes) return start, length
def processStaticFieldComp(self): start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print(' tag, ' + infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' size, ' + "0x" + size) start += length length = 4 imageSize = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' image_size, ', imageSize) start += length length = 4 refCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' reference_count, ', refCount) start += length length = 4 arrayInitCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' array_init_count, ', arrayInitCount) index = 0 while index < arrayInitCount: start, length = self.arrayInitInfo(start, length) index += 1 start += length length = 4 defaultValueCount = (int)(Util.convertDataToPrint( self.binData, start, length), 16) print(' default_value_count, ', defaultValueCount) start += length length = 4 nonDefaultValueCount = (int)(Util.convertDataToPrint( self.binData, start, length), 16) print(' non_default_value_count, ', nonDefaultValueCount) index = 0 print(' non-default values of the array, ') while index < nonDefaultValueCount: start += length length = 2 value = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' ', value) index += 1
def processUTF8Info(self, start, length): start += length length = 4 string_length = (int)(Util.convertDataToPrint(self.binData, start, length), 16) #print(' string length, ',string_length) name = '' index = 0 while index < string_length: start += length length = 2 name += chr( int(Util.convertDataToPrint(self.binData, start, length), 16)) index += 1 print(' ' + name) return start, length
def processPackageNameInfo(self, start, length): start += length length = 2 nameLength = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' package name length ', nameLength) name = '' index = 0 while index < nameLength: start += length length = 2 name += chr( int(Util.convertDataToPrint(self.binData, start, length), 16)) index += 1 print(' package name ' + name) return start, length
def classRefProcess(self, binData, start, length, prnt): start += length length = 4 classRef = Util.convertDataToPrint(binData, start, length) extrnalRef = ((int(Util.convertDataToPrint(binData, start, 2), 16) & 0x80) == 0x80) if (extrnalRef): packageToken = Util.convertDataToPrint(classRef, 0, 2) Util.printOnConsole( (' Package Token: ' + packageToken), prnt) classToken = Util.convertDataToPrint(classRef, 2, 2) Util.printOnConsole((' Class Token: ' + classToken), prnt) else: Util.printOnConsole( (' Internal Class Ref: ' + classRef), prnt) return start, length
def classRefInfo(self, start, length, prnt): start, length = self.classRefProcess(self.binData, start, length, prnt) start += length length = 2 padding = Util.convertDataToPrint(self.binData, start, length) Util.printOnConsole((' padding ' + padding), prnt) return start, length
def processAppletComp(self): start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print (' tag, '+infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' size, '+"0x"+size) start += length length = 2 count = Util.convertDataToPrint(self.binData, start, length) print(' count, ', count) for item in range((int)(count, 16)): start, length = self.processAppletsInfo(start, length)
def parseMethodInfo(self, start, length, byteCodeCount, prnt): start += length length = 2 bitField = (int)(Util.convertDataToPrint(self.binData, start, length), 16) flags = ((bitField & 0xF0) >> 4) if (0x08 == flags): Util.printOnConsole((' Method is extended method'), prnt) elif (0x04 == flags): Util.printOnConsole((' Method is abstract method'), prnt) maxStack = (bitField & 0x0F) Util.printOnConsole( (' Max stack required for the execution of this method, ' + str(maxStack)), prnt) start += length length = 2 bitField = (int)(Util.convertDataToPrint(self.binData, start, length), 16) nargs = ((bitField & 0xF0) >> 4) Util.printOnConsole(( ' Number of arguments including this pointer for virtual methods, ' + str(nargs)), prnt) maxLocals = (bitField & 0x0F) Util.printOnConsole( (' Number of locals declared by this method, ' + str(maxLocals)), prnt) Util.printOnConsole((' ByteCode, '), prnt) indx = 0 start += length while (indx < byteCodeCount): length = 2 byteCode = (int)(Util.convertDataToPrint(self.binData, start, length), 16) #print(' ', self.byteCodeTable[byteCode]) byteCodeLength = self.byteCode.execByteCode( byteCode, indx, start, prnt) indx += byteCodeLength start += byteCodeLength * 2 return start, length
def processFieldInfo(self, binData, start, length, exportFieldsCount): for item in range((int)(exportFieldsCount, 16)): start += length length = 2 token = Util.convertDataToPrint(binData, start, length) print(' Field token ', token) start += length length = 4 accessFlag = (int)(Util.convertDataToPrint(binData, start, length), 16) print(' access_flag ', accessFlag) if ((accessFlag & 0x0001) == 0x0001): print(' access modifier of the field is - public') if ((accessFlag & 0x0004) == 0x0004): print( ' access modifier of the field is - protected') if ((accessFlag & 0x0008) == 0x0008): print(' access modifier of the field is - static') if ((accessFlag & 0x0010) == 0x0010): print(' access modifier of the field is - final') start += length length = 4 nameIndex = Util.convertDataToPrint(binData, start, length) print(' name index into the constant_pool table, ' + nameIndex) start += length length = 4 descriptorIndex = Util.convertDataToPrint(binData, start, length) print(' descriptor index into the constant_pool table, ', descriptorIndex) start += length length = 4 attributesCount = Util.convertDataToPrint(binData, start, length) print(' number of additional attributes of this field, ', attributesCount) start, length = self.processAttributesinfo(binData, start, length, attributesCount) return start, length
def ilookupswitch(self, index, byteCode, start, prnt): Util.printOnConsole((' '+ self.ByteCodeTable[byteCode]), prnt) start += 2 length = 4 start += length length = 4 npairs = (int)(Util.convertDataToPrint(self.binData, start, length), 16) return (5 + (npairs*6))
def superMethoddRefInfo(self, start, length, prnt): start, length = self.classRefProcess(self.binData, start, length, prnt) start += length length = 2 token = Util.convertDataToPrint(self.binData, start, length) Util.printOnConsole((' super method token, ' + token), prnt) return start, length
def instanceFieldRefInfo(self, start, length, prnt): start, length = self.classRefProcess(self.binData, start, length, prnt) start += length length = 2 token = Util.convertDataToPrint(self.binData, start, length) Util.printOnConsole((' instance field token, ' + token), prnt) return start, length
def processAppletsInfo(self, start, length): start += length length = 2 aidLength = Util.convertDataToPrint(self.binData, start, length) print(' applet aid length, '+"0x"+aidLength) aid='' for item in range((int)(aidLength, 16)): start += length length = 2 aid += '0x' + Util.convertDataToPrint(self.binData, start, length) + ':' print(' applet aid - '+ aid) start += length length = 4 offset = Util.convertDataToPrint(self.binData, start, length) print(' install method offset into the info item of the Method Component, ', offset) return start, length
def processDebugComp(self): start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print(' tag, ' + infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' size, ' + "0x" + size) start += length length = 4 string_count = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' string_count, ', string_count) index = 0 while (index < string_count): start, length = self.processUTF8Info(start, length) index += 1
def processTypeDescriptorInfo(self, start, length, prnt): start += length length = 4 constantPoolCount = (int)(Util.convertDataToPrint( self.binData, start, length), 16) Util.printOnConsole( (' Number of entries in the constant pool table, ' + str(constantPoolCount)), prnt) indx = 0 while (indx < constantPoolCount): start += length length = 4 constantPoolType = (int)(Util.convertDataToPrint( self.binData, start, length), 16) Util.printOnConsole((' Type of the field or method, ' + str(constantPoolType)), prnt) indx += 1 Util.printOnConsole((' '), prnt) return start, length
def processExportComp(self): start = 0 length = 2 infTag = Util.convertDataToPrint(self.binData, start, length) print(' tag, ' + infTag) start += length length = 4 size = Util.convertDataToPrint(self.binData, start, length) print(' size, ' + "0x" + size) start += length length = 2 class_count = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' class_count, ', class_count) index = 0 while (index < class_count): start, length = self.processClassExportInfo(start, length) index += 1
def processAttributesinfo(self, binData, start, length, attributesCount): for item in range((int)(attributesCount, 16)): start += length length = 4 attributeIndex = Util.convertDataToPrint(binData, start, length) print(' attribute index into the constant_pool table, ', attributeIndex) start += length length = 8 attributeLength = Util.convertDataToPrint(binData, start, length) print(' attribute_length ', attributeLength) start += length length = 4 constantVlaueIndex = Util.convertDataToPrint( binData, start, length) print(' constantvlaue index into the constant_pool table ', constantVlaueIndex) return start, length