Перейти к содержанию

Командная строка

CLI не импортирует Qt и доступен через python -m mountfile. main.py также передаёт ему команды, поэтому оба варианта эквивалентны:

python -m mountfile --help
python main.py volumes dump.img

Команды

DFIR-команды

python -m mountfile grep dump.img "password=" --encoding utf-8
python -m mountfile hash dump.img
python -m mountfile evidence-manifest evidence.img --output evidence.img.manifest.json
python -m mountfile timeline dump.img --csv timeline.csv
python -m mountfile timestomp dump.img --csv timeline.csv
python -m mountfile search dump.img "credential" --files --max-results 100
python -m mountfile yara-scan dump.img --rules rules.yar --targets files unallocated
python -m mountfile timestomp-scan dump.img
python -m mountfile timeline-build dump.img --csv timeline.csv
python -m mountfile slack-extract dump.img --output ./slack
python -m mountfile unallocated-scan dump.img --ranges ranges.json
python -m mountfile slack dump.img --slack-only \
    --last-cluster-offset 0x400000 --file-size 5000 --cluster-size 4096 \
    -o slack.bin

grep возвращает ограниченные byte offsets и контекст, hash вычисляет SHA-256, а evidence-manifest потоково считает SHA-256 одного файла и создаёт новый JSON-файл только по явному --output; исходник открывается только для чтения, а существующий output никогда не перезаписывается. Эта команда не определяет формат контейнера и не считает логический media-stream hash. Команды timeline/timestomp принимают CSV внешнего коллектора. Отдельные timeline-build, timeline-query, search, yara-scan, timestomp-scan и slack-extract — filesystem-aware команды package CLI; они требуют доступного filesystem backend (обычно pytsk3/libtsk), а для YARA дополнительно нужен yara-python. yara-scan проверяет filesystem-файлы и/или нераспределённые области с учётом --targets; это не заменяет полноценное восстановление файлов и не обещает корректный allocation map для каждой ФС.

unallocated-scan читает только явно переданные ranges. slack --slack-only принимает уже подтверждённые offset последнего кластера, логический размер файла и размер кластера и не разрешает путь файла и cluster chain: это должен сделать вызывающий код.

GUI Инструменты → Командный центр (Ctrl+Shift+X) использует реестр этих подкоманд напрямую. Все 32 команды имеют в интерфейсе контекстную справку из того же CLI parser; аргументы передаются по одному на строку, без shell.

Команда Назначение Запись в образ
volumes найденные тома и смещения нет
info размер, сигнатура и сводка томов нет
capabilities versioned native profile matrix без открытия образа нет
preflight read-only проверка профилей и ограничений файловой системы нет
status выбранный backend, profile, capabilities и typed refusal для extent нет
ls список каталога нет
stat метаданные файла в JSON нет
read-range чтение ограниченного диапазона байтов файла нет; raw stdout или новый output-файл
autopick выбрать рабочий том по проверяемым кандидатам нет
get извлечение файла или каталога нет
put записать локальные файлы да, FAT32
mkdir создать каталог да, FAT32
mv переименовать запись в том же каталоге да, FAT32
rm удалить файл/каталог да, FAT32
decode расшифровать RT809H MST/MTK-дамп встроенной таблицей создаёт новый файл
split разбить дамп по секции [PARTITIONS] файла udev создаёт файлы в каталоге вывода
grep поиск строки/regex в байтах сырого образа нет
hash SHA-256 образа нет
evidence-manifest потоковый SHA-256 одного файла и отдельный JSON manifest создаёт новый manifest
timeline / timestomp просмотр timeline CSV / проверка аномалий нет
timeline-export нормализация timestamp CSV в UTC создаёт CSV
yara YARA-сканирование по исходникам правил нет
search поиск в байтах образа или содержимом файлов нет
yara-scan YARA по файлам и/или unallocated ranges нет
unallocated-scan сигнатурный поиск только в заданных JSON ranges нет
timestomp-scan сбор и анализ временных меток из образа нет
timeline-build / timeline-query построить/запросить timeline создаёт SQLite/CSV при передаче output path
slack-extract извлечь slack хвосты файлов по найденным extent создаёт файлы в output-каталоге
live-diff сравнить два образа и сформировать Markdown-отчёт создаёт отчёт при -o
slack slack последнего кластера по явно заданному extent нет; файл только через --output, без перезаписи

Общие аргументы целевых команд (volumes, info, status, ls, get, put, mkdir, mv, rm, autopick):

  • -V N, --volume N — номер тома из volumes, начиная с 1;
  • -O 0x400000, --offset ... — прямое байтовое смещение файловой системы;
  • --scan-limit BYTES — сколько байт искать при обнаружении сигнатур;
  • --auto — использовать автоматический выбор тома;
  • --backup — перед записью скопировать образ в <image>.bak.

Для команд записи обязательны --yes. Без него программа ничего не меняет, показывает предупреждение и возвращает код 2. Нормальный результат — 0, ошибка — 1; Ctrl+C возвращает 130.

python -m mountfile capabilities печатает schema v5 JSON. Поля read_capabilities и write_capabilities сохранены для existing clients, а operations публикует полный canonical набор с available/refused, точным именем API method и structured refusal code. constraint_ids и gates описывают accepted bounded profile; recovery отдельно показывает доказанные границы rollback/process-kill/quarantine и всегда явно помечает power-loss как unsupported для текущих native writers. Эти поля не обходят validation выбранного image.

python -m mountfile status IMAGE открывает выбранный bounded read provider и без mutation проверяет отдельный native writer profile с отключённым backup. Результат содержит фактический read backend и его capabilities, отдельный write_status с native writer capabilities, offset и размер filesystem extent. Если распознанный профиль отвергнут, команда сохраняет machine-readable refusal и не выбирает другой parser или legacy fallback.

Примеры чтения

python -m mountfile info dump.img
python -m mountfile volumes dump.img
python -m mountfile ls dump.img /
python -m mountfile ls dump.bin /system --auto
python -m mountfile get dump.img /photos -o ./evidence/photos

get извлекает во внешний каталог и не меняет образ. Встроенные pure-Python провайдеры читают только поддерживаемые профили FAT12/16/32, clean ext2/3/4, exFAT и NTFS; для них pytsk3 не требуется. Поддержка ограничена проверенными вариантами форматов, а не всеми возможными томами. pytsk3/libtsk — отдельный, явно включаемый compatibility fallback для нераспознанных форматов. Если формат распознан, но его профиль повреждён, dirty или не поддерживается, чтение отклоняется безопасно, без автоматической передачи другому parser-у.

Примеры FAT32-записи

python -m mountfile put dump.img ./hello.txt --dest /docs --backup --yes
python -m mountfile mkdir dump.img /docs/new --backup --yes
python -m mountfile mv dump.img /hello.txt renamed.txt --yes
python -m mountfile rm dump.img /docs/new --recursive --backup --yes

Сначала работайте с копией, затем проверьте результат повторным ls. --backup создаёт соседний файл, но при нехватке места или повреждённом образе операция всё равно может завершиться ошибкой; он не является транзакцией.

RT809H и авто-подбор

python -m mountfile decode dump.bin
python -m mountfile split dump.bin udev.txt -o ./parts
python -m mountfile autopick dump.bin --json > candidates.json
python -m mountfile autopick dump.bin --hint system --extract ./rootfs

autopick сопоставляет MBR/GPT, udev и сигнатуры ФС, затем по умолчанию подтверждает кандидата реальным открытием. --no-verify быстрее, но может выбрать нерабочее смещение. OOB/ECC сырых NAND-дампов не обрабатываются.