Как найти таблицу fat

АрхивСистема

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

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

Таблица FAT. Если диск не слишком фрагментирован, то номер следующего кластера в таблице FAT на единицу больше номера предыдущего. Это и есть характерный признак, по которому можно обнаружить FAT. Скриншот показывает таблицу с номерами кластеров 18 0A 2D, 18 0A 2E, 18 0A 2F, 18 0A 30 и так далее. Если FAT показана в текстовом виде, то кое-где попадаются буквы A, B, C, D или цифры 0, 1, 2, 3, 4 (в FAT32 они расположены через каждые 4 символа, так как элемент FAT занимает 4 байта).

Таблица FAT32

Каталог (Directory). Каталог в файловой системе FAT содержит короткие имена файлов, записанные заглавными буквами, а также длинные имена в кодировке Unicode.

Каталог с короткими и длинными именами файлов

На скриншоте заметны короткие имена файлов Progra~1, Docume~1 и длинные Program files, Documents and Settings (последнее имя файла оказалось разбитым на два элемента каталога). Каждый элемент каталога занимает 32 байта, то есть две строчки в шестнадцатеричном редакторе. Выбрав View > As Directory в меню Norton Disk Editor, вы увидите тот же каталог в наглядном представлении.

Загрузочная запись (Boot Record). Загрузочная запись всегда заканчивается двумя символами с кодами 55 AA. Первые ее символы для операционных систем Windows 9x/XP равны EB 58 90, затем идет строка MSWIN4.1. В загрузочной записи можно найти метку диска, тип файловой системы (FAT12, FAT16, FAT32 или NTFS), а также сообщения об ошибках. Например, на диске Windows 9x вы прочтете “Invalid system disk”, “Disk I/O error”, “Replace the disk, and then press any key”, а в Windows XP – “NTLDR is missing”, “Disk error”, “Press any key to restart”.

Загрузочная запись (выделены текстовые строки)

Если выбрать View > As Boot Record (32), должны появиться правдоподобные данные: параметр Bytes per Sector всегда равняется 512, Number of FATs = 2, Sectors per Track = 63, File System Ver (major и minor) = 0, а в Volume Label будет указана метка диска.

Таблица разделов (Partition Table или Master Boot Record, MBR). Как и загрузочная запись, таблица разделов заканчивается байтами 55 AA. Именно поэтому в Norton Disk Editor команда поиска (Tools > Find Object > Partition / Boot) не различает их. Напомним, что таблица разделов расположена в самом первом секторе физического диска, а загрузочная запись – в начале логического диска (раздела). Таблица разделов указывает число, размер логических дисков и тип файловой системы на каждом них, а загрузочная запись – параметры только одного логического диска.

MBR в Windows 9x/XP содержит строки “Invalid partition table”, “Error loading operating system”, “Missing operating system”. При выборе View > As Partition Table должна быть показана таблица с реально существующими разделами данного жесткого диска.

Теперь
выберите из меню Tools строку Find Object и
затем строку FAT. Программа DISKEDIT выполнит
поиск первой копии таблицы размещения
файлов FAT, и отобразит ее дамп, выделив
в нем первые три байта.

Если
теперь сместить текстовый курсор вниз
или нажать клавишу PgDn, а затем выбрать
из меню Tools/Find Object строку FAT еще раз, будет
найдена вторая копия таблицы размещения
файлов FAT.

Учтите,
что поиск таблиц FAT в данном случае
сводится к поиску последовательности
байт “F8 FF FF”, поэтому выполнив поиск
в третий раз, Вы сможете найти еще одну,
ненастоящую “таблицу FAT”. Дело в
том, что наверняка на диске имеется
какой-нибудь файл, содержащий указанную
выше последовательность байт, поэтому
будьте внимательны.

Поиск потерянных каталогов

Теперь
займемся поиском потерянных каталогов.
На такие каталоги нет ссылок из других
каталогов.

Для
поиска Вы можете воспользоваться строкой
Subdirectory меню Tools/Find Object. Программа DISKEDIT
просматривает секторы диска в поисках
такого, в начале которого находится
последовательность байт “2E 20 20 20 20 20
20 20 20 20 20”. Эта последовательность
соответствует дескриптору, содержащему
ссылку каталога на себя самого.

Нажимая
комбинацию клавиш Ctrl+G, Вы можете
продолжить поиск нужного каталога, пока
не найдете тот, который содержит
интересующие Вас файлы. Можно выполнять
поиск и по имени файла, если Вы его
знаете.

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

