Восстановление данных. Практическое руководство
00000000: 46 49 4C 45-2A 00 03 00-7C 77 1A 04-02 00 00 00 FILE*...|w......00000010: 01 00 02 00-30 00 01 00-28 02 00 00-00 04 00 00 ....0...(.......00000020: 00 00 00 00-00 00 00 00-06 00 06 00-00 00 47 11 ..............G....000001F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00 ................<-- Конец первого сектора файловой записи000003F0: 07 СС E1 0D-00 09 00 00-FF FF FF FF-82 79 47 11 .Іа..... ВyG.<-- Конец второго сектора файловой записиВнимание!,FILE Record,INDEX RecordилиRCRD Recordискажены последовательностями обновления и в обязательном порядке должны быть восстановлены перед их использованием, в противном случае вместо актуальных данных вы получите мусор!RSTR RecordАтрибуты
Структурно всякий атрибут состоит из атрибутного заголовка (attribute header) и тела атрибута (attribute body). Заголовок атрибута всегда хранится в файловой записи, расположенной внутри MFT. Тела резидентных атрибутов хранятся там же. Нерезидентные атрибуты хранят свое тело вне MFT, в одном или нескольких кластерах, перечисленных в заголовке данного атрибута в специальном списке. Если 8-разрядное поле, расположенное по смещению
байт от начала атрибутного заголовка, равно нулю, то атрибут считается резидентным, а если единице, то атрибут нерезидентен. Любые другие значения недопустимы.08hПервые четыре байта атрибутного заголовка определяют его тип. Тип атрибута, в свою очередь, определяет формат представления тела атрибута. В частности, тело атрибута данных (тип:
—80h) представляет собой "сырую" последовательность байт. Тело атрибута стандартной информации (тип:$DATA—10h) описывает время его создания, права доступа и т.д. Более подробно эта тема будет рассмотрена далее в данной главе.$STANDARD_INFORMATIONСледующие четыре байта заголовка содержат длину атрибута, выражаемую в байтах. Длина нерезидентного атрибута равна сумме длин его тела и заголовка, а длина резидентного атрибута равна длине его заголовка. Если к смешению атрибута добавить его длину, мы получим указатель на следующий атрибут (или маркер конца, если текущий атрибут — последний в цепочке).
Длина тела резидентных атрибутов, выраженная в байтах, хранится в 32- разрядном поле, расположенном по смещению 10h байт от начала атрибутного заголовка. 16-разрядное поле, следующее за его концом, хранит смещение резидентного тела, отсчитываемое от начала атрибутного заголовка. С нерезидентными атрибутами в этом плане все намного сложнее, и для хранения длины их тела используется множество полей. Реальный размер тела атрибута (real size of attribute), выраженный в байтах, хранится в 64-разрядном поле, находящемся по смещению 30h байт от начала атрибутного заголовка. Следующее за ним 64-разрядное поле хранит инициализированный размер потока (initialized data size of the stream), выраженный в байтах. Судя по всему, инициализированный размер потока всегда равен реальному размеру тела атрибута. 64-разрядное поле, расположенное по смещению
байт от начала атрибутного заголовка, хранит выделенный размер (allocated size of attribute), выраженный в байтах и равный реальному размеру тела атрибута, округленному до размера кластера (в большую сторону).28hДва 64-разрядных поля, расположенные по смещениям
и10hбайт от начала атрибутного заголовка, задают первый (starting VCN) и последний (last VCN) номера виртуального кластера, принадлежащего телу нерезидентного атрибута. Виртуальные кластеры представляют собой логические номера кластеров, не зависящие от своего физического расположения на диске. В подавляющем большинстве случаев номер первого кластера тела нерезидентного атрибута равен нулю, а последний — количеству кластеров, занятых телом атрибута, уменьшенному на единицу. 16-разрядное поле, расположенное по смещению18hот начала атрибутного заголовка, содержит указатель на массив20h, расположенный внутри этого заголовка и описывающий логический порядок размещения нерезидентного тела атрибута на диске.Data RunsКаждый атрибут имеет свой собственный идентификатор (attribute ID), уникальный для данной файловой записи и хранящийся в 16-разрядном поле, расположенном по смещению
от начала атрибутного заголовка.0EhЕсли атрибут имеет имя (attribute Name), то 16-разрядное поле, расположенное по смещению
байт от атрибутного заголовка, содержит указатель на него. Для безымянных атрибутов оно равно нулю (большинство атрибутов имен не имеют). Имя атрибута хранится в атрибутном заголовке в формате UNICODE, а его длина определяется 8-разрядным полем, расположенным по смещению0Ahбайт от начала атрибутного заголовка.09hЕсли тело атрибута сжато, зашифровано или разрежено, 16-разрядное поле флагов, расположенное по смещению
байт от начала атрибутного заголовка, не равно нулю.0ChОсновные поля резидентных и нерезидентных атрибутов кратко описаны в табл. 6.4 и 6.5. Остальные поля не играют существенной роли, и потому здесь они не рассматриваются.
Таблица 6.4. Структура резидентного атрибута
Смещение Размер (байт) Значение Описание 00h4 Тип атрибута (например, ,0x10,0x60)0xB004h4 Длина атрибута, включая этот заголовок 08h1 00hФлаг нерезидентности (non-resident flag) 09h1 NДлина имени атрибута (ноль, если атрибут безымянный) 0Ah2 18hСмещение имени (ноль, если атрибут безымянный) 0Ch2 00hФлаги Значение Описание 0001hСжатый атрибут (compressed) 4000hЗашифрованный атрибут (encrypted) 8000hРазреженный атрибут (sparse) 0Eh2 Идентификатор атрибута (attribute ID) 10h4 LДлина тела атрибута, без заголовка 14h2 2N+18hСмещение тела атрибута 16h1 Индексный флаг 17h1 00hИспользуется для выравнивания 18h2N UNICODEИмя атрибута (если есть) 2N+18hL Тело атрибута