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

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

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


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

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

Для работы может быть использована любая утилита (для FAT, NTFS), работающая на уровне секторов (LBA) дисков загруженная с «флэшки» (так как логические структуры диска были запорчены, то пришлось работать на уровне секторов диска).

Нахождение раздела NTFS можно определить по информации  таблицы разделов, которая располагается  в MBoot-секторе (MBR) жесткого диска (который находится в блоке данных первого сектора, нулевого цилиндра, нулевой поверхности) с адреса 1BEh (см. рис. 1).

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

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

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

В 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.

Смотрим содержимое начального сектора файла $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).

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

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

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

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

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

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

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

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

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

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

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

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

В начале записи (на рис. 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. Начальный сектор начального кластера файла SER.doc

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

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


Лицензия