Для
поиска номера кластера, в котором
располагается найденный каталог,
перейдите в режим форматированного
просмотра каталога, выбрав из меню View
строку as Directory. Затем
в меню Link
выберите строку
Cluster chain (fat). На экране появится
содержимое таблицы FAT в режиме
форматированного просмотра, при этом
искомый номер кластера будет выделен.

Восстановление потерянных каталогов и файлов

Зная
номер кластера потерянного каталога,
Вы можете создать новый дескриптор
каталога, например, в корневом каталоге
диска, и сделать в этом дескрипторе
ссылку на найденный каталог. После этого
потерянный каталог вновь станет
доступным.

Учтите,
что для файловой системы VFAT необходимо
правильно заполнять поле контрольной
суммы имени в расширенном дескрипторе,
а также указывать 32-разрядный номер
первого кластера, распределенного
файлу.

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

Можно
предложить следующий алгоритм
восстановления файла:

  • выполнить
    контекстный поиск секторов файла с
    помощью строки Files из меню Tools, а также
    последовательным просмотром секторов
    диска;

  • определить
    номер кластеров, соответствующих
    найденным секторам, пользуясь приведенной
    выше формулой или средствами программы
    DISKEDIT;

  • восстановить
    цепочку номеров кластеров для файла в
    таблице размещения файлов FAT, отметив
    в ней последний кластер специальным
    значением (таким как 0xFFFF для FAT-16);

  • создать
    в любом каталоге (например, в корневом)
    дескриптор файла;

  • указать
    в созданном дескрипторе ссылку на
    первый кластер восстановленного файла
    и размер файла.

Если
Вы восстановили файл документа, созданный
текстовым процессором Microsoft Word for Windows
или процессором таблиц Microsoft Excel, загрузите
его в соответствующее приложение и
затем сохраните его под другим именем.
При этом будет восстановлена правильная
длина файла.

Простой
текстовый файл можно загрузить в
текстовый редактор и “отрезать”
лишние данные в конце файла. Затем
сохраните файл под другим именем.

Если
Вы знаете точную длину файла, ее можно
установить при помощи программы DISKEDIT
в режиме редактирования дескриптора
файла (рис. 9).

Соседние файлы в папке HDD

  • #

    10.12.201364.87 Кб5Hard disk’s.htm

  • #
  • #

BPB (Bios Parameter Block) сам по себе и есть та таблица, с помощью которой можно выяснить, в каком именно секторе расположены таблицы FAT (в общем случае их может быть несколько; чаще всего их ровно две).

Вот поля BPB, которые могут вам понадобиться:

typedef struct
{
    ...
    // Количество зарезервированных секторов перед первой FAT // [14, 15]
    unsigned int reservedSectorCount;
    // Количество таблиц FAT // [16]
    unsigned char numberofFATs;

    ...
    // Количество скрытых секторов // [28, 31]
    unsigned long hiddenSectors;

    ...
    // Число секторов, занятых одной FAT // [36, 39]
    unsigned long FATsize_F32;

    ...
} BIOS_PARAMETER_BLOCK_STRUCTURE;

  1. Логический адрес сектора первой таблицы FAT

Логический адрес сектора — адрес относительно начала логического раздела.
Логический адрес сектора первой таблицы FAT хранится в BPB в явном виде в поле

unsigned int reservedSectorCount; // Байты BPB: 14, 15

Так, для unsigned char bpb[512], в котором bpb[14] = 0x6E, а bpb[15] = 0x18,
индекс логического сектора первой таблицы FAT reservedSectorCount = 0x186E.


  1. Физический адрес сектора первой таблицы FAT

Физический адрес сектора — адрес относительно начала пространства адресов ячеек памяти, предоставленных физическим устройством.
Физический адрес сектора первой таблицы FAT можно вычислить, если прибавить к логическому значение поля

unsigned long hiddenSectors; // Байты BPB: 28, 29, 30, 31

которое хранит число секторов, предшествующих анализируемому логическому разделу.

Так, если hiddenSectors = 0x000000E9, то 0x000000E9 — физический адрес нулевого логического сектора (самого блока BPB), а физический адрес первой таблицы FAT

unsigned long phAddrFirstFAT = hiddenSectors + reservedSectorCount;

  1. Адреса остальных таблиц FAT

Количество копий таблицы FAT логического раздела, и размер одной такой таблицы, также хранятся прямо в блоке BPB в полях

unsigned char numberofFATs; // Байты BPB: 16
unsigned long FATsize_F32; // Байты BPB: 36, 37, 38, 39

Так, если numberofFATs = 0x02 — есть две копии таблиц FAT, следующие друг за другом,
Адрес второй копии таблицы FAT

unsigned long lAddrSecondFAT = lAddrFirstFAT + FATsize_F32;
unsigned long phAddrSecondFAT = phAddrFirstFAT + FATsize_F32;

Спецификация:
Microsoft Extensible Firmware Initiative FAT32 File System Specification

Ранее мой коллега Viktor-Flash проводил тест бесплатных программ для восстановления данных (первая и вторая части). Он рассмотрел две проблемы, которые часто встречаются на флешках с файловой системой FAT32. Несмотря на повреждения, некоторым программам удалось хорошо восстановить данные. Я попробую рассказать о том как именно работают методы, позволяющие вернуть данные и насколько это вообще возможно.

Статья получилась большой, поэтому я разбил ее на части. В первой части расскажу про устройство FAT32 и как восстановить данные в первом тесте (где было стерто все до таблиц FAT).

Как добраться до файла в FAT32

Начну с поверхностного описания того, как хранятся данные внутри FAT32, благо, ее структура достаточно проста в сравнении с другими ФС. Предположим, на флешке есть файл «documentsSecret.doc». Разберемся какой путь проходит драйвер файловой системы, чтобы прочитать данные этого документа.

Когда мы подключаем флешку к компьютеру, то первым делом ОС проверяет ее 0й сектор. В нем почти всегда записан Master Boot Record (MBR), там перечислены диапазоны секторов, которые заняты разделами. На флешках раздел почти всегда один, начинается он обычно (но не всегда) в 63 или 2048 секторе и занимает почти все доступное пространство.

В MBR записана байтовая метка, которая указывает на тип раздела. У FAT32 это 0x0B или 0x0С. Далее, надо прочитать первый сектор раздела, в котором должен находиться BootFAT32. Из него мы можем узнать много полезной информации:

  • размер кластера (блок которым оперирует ФС);
  • количество, размер и расположение таблиц FAT (обычно 1 или 2, про их назначение расскажу дальше);
  • начало области кластеризации — той области, которая разбита на кластеры и которая доступна для записи пользовательских данных;
  • кластер с корневым каталогом, он же Root (часто это 2й кластер)*.

*Примечание: в FAT32 область кластеризации нумеруется со 2го кластера, т. е. Root нередко находится в самом начале этой области.

Каждой папке в FAT соответствует списочная структура, которая так и называется — FAT Folder (или каталог FAT). Это список подкаталогов и файлов, которые содержит конкретный каталог. В каждом элементе списка указаны: имя, размер для файла, даты создания, удаления, модификации, атрибуты и стартовый кластер (начало файла или расположение соответствующей структуры FAT Folder для подкаталога).

Важный момент, которым мы потом воспользуемся. Любой каталог FAT, кроме корневого, начинается с 2х стандартных элементов. Это описатели самого себя ‘.’ и родителя ‘..’. А уже далее описатели всех остальных подкаталогов и файлов. Т.е. мы можем проверить номер текущего кластера (стартовый кластер у ‘.’), а также можем подняться на уровень выше в иерархии (перейти к каталогу ‘..’).

Итак, мы нашли и разобрали корневой каталог, нашли в нем запись об подкаталоге с именем «documents». Перешли на указанный кластер, чтобы узнать содержимое папки «documents», разобрали соответствующий FAT Folder. Там нашли описатель для файла «Secret.doc» из которого, в числе прочего, узнали первый кластер файла и размер файла.

Если бы все файлы были непрерывными, то этого уже было бы достаточно для того, чтобы прочитать данные файла. Но для фрагментированных файлов надо еще построить размещение. Таблица FAT как раз и нужна для того, чтобы выставить в правильном порядке кластеры, относящиеся к файлу. Если «TopSecrect.doc» начинается в кластере №100, то в 100й ячейке таблицы будет указано, какой кластер брать следующим, т.е. где лежит второй кластер файла. И так далее по цепочке. В конце цепочки кластеров будет стоять маркер конца. Свободные кластеры также помечены специальным значением 0 (помните, что 0-го кластера нет?), таблица FAT служит еще и для отслеживания свободного/занятого места в разделе.

(картинка с сайта technet.microsoft.com)

Теперь, когда мы более-менее знакомы с устройством FAT32, можно порассуждать о том, как ее лечить.

Тест первый: без boot’ов


