示例#1
0
	def decompress_fs(data, path, test = False):
		"""Decompress filesystem"""
		lzofsdatalen = unpack('>L', data[4:8])[0]
		if draytools.verbose:
			print 'Compressed FS length: %d [0x%08X]' % (lzofsdatalen, 
				lzofsdatalen)
		# stupid assumption of raw FS length. Seems OK for now
		fsdatalen = 0x800000
		fs_raw = pydelzo.decompress('\xF0' + pack(">L", fsdatalen) \
			 + data[0x08:0x08 + lzofsdatalen])
		cfs = draytools.fs(fs_raw, test, draytools.verbose)
		return (lzofsdatalen, cfs.save_all(path))
示例#2
0
	def decompress_cfg(data):
		"""Decompress a config file"""
		modelstr = "V" + format(unpack(">H", 
			draytools.get_modelid(data))[0],"04X")
		if draytools.verbose and draytools.modelprint: 
			print 'Model is :\t' + modelstr
		else:
			draytools.modelprint = True
		rawcfgsize = 0x00100000
		lzocfgsize = unpack(">L", data[0x24:0x28])[0]
		raw = data[:0x2D] + '\x00' + data[0x2E:0x100] \
			+ pydelzo.decompress('\xF0' + pack(">L",rawcfgsize) \
			+ data[0x100:0x100+lzocfgsize])
		return raw
示例#3
0
 def decompress_cfg(data):
     """Decompress a config file"""
     modelstr = "V" + format(
         unpack(">H", draytools.get_modelid(data))[0], "04X")
     if draytools.verbose and draytools.modelprint:
         print 'Model is :\t' + modelstr
     else:
         draytools.modelprint = True
     rawcfgsize = 0x00100000
     lzocfgsize = unpack(">L", data[0x24:0x28])[0]
     raw = data[:0x2D] + '\x00' + data[0x2E:0x100] \
      + pydelzo.decompress('\xF0' + pack(">L",rawcfgsize) \
      + data[0x100:0x100+lzocfgsize])
     return raw
示例#4
0
		def save_file(self,i):
			"""Extract file #i from current FS"""			
			fname = self.get_fname(i)
			# compressed file data offset in FS block
			ds = self.get_offset(i)
			# size of compressed file
			fs = self.get_fsize(i)
			# compressed file data
			fdata = self.cdata[ds : ds+fs]
			# create all subdirs along the path if they don't exist
			pp = fname.split('\\')
			pp = [self.path] + pp
			ppp = os.sep.join(pp[:-1])
			if len(pp) > 1:
				if not os.path.exists(ppp) and not self.test:
					os.makedirs(ppp)
			nfname = os.sep.join(pp)
			# size of uncompressed file
			rawfs = -1
			if not self.test:
				ff = file(nfname,'wb')
			# perform extraction, some file types are not compressed
			if fs>0:	
				if pp[-1].split('.')[-1].lower() \
				in ['gif','jpg','cgi','cab','txt','jar']:
					rawfdata = fdata
				else:
					try:
						rawfdata = pydelzo.decompress('\xF0' \
							+ pack(">L",fs*64)+fdata)
					except LZO_ERROR as lze:
						print '[ERR]:\tFile "'+ fname \
							+ '" is damaged or uncompressed [' \
							+ str(lze) \
							+ '], RAW DATA WRITTEN'
						rawfdata = fdata
			else:
				rawfdata = ''
			rawfs = len(rawfdata)
			if not self.test:
				ff.write(rawfdata)
				ff.close()
			# print some debug info for each file
			if self.echo:
				print '%08X "' % ds + fname + '" %08X' % fs \
					+ ' %08X' % rawfs
			return (fs, rawfs)
示例#5
0
		def save_file(self,i):
			"""Extract file #i from current FS"""			
			fname = self.get_fname(i)
			# compressed file data offset in FS block
			ds = self.get_offset(i)
			# size of compressed file
			fs = self.get_fsize(i)
			# compressed file data
			fdata = self.cdata[ds : ds+fs]
			# create all subdirs along the path if they don't exist
			pp = fname.split('\\')
			pp = [self.path] + pp
			ppp = os.sep.join(pp[:-1])
			if len(pp) > 1:
				if not os.path.exists(ppp) and not self.test:
					os.makedirs(ppp)
			nfname = os.sep.join(pp)
			# size of uncompressed file
			rawfs = -1
			if not self.test:
				ff = file(nfname,'wb')
			# perform extraction, some file types are not compressed
			if fs > 0:	
				if pp[-1].split('.')[-1].lower() \
				in ['gif','jpg','cgi','cab','txt','jar']:
					rawfdata = fdata
				else:
					try:
						rawfdata = pydelzo.decompress('\xF0' \
							+ pack(">L",fs*64)+fdata)
					except LZO_ERROR as lze:
						print '[ERR]:\tFile "'+ fname \
							+ '" is damaged or uncompressed [' \
							+ str(lze) \
							+ '], RAW DATA WRITTEN'
						rawfdata = fdata
			else:
				rawfdata = ''
			rawfs = len(rawfdata)
			if not self.test:
				ff.write(rawfdata)
				ff.close()
			# print some debug info for each file
			if self.echo:
				print '%08X "' % ds + fname + '" %08X' % fs \
					+ ' %08X' % rawfs
			return (fs, rawfs)
示例#6
0
	def decompress_firmware(data):
		"""Decompress firmware"""
		flen = len(data)
		sigstart = data.find('\xA5\xA5\xA5\x5A\xA5\x5A')
		# Try an alternative signature
		if sigstart <= 0:
			sigstart = data.find('\x5A\x5A\xA5\x5A\xA5\x5A')
		# Compressed FW block found, now decompress
		if sigstart > 0:
			if draytools.verbose:
				print 'Signature found at [0x%08X]' % sigstart
			lzosizestart = sigstart + 6
			lzostart = lzosizestart + 4
			lzosize = unpack('>L', data[lzosizestart:lzostart])[0]
			return data[0x100:sigstart+2] \
				+ pydelzo.decompress('\xF0' + pack(">L",0x1000000) \
					+ data[lzostart:lzostart+lzosize])
		else:
			print '[ERR]:\tCompressed FW signature not found!'
			raise Exception('Compressed FW signature not found')
			return ''
示例#7
0
 def decompress_firmware(data):
     """Decompress firmware"""
     flen = len(data)
     sigstart = data.find('\xA5\xA5\xA5\x5A\xA5\x5A')
     # Try an alternative signature
     if sigstart <= 0:
         sigstart = data.find('\x5A\x5A\xA5\x5A\xA5\x5A')
     # Compressed FW block found, now decompress
     if sigstart > 0:
         if draytools.verbose:
             print 'Signature found at [0x%08X]' % sigstart
         lzosizestart = sigstart + 6
         lzostart = lzosizestart + 4
         lzosize = unpack('>L', data[lzosizestart:lzostart])[0]
         return data[0x100:sigstart+2] \
             + pydelzo.decompress('\xF0' + pack(">L",0x1000000) \
                 + data[lzostart:lzostart+lzosize])
     else:
         print '[ERR]:\tCompressed FW signature not found!'
         raise Exception('Compressed FW signature not found')
         return ''