def write_psb(mypsb, filename): if not mypsb or not filename: return if not rename_backup(filename): return if global_vars.verbose: print("Writing '%s'" % filename) # Pack our PSB object into the on-disk format psb_data0 = mypsb.pack() if global_vars.verbose > global_vars.debug_level: open(filename + '.0', 'wb').write(psb_data0) # raw if filename.endswith('.psb'): # Write out the data as-is open(filename, 'wb').write(psb_data0) elif filename.endswith('.psb.m'): # Compress the PSB data psb_data1 = psb.compress_data(psb_data0) if global_vars.verbose > global_vars.debug_level: open(filename + '.1', 'wb').write(psb_data1) # compressed # Encrypt the PSB data using the filename as the key psb_data2 = psb.unobfuscate_data(psb_data1, filename) if global_vars.verbose > global_vars.debug_level: open(filename + '.2', 'wb').write(psb_data2) # compressed/encrypted # Write out the compressed/encrypted PSB data open(filename, 'wb').write(psb_data2)
def load_from_psb(psb_filename): if not psb_filename: return None if global_vars.verbose: print("Reading '%s'" % psb_filename) # Read in the encrypted/compressed psb data psb_data2 = bytearray(open(psb_filename, 'rb').read()) # Decrypt the psb data using the filename as the key psb_data1 = psb.unobfuscate_data(psb_data2, psb_filename) if global_vars.verbose > global_vars.debug_level: open(psb_filename + '.1', 'wb').write(psb_data1) # compressed if psb_filename.endswith('.psb'): # ".psb" files are not compressed, use the decrypted data psb_data0 = psb_data2 else: # Uncompress the psb data psb_data0 = psb.uncompress_data(psb_data1) if global_vars.verbose > global_vars.debug_level: open(psb_filename + '.0', 'wb').write(psb_data0) # raw # Check we have a PSB header header = psb.HDRLEN() header.unpack(psb.buffer_unpacker(psb_data0)) if header.signature != b'PSB\x00': print("PSB header not found") return # Unpack the PSB structure mypsb = psb.PSB() mypsb.unpack(psb_data0) # Get the base filename without any .psb.m # '.psb.m' isn't a single extension :( if psb_filename.endswith('.psb'): base_filename = psb_filename[:-len('.psb')] elif psb_filename.endswith('.psb.m'): base_filename = psb_filename[:-len('.psb.m')] else: return # Read in the alldata.bin file if it exists bin_filename = base_filename + '.bin' if os.path.isfile(bin_filename): if global_vars.verbose: print("Reading file %s" % bin_filename) bin_data = bytearray(open(bin_filename, 'rb').read()) # Split the ADB data into each subfile. # The data is in compressed/encrypted form mypsb.split_subfiles(bin_data) return mypsb