diff --git a/docs/requirements.txt b/docs/requirements.txt index 843517a..63432f3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ mkdocs==1.6.1 -mkdocs-autorefs==1.4.3 -mkdocs-material==9.6.20 +mkdocs-autorefs==1.4.4 +mkdocs-material==9.7.6 mkdocs-material-extensions==1.3.1 -mkdocstrings==1.0.0 \ No newline at end of file +mkdocstrings==1.0.4 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index fedfff9..845067c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,11 +27,11 @@ dependencies = [ "iOSbackup==0.9.925", "adb-shell[usb]==0.4.4", "libusb1==3.3.1", - "cryptography==46.0.6", + "cryptography==47.0.0", "PyYAML>=6.0.2", "pyahocorasick==2.2.0", "betterproto2==0.9.1", - "pydantic==2.12.5", + "pydantic==2.13.3", "pydantic-settings==2.13.1", "NSKeyedUnArchiver==1.5.2", "python-dateutil==2.9.0.post0", diff --git a/src/mvt/common/command.py b/src/mvt/common/command.py index 0eb633a..a3b99ea 100644 --- a/src/mvt/common/command.py +++ b/src/mvt/common/command.py @@ -11,7 +11,7 @@ from datetime import datetime from typing import Optional from mvt.common.indicators import Indicators -from mvt.common.module import MVTModule, run_module, save_timeline +from mvt.common.module import EncryptedBackupError, MVTModule, run_module, save_timeline from mvt.common.utils import ( convert_datetime_to_iso, generate_hashes_from_path, @@ -244,7 +244,14 @@ class Command: except NotImplementedError: pass - run_module(m) + try: + run_module(m) + except EncryptedBackupError: + self.log.critical( + "The backup appears to be encrypted. " + "Please decrypt it first using `mvt-ios decrypt-backup`." + ) + return self.executed.append(m) diff --git a/src/mvt/common/module.py b/src/mvt/common/module.py index 2a52677..9c26064 100644 --- a/src/mvt/common/module.py +++ b/src/mvt/common/module.py @@ -21,6 +21,10 @@ class DatabaseCorruptedError(Exception): pass +class EncryptedBackupError(Exception): + pass + + class InsufficientPrivileges(Exception): pass @@ -169,6 +173,8 @@ def run_module(module: MVTModule) -> None: try: exec_or_profile("module.run()", globals(), locals()) + except EncryptedBackupError: + raise except NotImplementedError: module.log.exception( "The run() procedure of module %s was not implemented yet!", diff --git a/src/mvt/ios/data/ios_versions.json b/src/mvt/ios/data/ios_versions.json index ea32c9f..1a15aed 100644 --- a/src/mvt/ios/data/ios_versions.json +++ b/src/mvt/ios/data/ios_versions.json @@ -1200,6 +1200,10 @@ "version": "18.7.7", "build": "22H333" }, + { + "version": "18.7.8", + "build": "22H352" + }, { "version": "26", "build": "23A341" @@ -1231,5 +1235,9 @@ { "version": "26.4", "build": "23E246" + }, + { + "version": "26.4.2", + "build": "23E261" } ] \ No newline at end of file diff --git a/src/mvt/ios/modules/backup/manifest.py b/src/mvt/ios/modules/backup/manifest.py index ccbc459..da5c1a8 100644 --- a/src/mvt/ios/modules/backup/manifest.py +++ b/src/mvt/ios/modules/backup/manifest.py @@ -8,9 +8,10 @@ import io import logging import os import plistlib +import sqlite3 from typing import Optional -from mvt.common.module import DatabaseNotFoundError +from mvt.common.module import DatabaseNotFoundError, EncryptedBackupError from mvt.common.url import URL from mvt.common.utils import convert_datetime_to_iso, convert_unix_to_iso @@ -127,7 +128,14 @@ class Manifest(IOSExtraction): conn = self._open_sqlite_db(manifest_db_path) cur = conn.cursor() - cur.execute("SELECT * FROM Files;") + try: + cur.execute("SELECT * FROM Files;") + except sqlite3.DatabaseError: + conn.close() + raise EncryptedBackupError( + "Manifest.db is not a valid SQLite database. " + "The backup may be encrypted." + ) names = [description[0] for description in cur.description] for file_entry in cur: