Крис Касперски - Восстановление данных. Практическое руководство
- Название:Восстановление данных. Практическое руководство
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2006
- Город:Санкт-Петербург
- ISBN:5-94157-455-X
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Крис Касперски - Восстановление данных. Практическое руководство краткое содержание
Книга представляет собой пошаговое руководство по восстановлению поврежденных данных на жестких и оптических дисках. Подробно рассмотрена структура популярных файловых систем: NTFS, ext2/ext3, UFS/FFS и др. Описаны автоматические методы восстановления данных для операционных систем Windows и Linux. Приведены способы ручного восстановления, используемые в случае, когда автоматическое восстановление невозможно. Материал сопровождается большим количеством полезных советов и исчерпывающим справочным материалом. На компакт-диске помешены полезные утилиты и исходные коды, приведенные в книге.
Для пользователей ПК
Восстановление данных. Практическое руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
MOV CX, [SI+2] ; Стартовый сектор с цилиндром INT 13h
JC error ; Ошибка чтения
;Обрабатываем считанный boot-сектор или расширенную таблицу разделов
;===================================================================
;
CMP byte [SI], 80h
JZ LOAD_BOOT ; Это загрузочный сектор
; Передаем на него управление
CMP byte [SI+4], 05h
JZ LOAD_CHS_EXT ; Это расширенная таблица разделов
; в формате CHS
CMP byte [SI+4], 0Fh
JZ LOAD_LBA_EXT ; Это расширенная таблица разделов
; в формате LBA
ADD SI, 10h ; Переходим на следующий раздел
CMP SI, 1EEh
JNA read_all_partitions ; Читаем все разделы один за другим
...
buf rb 512 ; Буфер на 512 байт
Запись сектора в режиме CHS происходит практически точно так же, только регистр AH
равен не 02h
, a 03h
. С режимом LBA разобраться намного сложнее, но мы, как настоящие хакеры, его обязательно осилим.
Чтение сектора осуществляется функцией 42h
( AH = 42h
). В регистр DL
, как и прежде, заносится номер привода, а вот регистровая пара DS:SI
указывает на адресный пакет (disk address packet), представляющий собой продвинутую структуру формата, описанного в табл. 5.4.
Таблица 5.4. Формат адресного пакета, используемый для чтения и записи секторов в режиме LBA
Смещение | Тип | Описание |
---|---|---|
00h |
BYTE |
Размер пакета — 10h или 18h |
01h |
BYTE |
Поле зарезервировано и должно быть равно нулю |
02h |
WORD |
Сколько секторов читать |
04h |
DWORD |
32-разрядный адрес буфера-приемника в формате seg:offs |
08h |
QWORD |
Стартовый номер сектора для чтения |
10h |
QWORD |
64-разрядный плоский адрес буфера-приемника. Используется только в случае, если 32-разрядный адрес равен FFFF:FFFF |
Код, читающий сектор в режиме LBA, в общем случае выглядит так, как показано в листинге 5.7.
Листинг 5.7. Код, осуществляющий чтение сектора с диска в режиме LBA
MOV DI, 1BEh ; Перейти к первому разделу
MOV AX, CS ; Настраиваем...
MOV buf_seg ; ...сегмент
MOV EAX, [DI+08h] ; Смещение partition относительно
; начала раздела
ADD EAX, EDI ; EDI должен содержать номер сектора
; текущего MBR
MOV [X_SEC] ;
...
read_all_partitions:
MOV АН, 42h ; Читать сектор в режиме LBA
MOV DL, 80h ; Читать с первого диска
MOV SI, dap ; Смещение адресного пакета INT 13h
JC error ; Ошибка чтения
...
dap:
packet_size db 10h ; размер пакета 10h байт
reserved db 00h ; "Заначка" для будущих расширений
N_SEC dw 01h ; Читаем один сектор
buf_seg dw 00h ; Сюда будет занесен сегмент буфера-приемника
buf_off dw buf ; Смещение буфера-приемника
X_SEC dd 0 ; Сюда будет занесен номер сектора для чтения
dd 0 ; Реально не используемый хвост
; 64-битного адреса
buf rb 512 ; Буфер на 512 байт
Запись осуществляется аналогично чтению, только регистр AH
содержит не 42h
, a 43h
. Регистр AL
определяет режим: если бит 0 равен 1, BIOS выполняет не запись, а ее эмуляцию. Бит 2, будучи взведенным, задействует запись с проверкой. Если регистр AL
равен 0, выполняется обыкновенная запись по умолчанию.
Теперь, освоившись с дисковыми прерываниями, перейдем к обсуждению остальных аспектов программирования.
Лучше всего загрузчики программируются на FASM. С точки зрения ассемблера загрузчик представляет собой обыкновенный двоичный файл, предельно допустимый объем которого составляет 1BBh
(443) байт. Немного? Но не будем спешить с выводами. Всякий раздел всегда начинается с начала цилиндра, а это значит, что между концом MBR и началом раздела имеется, по меньшей мере, n свободных секторов, где n == sectors per track
. Практически все современные винчестеры имеют по 64 сектора на дорожку, что дает нам: 443 + 63*512 == 32 699
байт или приблизительно 32 Кбайт. Да в этот объем даже графический интерфейс с мышью уместить можно! Однако делать этого мы не будем. Настоящие хакеры работают в текстовом режиме с командной строкой.
Как уже говорилось, BIOS загружает MBR по адресу 7C00h
, поэтому в начале ассемблерного кода должна стоять директива ORG 7C00h
, а еще — USE16
, ведь загрузчик выполняется в 16-разрядном реальном режиме. Позже, при желании, он может перейти в защищенный режим, но это будет уже потом. Не будем лезть в такие дебри.
Обнаружив загрузочный раздел (а обнаружить это можно по флагу 80h
, находящемуся по нулевому смещению от начала раздела), загрузчик должен считать первый сектор этого раздела, поместив его в памяти по адресу 0000:7C00h
, то есть в точности поверх своего собственного тела. А вот это уже нехорошо! И чтобы не вызвать крах системы, загрузчик должен заблаговременно перенести свое тело по другому адресу, что обычно осуществляется командой MOVSB
. Копироваться можно по любому из адресов памяти — от 0080:0067h
до 9FE00h
. Память, расположенную ниже 0080:0067h
, лучше не трогать, так как здесь находятся вектора прерываний и системные переменные BIOS, а от A000h
и выше начинается область отображения ПЗУ, так что предельно доступный адрес равен A000h - 200h (размер сектора) == 9FE00h
.
Не забывайте, что трогать регистр DL
ни в коем случае нельзя, поскольку в нем передается номер загрузочного привода. Некоторые загрузчики содержат ошибку, всегда загружаясь с первого жесткого диска, и это в то время, как BIOS уже больше 10 лет как позволяют менять порядок загрузки, и потому загрузочным может быть любой привод.
По правде говоря, FASM — это единственный известный мне ассемблер, "переваривающий" команду дальнего вызова JMP 0000:7C00h
напрямую. Все остальные ассемблеры заставляют извращаться приблизительно так: PUSH offset_of_target/PUSH segment_of_target/RETF
. Здесь мы заталкиваем в стек сегмент и смещение целевого адреса и выполняем дальний RETF
, переносящий нас на нужное место. Еще можно воспользоваться самомодифицирующимся кодом, собрав команду JMP FAR
"вручную", или просто расположить целевой адрес в одном сегменте с исходным адресом (например, 0000:7C00h
→ 0000:7E00h
). Однако эти подходы муторны и утомительны.
Интервал:
Закладка: