Added support for multiprocessing when decrypting an iOS backup

This commit is contained in:
Nex 2022-05-08 17:25:27 +02:00
parent 732a712e3d
commit 8dac714214
1 changed files with 16 additions and 4 deletions

View File

@ -6,6 +6,7 @@
import binascii
import glob
import logging
import multiprocessing
import os
import os.path
import shutil
@ -53,6 +54,12 @@ class DecryptBackup:
log.critical("The backup does not seem encrypted!")
return False
def _process_file(self, relative_path, domain, item, file_id, item_folder):
self._backup.getFileDecryptedCopy(manifestEntry=item,
targetName=file_id,
targetFolder=item_folder)
log.info("Decrypted file %s [%s] to %s/%s", relative_path, domain, item_folder, file_id)
def process_backup(self):
if not os.path.exists(self.dest_path):
os.makedirs(self.dest_path)
@ -63,6 +70,8 @@ class DecryptBackup:
# We store it to the destination folder.
shutil.copy(self._backup.manifestDB, manifest_path)
pool = multiprocessing.Pool(multiprocessing.cpu_count())
for item in self._backup.getBackupFilesList():
try:
file_id = item["backupFile"]
@ -85,13 +94,16 @@ class DecryptBackup:
# Add manifest plist to both keys to handle this.
item["manifest"] = item["file"]
self._backup.getFileDecryptedCopy(manifestEntry=item,
targetName=file_id,
targetFolder=item_folder)
log.info("Decrypted file %s [%s] to %s/%s", relative_path, domain, item_folder, file_id)
pool.apply_async(self._process_file, args=(relative_path,
domain, item,
file_id,
item_folder))
except Exception as e:
log.error("Failed to decrypt file %s: %s", relative_path, e)
pool.close()
pool.join()
# Copying over the root plist files as well.
for file_name in os.listdir(self.backup_path):
if file_name.endswith(".plist"):