diff --git a/mvt/ios/decrypt.py b/mvt/ios/decrypt.py index da6410d..be47e95 100644 --- a/mvt/ios/decrypt.py +++ b/mvt/ios/decrypt.py @@ -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"):