Первый тест заключался в том, что было стерто все до начала таблиц FAT. Это значит, что мы потеряли BootFAT32 и его копию (если она была). А вместе с ними еще и кучу полезной информации. Но так ли трудно ее восстановить? Оказывается, что просто.

Начну с таблиц FAT. Мы не знаем где именно их искать, но знаем что они есть. К счастью, таблицы имеют узнаваемую и проверяемую структуру. Поиск основан на следующих наблюдениях:

  • таблица FAT имеет характерное начало (помните 0й и 1й «мифические» кластеры?) — часто 0xF8FFFF0FFFFFFFFF
  • ячейки в таблице FAT (4х байтовые беззнаковые целые) могут содержать либо служебные значения, либо ограничены размером раздела;
  • помимо этого, во всей таблице FAT не должно быть одинаковых значений (кроме служебных);
  • для многих ячеек в таблице можно утверждать, что ячейка N содержит значение N+1, т. е. после кластера N идет кластер N+1. Это сугубо эвристическое наблюдение. Оно справедливо потому, что драйвер ФС все-таки старается размещать данные непрерывно.

Таким образом, мы можем найти таблицу или таблицы FAT и даже определить их размер (как минимум размер значимой части). Сразу после последней таблицы часто находится корневой каталог и, одновременно, начало области кластеризации. Можно проверить это предположение, но есть более универсальный способ.

Помните, что все каталоги FAT, кроме корневого, начинаются с 2х стандартных записей? Так вот, эти записи позволяют очень хорошо их находить среди всех остальных данных. Если мы найдем всего 2 каталога, то получим 2 пары значений: (LBA1, ClusterNo1), (LBA2, ClusterNo2). А это уже школьная задачка на пропорции, из которой сразу находим размер кластера

ClusterSize = (LBA1-LBA2)/(ClusterNo1-ClusterNo2)

и начало области кластеризации (помним «съеденных» кластерах 0 и 1)

ClusterizationStart = LBA1 – (ClusterNo1-2)*ClusterSize

Осталось найти Root. В любом каталоге есть запись о родительском каталоге ‘..’. Если мы будем подниматься по иерархии вверх, то достаточно быстро дойдем до Root (который узнаем, например, по отсутствию записей ‘.’ и ‘..’).

Заключение по первому тесту

Пришлось немного постараться, но все что нужно для полноценного восстановления данных мы нашли: таблицы FAT, начало области кластеризации, размер кластера, положение Root. Можно утверждать, что для таких повреждений есть методика, которая позволяет в большинстве случаев вернуть 100% данных (получить такую же ФС, как раньше), lost forever still can be found… «Меньшинство» случаев — это когда не получилось найти даже парочку FAT Folder или были проблемы с обнаружением таблиц FAT. Однако такие ситуации скорее редкость.

P.S.

Формат хранения данных в FAT32 описан в документе: Microsoft Extensible Firmware Initiative FAT32 File System Specification
Менее подробное описание на technet: FAT File System

Продолжение этой статьи

Полную версию статьи со всеми дополнительными видео уроками смотрите в источнике: https://hetmanrecovery.com/ru/recovery_news/fat-file-system-analisis.htm

Читайте об особенностях восстановления данных с носителя отформатированного в FAT. Существует множество файловых систем: FAT, NTFS, HFS и множество других. Но FAT, одна из самых старых и самых простых файловых систем, по-прежнему широко используется. В FAT32 форматируются практически все карты памяти, используемые в цифровых фотоаппаратах.

Алгоритм поиска данных файловой системы FAT

Файловая система FAT

FAT используется в большинстве портативных аудиоплееров и навигаторов. Даже мобильные телефоны и планшеты под управлением Android используют карты памяти (к примеру, miniSD, microSD), отформатированные в FAT32.

Да, FAT обладает рядом ограничений, как на максимальный объём раздела, так и на максимальный размер файла (в частности, фильмы в HD качестве бывает невозможно разместить одним файлом на разделе, отформатированном в FAT). Да, эта файловая система достаточно примитивна и не обладает встроенными средствами контроля целостности информации, встроенным сжатием и шифрованием, а также разделением прав доступа. Зато у FAT есть свои преимущества: компактность (под нужды файловой системы отводится совсем немного места), простота реализации и низкая ресурсоёмкость. Все эти достоинства и обусловили популярность файловой системы FAT среди разработчиков мобильных устройств.

Файловая система FAT: а что внутри?

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

Для начала стоит рассказать о том, почему восстановление удалённых файлов вообще возможно. Дело в том, что при удалении файла операционная система не стирает и не перезаписывает его содержимого: это было бы неоправданно долго. Вместо этого система просто делает пометку в соответствующей записи файловой системы, освобождая, таким образом, занятые удалённым файлом сектора на диске для использования другими программами.

