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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 parse(self): dao = Dao() sql = "select id , href from tb_cinfo" res = dao.executeQuerySql(sql) for r in res: cinfoId = r[0] cinfoHref = r[1] soup = Util.urlToSoup(cinfoHref) #获取上层歌单的描述信息 cinfoDesc = soup.select("#intro")[0].get_text() sql = 'insert ignore into tb_cinfo (descri) values ("%s")' % ( cinfoDesc) dao.executeSql(sql) #获取歌曲的信息 musicList = soup.find(id="musicList") lis = musicList.select("li") for li in lis: li.select("p") musicName = li.select("p[class=m_name]")[0].select("a")[0].get( "title") songer = li.select("p[class=s_name]")[0].select("a")[0].get( "title") al = li.select("p[class=a_name]")[0].select("a") if al.__len__() == 0: album = None else: album = li.select("p[class=a_name]")[0].select("a")[0].get( "title") musicHref = li.select("p[class=m_name]")[0].select("a")[0].get( "href") musicId = musicHref[26:-1] mp3Url = Util.idToMp3Url(int(musicId)) #插入歌曲信息 sql = 'insert ignore into tb_music (id,name,songer,album,href,mp3) values(%d,"%s","%s","%s","%s","%s")' % ( int(musicId), musicName, songer, album, musicHref, mp3Url) #插入歌曲与cinfo关联信息 sql1 = 'insert ignore into cinfo_music (cinfo_id,music_id) values (%d,%d)' % ( int(cinfoId), int(musicId)) dao.executeSql(sql) dao.executeSql(sql1) print( "id=%d,name=%s,songer=%s, album=%s, cinfoHref=%s musicHref=%s, mp3=%s" % (int(musicId), musicName, songer, album, cinfoHref, musicHref, mp3Url))
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 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 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 staticFieldSizeInfo(self, start, length): start += length length = 4 image_size = Util.convertDataToPrint(self.binData, start, length) print(' static field image size ', image_size) start += length length = 4 array_init_count = Util.convertDataToPrint(self.binData, start, length) print( ' number of arrays initialized in all of the constructors in this package ', array_init_count) start += length length = 4 array_init_size = Util.convertDataToPrint(self.binData, start, length) print( ' total number of bytes in all of the arrays initialized ', array_init_size) return start, length
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
def processMethodInfo(self, binData, start, length, exportMethodsCount): for item in range((int)(exportMethodsCount, 16)): start += length length = 2 token = Util.convertDataToPrint(binData, start, length) print(' Method 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 method is - public') if ((accessFlag & 0x0004) == 0x0004): print( ' access modifier of the method is - protected' ) if ((accessFlag & 0x0008) == 0x0008): print(' access modifier of the method is - static') if ((accessFlag & 0x0010) == 0x0010): print(' access modifier of the method is - final') if ((accessFlag & 0x0400) == 0x0400): print( ' access modifier of the method is - abstract') 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) return start, length
def processReferenceLocationComp(self, cpComp, mtComp): 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 byteIndexCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' byte_index_count, ', byteIndexCount) index = 0 offsetinMethodInfo = 0 while index < byteIndexCount: start += length length = 2 offsetToByteIndices = Util.convertDataToPrint(self.binData, start, length) print (' offset_to_byte_indices, '+ offsetToByteIndices) offsetinMethodInfo += (int)(offsetToByteIndices, 16) if(offsetinMethodInfo == 255): continue print (' offset to index in method info, which points to an entry in the constant pool ', offsetinMethodInfo) cpIndex = mtComp.getByteFromMethodInfo(offsetinMethodInfo) print (' entry in the constant pool pointed by bytecode index ', cpIndex) cpComp.parseTheInfoForTheGivenIndex(cpIndex, 'printOnConsole') index += 1 print(' ') start += length length = 4 byte2IndexCount = (int)(Util.convertDataToPrint(self.binData, start, length), 16) print(' byte2_index_count, ', byte2IndexCount) index = 0 offsetinMethodInfo = 0 while index < byte2IndexCount: start += length length = 2 offsetToByte2Indices = Util.convertDataToPrint(self.binData, start, length) print (' offset_to_byte2_indices, '+offsetToByte2Indices) offsetinMethodInfo += (int)(offsetToByte2Indices, 16) if(offsetinMethodInfo == 255): continue print (' offset to index in method info, which points to an entry in the constant pool ', offsetinMethodInfo) cpIndex = mtComp.getByteFromMethodInfo(offsetinMethodInfo) print (' entry in the constant pool pointed by bytecode index ', cpIndex) cpComp.parseTheInfoForTheGivenIndex(cpIndex, 'printOnConsole') index += 1
def processCPComp(self, 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 = 4 count = (int)(Util.convertDataToPrint(self.binData, start, length), 16) Util.printOnConsole((' count, ' + str(count)), prnt) indx = 0 while (indx < (count)): start += length length = 2 self.constantPoolTable.update({indx: start}) start, length = self.parseTheInfoForTheGivenIndex(indx, prnt) indx += 1