Восстановление данных - страница 66
>03 00
. Данная последовательность представляет собой номер последовательности обновления. Сверяем его с содержимым двух последних байт этого и следующего секторов (смещения >1FEh
и >3FEh
соответственно). Они равны! Следовательно, данная файловая запись цела (по крайней мере, на первый взгляд), и можно переходить к операции ее восстановления. По смещению >2Ch
расположен массив, содержащий оригинальные значения последовательности обновления. Количество элементов в нем равно содержимому 16-разрядного поля, расположенному по смещению >06h
от начала сектора и уменьшенного на единицу (в данном случае имеем >03h - 01h == 02h
). Извлекаем два слова, начиная со смещения >2Ch
(в данном случае они равны >00 00
и >00 00
) и записываем их в конец первого и последнего секторов.Теперь нам необходимо выяснить, используется ли данная файловая запись, или же ассоциированный с ней файл или каталог был удален. 16-разрядное поле, расположенное по смещению >16h
, содержит значение >01h
. Следовательно, перед нами файл, а не каталог, и этот файл еще не удален. Но является ли эта файловая запись базовой для данного файла или мы имеем дело с ее продолжением? 64-разрядное поле, расположенное по смещению >20h
, равно нулю, следовательно, данная файловая запись — базовая.
Очень хорошо, теперь переходим к исследованию атрибутов. 16-разрядное поле, находящееся по смещению >14h
, равно >30h
, следовательно, заголовок первого атрибута начинается со смещения >30h
от начала сектора.
Первое двойное слово атрибута равно >10h
, значит, перед нами атрибут типа >$STANDARD_INFORMATION
. 32-разрядное поле длины атрибута, находящееся по смещению >04h
и равное в нашем случае >60h
байт, позволяет нам вычислить смещение следующего атрибута в списке: >30h
(смещение нашего атрибута) >+ 60h
(его длина) >== 90h
(смещение следующего атрибута). Первое двойное слово следующего атрибута равно >30h
, значит, это атрибут типа >$NAME
, и следующее 32-разрядное поле хранит его длину, равную в данном случае >70h
. Сложив длину атрибута с его смещением, мы получим смещение следующего атрибута — >90h + 70h == 100h
. Первое двойное слово третьего атрибута равно >80h
, следовательно, это атрибут типа >$DATA
, хранящий основные данные файла. Складываем его смещение с длиной — >100h + 32h == 132h
. И вот здесь мы наткнулись на частокол >FFFFFFh
, сигнализирующий о том, что атрибут >$DATA
последний в списке.
Теперь, разбив файловую запись на атрибуты, можно приступить к исследованию каждого из атрибутов в отдельности. Начнем с разбора имени. 8-разрядное поле, находящееся по смещению >08h
от начала атрибутного заголовка (и по смещению >98h
от начала сектора), содержит флаг нерезидентности. В данном случае этот флаг равен нулю. Это значит, атрибут резидентный, и его тело хранится непосредственно в самой файловой записи, что уже хорошо. 16-разрядное поле, расположенное по смещению >0Сh
от начала атрибутного заголовка (и по смещению >9Ch
от начала сектора) равно нулю, следовательно, тело атрибута не сжато и не зашифровано. Таким образом, можно приступать к разбору тела атрибута. 32-разрядное поле, расположенное по смещению >10h
от начала атрибутного заголовка (и по смещению >A0h
от начала сектора), содержит длину атрибутного тела, равную в данном случае >54h
байт. 16-разрядное поле, расположенное по смещению >14h
от начала атрибутного заголовка и по смещению >A4h
от начала сектора, хранит смещение атрибутного тела, равное в данном случае >18h
. Следовательно, тело атрибута >$FILE_NAME
располагается по смещению >A8h
от начала сектора.
Формат атрибута типа >$FILE_NAME
описан в табл. 6.9. Первые восемь байт содержат ссылку на родительский каталог этого файла, равную в данном случае >11ADBh:01
(индекс — >11ADBh
, номер последовательности — >01h
). Следующие 32 байта содержат данные о времени создания, изменения и времени последнего доступа к файлу. По смещению >28h
от начала тела атрибута и >D0h
от начала сектора лежит 64-разрядное поле выделенного размера, а за ним — 64-разрядное поле реального размера. Оба равны нулю, что означает, что за размером файла следует обращаться к атрибутам типа