🔍 Узнаём истинный объём флешки

Posted: 2019-04-13 in Hardware, IT
Метки:, ,

Есть такое явление, как поддельные флешки. Это когда берётся мелкая микросхема флеш-памяти гига на два, а в контроллер прошивается мошенническая фирмварь, которая сообщает хосту, что её объём в разы больше (особо наглые могут заявлять о терабайтных размерах).

Чаще всего встречается на китайских барахолках, но и в магазине тоже может попасться.
Объявление вида «полный ёмкость дешевые мультфильм Монстры модель 128 ГБ USB флэш накопитель» по цене 400 рублей — это именно оно.

Трюк основан на свойствах древних файловых система семейства FAT — их служебные данные лежат в самом начале раздела, что позволяет заявить больший объём, чем есть реально. Опасность в том, что записав туда данные выше реального объёма, они «как бы запишутся», но назад вы их никогда не прочитаете.
Если вы по ошибке запишите туда важные данные — высок риск их потерять.

Соответственно, нужен способ быстро определять такие флешки и их настоящий размер.

Классические пути — пробовать на них создавать журналируемые ФС разного размера, ручками кидать файлы или использовать сторонние утилиты. Утилиты бывают двух типов — первые пробуют определить аппаратную начинку (типы модулей памяти), а вторые — пробуют забивать место и считывать записанное.

Слабость первых — зависимость от железа и моделей контроллеров. Если контроллер окуклится и не будет выдавать данные — то увы. Это не решает окончательно проблему — китайцы могут применить более изощрённые прошивки. да и часто такие утилиты работают только на определенных версиях виндовс, контроллеров и типах памяти.

Вторые же написаны говнокодерами-виндузятниками без любви к прекрасному и уважению времени пользователя, и работают невероятно медленно. Либо там создаются файлы на полный объём (которые руками надо чистить), либо это сканы всего пространства, что может занимать несколько часов. Сраная флешка не стоит таких расходов времени, да и экспресс-анализ «в полях» невозможен.
Мне же хочется проверять мгновенно, чтобы вот прямо тестовым нетбуком перед покупкой.
В идеале — не требуя удаления данных на проверяемой флешке.

Поэтому я хочу представить моим читателям своё решение этой задачи — крохотный скрипт, способный почти моментально (доли секунды, секунды максимум) проверить читаемость ключевых блоков данных на носителе.

https://github.com/Aminuxer/Other-nix-Scripts/blob/master/test-flash-size.sh

Требования:
* ОС здорового человека с bash, dd и подсистемой sysfs, то бишь любой более-менее свежий линукс.
* способность отмаунтить флешку и запустить скрипт через sudo / от рута

Схема работы и няшные фишечки:
— Спрашивает, какой диск проверять. Ожидается трехсимвольное имя диска (sdb, sdc, …).
Проверяется весь диск, не разделы !
— делаются проверки безопасности теста, чтобы минимизировать риск утери данных.
Я тестирую пробными низкоуровневыми записями с помощью dd.
Если проверяемый диск смонтирован, нет прав, фс для временных файлов недоступна —
скрипт завершится досрочно. Писать блоки в подключённые ФС нельзя категорически.
— выводится дополнительная инфа о проверяемом диске
— Определяется ёмкость в блоках. Проверяются только ключевые сектора, расположенные
на размерах, близких к кратным степеням двойки.
— проверяемый сектор бэкапится
— каждый проверяемый сектор использует свой случайный блок данных.
— этот блок данных пишется на флеш, потом вычитывается в другой файл
— сравниваются хэш-суммы записанного и повторно вычитанного
— содержимое сектора восстанавливается из бэкапа.
— проверяет флешки, диски, ссд, да вообщем-то любое блочное устройство, скрипту похер на тип.
— при отсутствии аппаратных ошибок хэш-сумма диска (sha256sum /dev/sdb) после теста не меняется,
данные на исправной флешке остаются живыми после теста.
— Тест проходит моментально.
— наличие внутренней фс и её тип не имеет значения.

Пример работы:

# ~/test-flash-size.sh

*** True size checker for USB sticks v. 0.4 [2019-04-12] ***

This script check true device size for detect fraud chinese usb-sticks
!! Need ROOT rights Make BACKUPS !! Can be dangerous !!
!! using WRITE commands to raw-blocks of target disk !! NO WARRANTY !!

Enter target DISK name (ex, sdb):
sdb
BLKiD: /dev/sdb: PTUUID="0203fd1e" PTTYPE="dos"
/dev/sdb1: UUID="e223fef4-736c-4af0-80e2-92254ac09cdf" TYPE="ext4" PARTUUID="0203fd1e-01"

* Reported size: 64 Mb
* Block size: 512 bytes
* Blocks: 131832

Check size 64 Mb, block 131831 ... OK
Check size 32 Mb, block 65915 ... OK
Check size 16 Mb, block 32957 ... OK
Check size 8 Mb, block 16478 ... OK
Check size 4 Mb, block 8239 ... OK
Check size 2 Mb, block 4119 ... OK
Check size 1 Mb, block 2059 ... OK

-----------------------------------
First/top OK mark indicate true size;
If you see FAIL mark, this sector crashed;
Sector data stored in /tmp (testing read/write) and /var/tmp (original data)
https://github.com/Aminuxer/Other-nix-Scripts/blob/master/test-flash-size.sh

Каждый тест — чтение/запись блоков размером ровно в один сектор (512 / 4096 байт), это занимает доли секунды даже на самых тупых и тугих флешках. За 24 запроса можно проверить накопитель на 8 Тб — это уложится в секунду. Палевный объём детектится на первом же тесте, истинный определяется за несколько запросов. В случае, если что-то пойдёт не так, скрипт напишет требуемые подробности и сохранит бэкапы затронутых тестом секторов.

Пример сообщения об ошибке:
Check size 64 Mb, block 131831 ... /_!_\ Can't make test write to data2 from sector 131831 - Attention !
dd: не удалось открыть '/tmp/Dev_sdb-block-131831-RND2.dd': файловая система доступна только для чтения

При мошеннической флешке вывод будет такой:
Check size 64 Mb, block 131831 ... !! FAIL !!
Writed-Hash: 27ccb85260c87f19f19e418c81ff94e7722f4e72fb1462e3e2ba6ba0e90fdbd9 ( /tmp/Dev_sdb-block-131831-RND1.dd )
Readed-Hash: a07562f0961ce3006be1f1d73100f273575d2bcee45f0dbd591536c4713d015f ( /tmp/Dev_sdb-block-131831-RND2.dd )

В скобках указан путь к файлам, где можно посмотреть, что записалось, и что было прочитано.

Временные файлы и бэкапы секторов скрипт пишет в /tmp.

Надеюсь, скрипт будет полезен кому-либо ещё.

Для классического долгого теста подойдёт утилита f3 (fight flash fraud), есть в репозиториях.

- комментарии
  1. Начнется процесс заполнения флешкарты, а затем программа будет сверять сколько было записано и сколько на самом деле находится на носители данных. У меня на флешку с истинным объемом в 8 Гб ушло чуть больше двух часов (примерно час на запись и час на чтение).

  2. Amin:

    Название программы уточните. h2testw ? Или вы про f3 ?

    Мой скрипт предназначен для проверки прямо в магазине своим ноутом, там проверка за несколько запросов, считанные секунды. Программы глубокой диагностики — это для работ в спокойной домашней обстановке.

    Мой скрипт — экспресс-анализ в чистом виде, когда нет возможности ждать столько времени.