Алгоритм - Учебный центр

Версия сайта для слабовидящих
Заполните форму ниже! Мы вам перезвоним!

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


Процедура «спасения» файла SER.doc (его текстовой части) из раздела NTFS.

Процедура «спасения» файла SER.doc из раздела NTFS.

На учебном практическом занятии было дано задание «спасти» файл SER.doc (его текстовую часть) из раздела NTFS. Для работы была применена утилита, загруженная с «флэшки». Так как логические структуры диска были запорчены, то пришлось работать на уровне секторов диска. Нахождение раздела NTFS можно определить по информации таблицы разделов, которая располагается в MBoot-секторе жесткого диска (который находится в блоке данных первого сектора, нулевого цилиндра, нулевой поверхности) с адреса 1BEh (см. рис. 1).

Смотрим вторую (16-ти байтную) строку таблицы разделов, которая начинается с адреса 1CEh. В байте по адресу 1D2h содержится код 07, что означает тип файловой системы раздела – NTFS. Четыре байта с адреса 1D8h содержат количество кластеров предшествующих этому разделу жесткого диска (т.е. LBA адрес начального сектора раздела): 00 10 80 02 h (т. е. LBA 02801000h). Мы знаем, что любой раздел начинается с BOOT-сектора, находим его (см. рис. 2).

 

Рис. 1. MBoot-сектор.

В Boot-секторе раздела NTFS с адреса 30h восемь байтов содержат номер начального кластера файла $MFT: 00 00 0C 00 00 00 00 00 (т.е. номер начального кластера равен 0С0000h).

Определим размер кластера по содержимому байта Boot-сектора с адресом 0Dh: 08h (кластер содержит 8 секторов). Уточним размер блока данных сектора, он содержится в двух байтах с адреса 0Ch: 00 02 (т.е. 200h или 512 в десятичной системе). Восемь байтов начиная с 03h содержат имя файловой системы раздела: 4E 54 46 53 20 20 20 20 (в символьном виде это будет : NTFS и четыре пробела далее).

Произведем расчеты для нахождения файла $MFT. Его начальный кластер 0С0000h, в каждом кластере по 8 секторов: 0C0000 x 8 = 600000h (столько секторов надо отсчитать от начального сектора раздела чтобы выйти на начальный сектор файла $MFT). Далее вычислим адрес начального сектора файла $MFT: к адресу начального сектора раздела 2801000h прибавим 600000h и получаем 2E01000h.

 

Рис. 2. Boot-сектор.

Смотрим содержимое начального сектора файла $MFT (см. рис. 3), т. е. мы смотрим начало записи файла $MFT с номером 0 (эта однокилобайтная запись определяет сам файл $MFT). Каждая запись должна начинаться с сигнатуры FILE. В нашем секторе (на рис. 3) это соблюдено, смотрим атрибут с типом 30 записи должен содержать имя файла $MFT в кодировке Unicode – это тоже есть (c адреса 98h в нашем секторе четыре байта содержат тип атрибута 30 00 00 00h, байт по адресу 0A1h (восьмой от начала атрибута с типом 30 содержит 00h , что означает – атрибут резидентен т.е. тело атрибута находится внутри атрибута). С адреса 1F2h видим имя файла в кодировке Unicode: 24 00 4D 00 46 00 54 00 ($MFT).

Так как нужный нам файл SER.doc находится в корневом каталоге, то находим запись файла $MFT с номером 5, которая определяет индексный файл корневого каталога (см. рис. 4).

 

Рис. 3. Запись файла $MFT с номером 0 (начало).

 

Рис. 4. Запись файла $MFT с номером 5 (начало).

По адресу 008h во второй половине однокилобайтной записи (рис. 4), которая начинается в секторе c x02E01008h видим блок VCN: 41 01 09 18 02 01 (41 – определяет размерность полей: первое поле – 1байт; второе 4 байта). Первое поле определяет количество кластеров в экстенте файла, а второе – номер начального кластера экстента (01 02 18 09 h).

Вычислим номер начального сектора корневого каталога: 01021809h x 8h(кол. секторов в кластере) = 810С048h (колич. секторов до корн. кат.). Прибавим к 2801000h (нач. сектор нашего раздела) + 810С48h = A90D048h (это номер начального сектора корневого каталога, см. рис. 5).

 

Рис. 5. Начальный сектор корневого каталога.

Каталог начинается с сигнатуры INDX (см. рис. 5). Каталог состоит из стандартных блоков, которые начинаются с 6-ти байтов содержащих номер записи файла $MFT, которая определяет файл, имя которого содержится в этом блоке (в конце блока). Первый блок каталога начинается с адреса 58h (рис. 8 : начало 04 00 00 00 00 00, конец: с адреса 0AAh расположено имя файла $AttrDef в кодировке Unicode). Просматривая блоки корневого каталога находим блок с именем SER.doc (рис. 6).

Предыдущий блок заканчивается именем IRS, которое не переходит из первых 8-ми байтов текущей строки (на рис. 6), поэтому следующий блок начинается с 8-го байта этой же строки (с адреса 78h) и мы видим в первых 6-ти байтах номер записи файла $MFT, которая определяет нужный нам файл с именем SER.doc: 39 00 00 00 00 00 (это номер записи файла $MFT, которая определит экстенты файла SER.doc.

Адрес начального сектора файла $MFT равен 2E01000h. Вычислим номер сектора с которого начинается 39-я запись файла $MFT (каждая запись занимает 2 сектора):

02E01000h + (39hx 2сект.) = 02E01000h + 72h = 02E01072h (это номер начального сектора записи с номером 39 – см. рис. 7).

В начале записи (на рис. 7) видим сигнатуру FILE. В атрибуте c типом 30 видим (с адреса 0А2h) имя нашего файла в кодировке Unicode: SER.doc), а с адреса 128h начинается атрибут с типом 80 (первые четыре байта содержат тип атрибута - 80 00 00 00). С адреса 168h начинается цепочка блоков VCN, каждый такой блок определяет экстент файла.

Начальный экстент: VCN = 31 01 13 1D 02 ( т.е. номер начального кластера = 021D13, и в экстенте всего 1 кластер). Определим сколько секторов содержится в 021D13 кластерах: (021D13h x 8h = 10E898h).

Вычислим номер начального сектора нашего файла SER.doc : 2801000h (колич. сект. до нашего раздела) + 10E898h = 290F898h (это номер начального сектора файла SER.doc – см. рис. 8). Первая «порция» файла занимает кластер (8 секторов) , здесь находится и основная содержательная часть файла, которую мы должны найти. Просматривая секторы этого кластера находим нужную нам информацию нашего файла (см. рис. 9), которая занимает всего 1,5 объема сектора. Выделив необходимую для «спасения» информацию копируем и сохраняем в виде текстового файла на флэшку (учебное задание выполнено – файл спасен).

 

Рис. 6. Продолжение корневого каталога (см. блоки с именами IRS и SER.doc).

 

Рис. 7. 39-я запись файла $MFT (начало).

 

Рис. 8. Начальный сектор начального кластера файла SER.doc

 

Рис. 9. Искомый файл SER.doc (его текстовая часть занимает примерно 1,5 сектора из начального кластера файла: SER. ZZZ……ZZSER ).

 


Лицензия