mirror of
https://github.com/mvt-project/mvt.git
synced 2026-04-21 03:06:41 +02:00
Compare commits
4 Commits
fix_sms
...
warn-encry
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6342e3261b | ||
|
|
642add21b0 | ||
|
|
f26303c930 | ||
|
|
4edab3c4f8 |
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
# Mobile Verification Toolkit
|
# Mobile Verification Toolkit
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Soon we will merge the v3 pull request which will result in breaking changes. If you rely on mvt output in other script make sure to the the branch before we merge. More details: https://github.com/mvt-project/mvt/issues/757
|
||||||
|
|
||||||
[](https://pypi.org/project/mvt/)
|
[](https://pypi.org/project/mvt/)
|
||||||
[](https://docs.mvt.re/en/latest/?badge=latest)
|
[](https://docs.mvt.re/en/latest/?badge=latest)
|
||||||
[](https://github.com/mvt-project/mvt/actions/workflows/tests.yml)
|
[](https://github.com/mvt-project/mvt/actions/workflows/tests.yml)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from datetime import datetime
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from mvt.common.indicators import Indicators
|
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 (
|
from mvt.common.utils import (
|
||||||
convert_datetime_to_iso,
|
convert_datetime_to_iso,
|
||||||
generate_hashes_from_path,
|
generate_hashes_from_path,
|
||||||
@@ -244,7 +244,14 @@ class Command:
|
|||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
pass
|
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)
|
self.executed.append(m)
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ class DatabaseCorruptedError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class EncryptedBackupError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class InsufficientPrivileges(Exception):
|
class InsufficientPrivileges(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -169,6 +173,8 @@ def run_module(module: MVTModule) -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
exec_or_profile("module.run()", globals(), locals())
|
exec_or_profile("module.run()", globals(), locals())
|
||||||
|
except EncryptedBackupError:
|
||||||
|
raise
|
||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
module.log.exception(
|
module.log.exception(
|
||||||
"The run() procedure of module %s was not implemented yet!",
|
"The run() procedure of module %s was not implemented yet!",
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ import io
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import plistlib
|
import plistlib
|
||||||
|
import sqlite3
|
||||||
from typing import Optional
|
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.url import URL
|
||||||
from mvt.common.utils import convert_datetime_to_iso, convert_unix_to_iso
|
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)
|
conn = self._open_sqlite_db(manifest_db_path)
|
||||||
cur = conn.cursor()
|
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]
|
names = [description[0] for description in cur.description]
|
||||||
|
|
||||||
for file_entry in cur:
|
for file_entry in cur:
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ class SMS(IOSExtraction):
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
items = list(cur)
|
items = list(cur)
|
||||||
|
elif "no such table" in str(exc):
|
||||||
|
self.log.info(
|
||||||
|
"No SMS tables found in the database, skipping: %s", exc
|
||||||
|
)
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
raise exc
|
raise exc
|
||||||
names = [description[0] for description in cur.description]
|
names = [description[0] for description in cur.description]
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# https://license.mvt.re/1.1/
|
# https://license.mvt.re/1.1/
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import sqlite3
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
from typing import Optional, Union
|
from typing import Optional, Union
|
||||||
|
|
||||||
@@ -79,21 +80,29 @@ class SMSAttachments(IOSExtraction):
|
|||||||
|
|
||||||
conn = self._open_sqlite_db(self.file_path)
|
conn = self._open_sqlite_db(self.file_path)
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
cur.execute(
|
try:
|
||||||
|
cur.execute(
|
||||||
|
"""
|
||||||
|
SELECT
|
||||||
|
attachment.ROWID as "attachment_id",
|
||||||
|
attachment.*,
|
||||||
|
message.service as "service",
|
||||||
|
handle.id as "phone_number"
|
||||||
|
FROM attachment
|
||||||
|
LEFT JOIN message_attachment_join ON
|
||||||
|
message_attachment_join.attachment_id = attachment.ROWID
|
||||||
|
LEFT JOIN message ON
|
||||||
|
message.ROWID = message_attachment_join.message_id
|
||||||
|
LEFT JOIN handle ON handle.ROWID = message.handle_id;
|
||||||
"""
|
"""
|
||||||
SELECT
|
)
|
||||||
attachment.ROWID as "attachment_id",
|
except sqlite3.OperationalError as exc:
|
||||||
attachment.*,
|
self.log.info(
|
||||||
message.service as "service",
|
"No SMS attachment tables found in the database, skipping: %s", exc
|
||||||
handle.id as "phone_number"
|
)
|
||||||
FROM attachment
|
cur.close()
|
||||||
LEFT JOIN message_attachment_join ON
|
conn.close()
|
||||||
message_attachment_join.attachment_id = attachment.ROWID
|
return
|
||||||
LEFT JOIN message ON
|
|
||||||
message.ROWID = message_attachment_join.message_id
|
|
||||||
LEFT JOIN handle ON handle.ROWID = message.handle_id;
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
names = [description[0] for description in cur.description]
|
names = [description[0] for description in cur.description]
|
||||||
|
|
||||||
for item in cur:
|
for item in cur:
|
||||||
|
|||||||
Reference in New Issue
Block a user