Этот-то механизм и позволяет специализированным программам восстанавливать содержимое файлов. Достаточно считать записи файловой системы, идентифицировать записи, соответствующие удалённым файлам, и восстановить точные физические адреса этих файлов по данным, взятым опять же из файловой системы. Дальнейшее – дело техники.

К сожалению, такой простой подход возможен не всегда. Если файл был удалён какое-то время назад, или если записи в файловой системе были стёрты или перезаписаны, программе придётся сканировать всю поверхность диска с помощью алгоритмов сигнатурного поиска. Эти алгоритмы работают по принципу антивируса, идентифицируя файлы по известным сигнатурам. У такого подхода есть ряд ограничений: низкая скорость работы, ограниченное количество поддерживаемых форматов и невозможность полноценного восстановления фрагментированных файлов. Тем не менее, на практике эти алгоритмы прекрасно работают, ведь наиболее ценные файлы (документы, фотографии и т.п.) часто бывают небольшого размера и практически не фрагментируются.

Если же требуется восстановить фрагментированный файл, программе приходится комбинировать данные сигнатурного поиска и информацию, полученную из файловой системы – например, для того, чтобы исключить из рассмотрения сектора диска, заведомо занятые другими файлами.

Данные файловой системы

Итак, предположим, что нам нужно восстановить достаточно большой файл, который записан на диске в виде множества фрагментов. С помощью сигнатурного поиска мы сможем найти начало файла, проанализировать заголовок и определить его длину. Но если мы попытаемся сохранить данные, записанные на диске последовательно после заголовка нужного файла, то успешно восстановится только его начало – самый первый сектор. Остальные секторы могут принадлежать другим файлам. Соответственно, наша задача – использовать данные из файловой системы для того, чтобы точно определить: в какой последовательности и в какие именно секторы на диске записаны данные этого файла.

Для того чтобы ориентироваться в записанной на диск информации, Windows создает запись в файловой системе. В этой записи хранится информация, указывающая на то, какие именно секторы на диске (и в какой именно последовательности) содержат данные конкретного файла.

В поисках файловой системы

Алгоритм поиска данных файловой системы FAT

Рис.1 Жесткий диск разбит на разделы.

Для того чтобы использовать данные из файловой системы, саму файловую систему требуется найти. Прежде, чем говорить о файловой системе, нужно кратко описать систему разделов Windows.

Диски в Windows описываются системой разделов, которая содержит одну или несколько таблиц. Каждая таблица описывает один раздел. В записи указывается физический адрес начального сектора раздела и его конечный сектор (или длина). Помимо этого указывается также и тип раздела.

Для того чтобы найти файловую систему, программа проанализирует таблицу разделов Windows, если таковая сохранилась. Но что, если таблицы разделов не существует или в ней содержится неактуальная информация (например, нужный нам раздел был удалён, а на его месте был создан другой раздел)? В этом случае программа прибегнет к сканированию диска с целью поиска файловой системы.

Раздел Начало Конец Тип

System (С:) 0 199 NTFS

Archive (D:) 200 399 FAT

Work (E:) 400 599 FAT

Таб.1 Таблица с информацией о начале, конце и типе каждого раздела.

Для поиска файловой системы будем исходить из предположения, что в каждом разделе диска находилась файловая система. Как правило, файловые системы можно идентифицировать по некоторой постоянной сигнатуре. Например, файловую систему FAT можно идентифицировать по значениям, записанным в байты 510 и 511 первого сектора. Если значения по этим адресам – 0x55 и 0хАА соответственно, то можно приступить к дополнительной проверке.

Дополнительные проверки позволяют отличить случайно встреченную последовательность данных от истинной сигнатуры файловой системы. Проверяется, например, диапазон значений, допустимых для некоторых полей структуры данных. Одно из полей файловой системы FAT определяет количество секторов в кластере. Его значение всегда представляет собой степень двойки из последовательности: 1, 2, 4, 8, 16, 32, 64 или 128. Если по данному адресу содержится любое другое значение, то найденная нами структура не принадлежит файловой системе FAT.

В статье «Алгоритм восстановления файла на диске FAT» мы рассмотрим поиск содержимого удаленного файла на конкретном примере.

Полную версию статьи со всеми дополнительными видео уроками смотрите в источнике: https://hetmanrecovery.com/ru/recovery_news/fat-file-system-analisis.htm

Добавить комментарий