Чтение онлайн

на главную - закладки

Жанры

Восстановление данных. Практическое руководство

Касперски Крис

Шрифт:

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
). Однако эти подходы муторны и утомительны.

В общем, скелет нашего загрузчика будет выглядеть так, как показано в листинге 5.8.

Листинг 5.8. Скелет простейшего загрузчика, написанный на FASM

use16

ORG 7C00h

CLD ; Копируем слева направо

; (в сторону увеличения адресов)

MOV SI,7C00h ; Откуда копировать

MOV DI,7E00h ; Куда копировать

MOV CX,200h ;
Длина сектора

REP MOVSB ; Копируем

; // Выбираем раздел, который мы хотим загрузить,

; // считываем его в память по адресу 0000:7C00h

; // (см. листинги 5.7 и 5.6)

JMP 0000:7C00h ; Передаём управление на загрузочный сектор

Записываем загрузчик в главную загрузочную запись

Под старушкой MS-DOS записать свой загрузчик в MBR было просто. Для этого достаточно дернуть прерывание

INT 13h
, функция
03h
(запись сектора). Но под Windows NT этот прием уже не работает, и приходится прибегать к услугам функции
CreateFile
. Если вместо имени открываемого файла указать название устройства, например,
\\.\PHYSICALDRIVE0
(первый физический диск), мы сможем свободно читать и записывать его сектора вызовами
ReadFile
и
WriteFile
соответственно. При этом флаг
dwCreationDisposition
должен быть установлен на значение
OPEN_EXISTING
, а флаг
dwShareMode
— на значение
FILE_SHARE_WRITE
. Еще потребуются права системного администратора, иначе ничего не получится.

Законченный пример вызова

CreateFile
выглядит, как показано в листинге 5.9.

Листинг 5.9. Открытие непосредственного доступа к жесткому диску под Windows NT

XOR EAX,EAX

PUSH EAX ; hTemplateFile

PUSH dword FILE_ATTRIBUTE_NORMAL ; dwFlagsAndAttributes

PUSH dword OPEN_EXISTING ; dwCreationDisposition

PUSH EAX ; lpSecurityAttributes

PUSH dword FILE_SHARE_WRITE ; dwShareMode

PUSH dword (GENERIC_WRITE OR GENERIC_READ) ; dwDesiredAccess

PUSH DEVICE_NAME ; Имя устройства

CALL CreateFile ; Открываем устройство

INC EAX

TEST EAX,EAX

JZ error

DEC EAX

...

DEVICE_NAME db "\\.\PHYSICALDRIVE0",0

BUF RB 512 ; Буфер

Открыв физический диск и убедившись в успешности этой операции, мы должны прочитать оригинальный MBR-сектор в буфер, перезаписать первые

1BBh
байт, ни в коем случае не трогая таблицу разделов и сигнатуру
55h AAh
(мы ведь не хотим, чтобы диск перестал загружаться, верно?). Теперь остается записать обновленный код MBR на место и закрыть дескриптор устройства. После перезагрузки все изменения вступят в силу.

Примечание

Правда, вполне возможно, что внесенные вами изменения и не подумают вступать в силу. Загрузчик жестоко мстит за малейшие ошибки проектирования. Поэтому, чтобы не потерять содержимое своих разделов, для начала лучше попрактиковаться на VMWare или любом другом эмуляторе PC.

Под Windows 9x, разумеется, трюк с

CreateFile
не работает. Но там можно воспользоваться симуляцией прерываний из DMPI или обратиться к драйверу ASPI. Оба способа были подробно описаны в моей книге "Техника защиты компакт-дисков от копирования". Однако, хотя в ней речь идет о CD, а не о HDD, жесткие диски программируются аналогично.

Прежде чем писать собственный загрузчик, рекомендуется изучить существующие нестандартные загрузчики. Все перечисленные ниже загрузчики распространяются по лицензии GPL или BSD, то есть без ограничений.

Поделиться:
Популярные книги

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Гарем на шагоходе. Том 1

Гремлинов Гриша
1. Волк и его волчицы
Фантастика:
боевая фантастика
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Гарем на шагоходе. Том 1

Академия проклятий. Книги 1 - 7

Звездная Елена
Академия Проклятий
Фантастика:
фэнтези
8.98
рейтинг книги
Академия проклятий. Книги 1 - 7

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Сломанная кукла

Рам Янка
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сломанная кукла

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Этот мир не выдержит меня. Том 2

Майнер Максим
2. Первый простолюдин в Академии
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Этот мир не выдержит меня. Том 2