Причины:
- Устройства хранят метки в разных форматах: Unix time (epoch), UTC + смещение, локальное время без указания смещения.
- Разные артефакты (iOS: `.sqlite`, `plist`; Android: `/data/system_ce/`, `mmssms.db`) используют свои правила конвертации.
- Пользователь или злоумышленник мог изменять время/таблетки (например, для алиби).
- Исторические записи не учитывают переход на DST (Daylight Saving Time) — смещение меняется.
Решение:
1. Извлечение исходных меток: Всегда сохраняйте `raw timestamp` (Unix epoch) до конвертации. Не доверяйте «локальному» отображению.
2. Определение baseline: Получите точный часовой пояс устройства во время создания артефакта (из `sysproperties` Android или `timezone.plist` iOS). Используйте `adb shell getprop persist.sys.timezone` (Android) или `system_profiler SPSoftwareDataType` (iOS, из дампа).
3. Конвертация через IANA Database: Используйте библиотеки (Python `pytz`, `datetime`, SQLite `strftime` с явным указанием зоны). Пример для SQLite:
sql
SELECT datetime(epoch, 'unixepoch') AS utc_time,
datetime(epoch, 'unixepoch', 'localtime') AS local_time
FROM artifacts;Если смещение известно — примените корректное: `datetime(epoch, 'unixepoch', '+03:00')`.
4. Верификация через другие артефакты: Сравните с сетевыми событиями (APN log, IP адреса из логов WebKit) или записями календаря/будильников — они синхронизируются с сетью и не зависят от ручной настройки.
5. Фиксация: В отчете указывайте: исходный UTC (Unix time), исходный часовой пояс устройства (включая исторические изменения), конечное локальное время с меткой временной зоны. Используйте `plistutil` для iOS, `sqlite3` с опцией `-header`.
Пример для Android (извлечение таймзоны):
bash
adb shell dumpsys timezone | grep "current_zone"Команда для анализа SQLite с историческим смещением (Python):
python
import sqlite3, pytz
conn = sqlite3.connect('mmssms.db')
cursor = conn.cursor()
cursor.execute("SELECT date, address FROM sms")
tz = pytz.timezone('Europe/Moscow')
for row in cursor.fetchall():
utc_dt = datetime.fromtimestamp(row[0], tz=pytz.UTC)
local_dt = utc_dt.astimezone(tz)
print(local_dt, row[1])