def readInfo(self, reader:ClassReader): self.maxStack = reader.readUint16() self.maxLocals = reader.readUint16() codeLength = struct.unpack('>I',reader.readUint32())[0] self.code = reader.readBytes(codeLength) self.exceptionTable = readExceptionTable(reader) self.attributes = readAttributes(reader, self.cp)
def readAttribute(reader:ClassReader, cp:ConstantPool) -> AttributeInfo: attrNameIndex = reader.readUint16() attrName = cp.getUtf8(attrNameIndex) attrLen = struct.unpack('>I',reader.readUint32())[0] attrInfo = newAttributeInfo(attrName, attrLen, cp) attrInfo.readInfo(reader) return attrInfo
def readInfo(self, reader:ClassReader): lineNumberTableLength = reader.readUint16() self.lineNumberTable = [] for i in range(lineNumberTableLength): self.lineNumberTable.append(LineNumberTableEntry( startPc = reader.readUint16(), lineNumber = reader.readUint16()))
def readExceptionTable(reader:ClassReader) -> List[ExceptionTableEntry]: exceptionTableLength = reader.readUint16() exceptionTable = [] for i in range(exceptionTableLength): exceptionTable.append(ExceptionTableEntry( startPc = reader.readUint16(), endPc = reader.readUint16(), handlerPc = reader.readUint16(), catchType = reader.readUint16())) return exceptionTable
def read(self, reader: ClassReader): self.readAndCheckMagic(reader) self.readAndCheckVersion(reader) self.constantPool = readConstantPool(reader) self.accessFlags = reader.readUint16() self.thisClass = reader.readUint16() self.superClass = reader.readUint16() self.interfaces = reader.readUint16s() self.fields = readMembers(reader, self.constantPool) self.methods = readMembers(reader, self.constantPool) self.attributes = readAttributes(reader, self.constantPool)
def Parse(classData: bytes): try: cr = ClassReader(classData) cf = ClassFile() cf.read(cr) except ValueError as err: print(sys.exc_info()) return None, err return cf, None
def readConstantPool(reader: ClassReader) -> ConstantPool: cpCount = reader.readUint16() cp = ConstantPool([None] * cpCount) i = 1 while i < cpCount: cp[i] = readConstantInfo(reader, cp) if (isinstance(cp[i], ConstantLongInfo) or isinstance(cp[i], ConstantDoubleInfo)): i += 1 i += 1 return cp
def readMember(reader: ClassReader, cp) -> MemberInfo: return MemberInfo(cp, reader.readUint16(), reader.readUint16(), reader.readUint16(), readAttributes(reader, cp))
def readMembers(reader: ClassReader, cp) -> List[MemberInfo]: memberCount = reader.readUint16() members = [] for i in range(memberCount): members.append(readMember(reader, cp)) return members
def readConstantInfo(reader: ClassReader, cp) -> ConstantInfo: tag = reader.readUint8() c = newConstantInfo(tag, cp) c.readInfo(reader) return c
def readInfo(self,reader:ClassReader): self.classIndex = reader.readUint16() self.nameAndTypeIndex = reader.readUint16()
def readInfo(self,reader:ClassReader): self.nameIndex = reader.readUint16() self.descriptorIndex = reader.readUint16()
def readInfo(self,reader:ClassReader): self.stringIndex = reader.readUint16()
def readInfo(self,reader:ClassReader): length = reader.readUint16() bts = reader.readBytes(length) self.str = bts.decode('utf-8')
def readInfo(self,reader:ClassReader): bts = reader.readUint64() self.val = struct.unpack('>d',bts)[0]
def readAttributes(reader:ClassReader, cp:ConstantPool) -> List[AttributeInfo]: attributesCount = reader.readUint16() attributes = [] for i in range(attributesCount): attributes.append(readAttribute(reader, cp)) return attributes
def readInfo(self, reader:ClassReader): self.info = reader.readBytes(self.length)
def readInfo(self, reader:ClassReader): self.exceptionIndexTable = reader.readUint16s()
def readInfo(self, reader:ClassReader): self.sourceFileIndex = reader.readUint16()
def readInfo(self, reader:ClassReader): self.constantValueIndex = reader.readUint16()