- •Билет №1
- •1. Архитектура ibm pc
- •Билет №21
- •Проектирование программ для защищенного режима процессора.
- •Компьютерные вирусы
- •Билет №22
- •Прерывания защищённого режима
- •Исключения в защищённом режиме
- •Вирусы, замещающие программный код, вирусы-спутники, вирусы, внедряющиеся в программу Вирусы, замещающие программный код (Overwrite)
- •Вирусы-спутники (Companion)
- •Инфицирование методом создания com-файла спутника
- •Обработка аппаратных прерываний
- •Инфицирование методом переименования exe-файла
- •Вирусы, внедряющиеся в программу (Parasitic)
- •Стандартное заражение exe-файлов
- •Билет №23
- •Организация многозадачного режима
- •Сегмент состояния задачи (лекц «структура состояния задачи»)
- •Вызовы функций api
- •Вызов Windows api
- •Адреса и номера функций
- •Соглашения о вызовах
- •Обзор структуры pe-файла
- •Выбор базового адреса образа pe-файла в памяти
- •Импорт функций
- •Экспорт функций
- •Заражение файлов формата pe-executable
- •Билет №24
- •Системные регистры процессора ldtr, gdtr, tr, idtr, cr0-cr3. Теневые регистры
- •Макровирусы для Windows
Билет №21
Проектирование программ для защищенного режима процессора.
Формирование физического адреса в защищенном режиме
Основная идея защищенного режима — оградить исполняемые процессором программы от взаимного влияния. В защищенном режиме процессор реализует различные механизмы безопасности. В контексте нашего изложения интерес представляет защита по доступу к памяти. Для введения любого охранного механизма нужно иметь как можно больше информации об охраняемых объектах. Для процессора такими объектами являются исполняемые им программы. Организуя защиту программ по доступу к памяти, фирма Intel не стала нарушать принцип сегментации, свойственный ее процессорам. Так как каждая программа занимает один или несколько сегментов в памяти, то логично иметь больше информации об этих сегментах, как об объектах, реально существующих в данный момент в вычислительной системе. Если каждому из сегментов присвоить определенные атрибуты, то часть функций по контролю за доступом к ним можно переложить на процессор. Что и было сделано. Любой сегмент памяти в защищенном режиме имеет следующие основные атрибуты:
расположение сегмента в памяти;
размер;
уровень привилегий (определяет права данного сегмента относительно других сегментов);
тип доступа (определяет назначение сегмента).
В отличие от реального режима в защищенном режиме программа уже не может запросто обратиться по любому линейному адресу памяти. Для этого она должна иметь определенные полномочия и удовлетворять ряду требований. Ключевым объектом защищенного режима является специальная структура — дескриптор сегмента, который представляет собой 8-байтовый дескриптор (краткое описание) непрерывной области памяти, содержащий перечисленные выше атрибуты. На рис. 1.5 представлена структура дескриптора сегмента. Охарактеризуем назначение некоторых полей дескриптора сегмента:
LIMIT_1 и LIMIT_2 — 20-разрядное поле, определяющее размер сегмента;
BASE_1 И BASE_2 — 32-разрядное поле, содержит значение линейного адреса начала сегмента в памяти;
AR — байт, поля которого определяют права доступа к сегменту;
D — бит разрядности операндов и адресов;
G — бит гранулярности.
Рис. 1.5. Структура дескриптора сегмента защищенного режима процессора
В защищенном режиме размер сегмента не фиксирован, его расположение можно задать в пределах 4 Гбайт. Если посмотреть на рисунок, то возникнет вопрос: почему разорваны поля, определяющие размер сегмента и его начальный (базовый) адрес? Это результат эволюции процессоров. Защищенный режим впервые появился в процессоре i80286. Он имел 24-разрядную адресную шину и, соответственно, мог адресовать в защищенном режиме до 16 Мбайт оперативной памяти. Для этого ему достаточно было иметь в дескрипторе поле базового адреса в 24 бита и поле размера сегмента длиной 16 бит. После появления процессора i80386 с 32-разрядными шинами команд и данных в целях совместимости программ разработчики не стали менять формат дескриптора, а просто использовали свободные поля. Внутри процессора эти поля объединены. Внешне же они остались разделенными, с чем приходится мириться при программировании. Следующий интересный момент связан с тем, что размер сегмента в защищенном режиме может достигать 4 Гбайт, то есть сегмент способен занимать все доступное физическое пространство памяти. Как это возможно, если суммарный размер поля размера сегмента составляет всего 20 бит, что соответствует величине 1 Мбайт? Секрет скрыт в поле гранулярности — бит G (см. рис. 1.5). Если G = 0, то значение в поле размера сегмента является размером сегмента в байтах, если G = 1, — в страницах. Размер страницы равен 4 Кбайт. Нетрудно подсчитать, что при максимальном значении поля размера сегмента 0fffffh это соответствует 1 М страниц или величине 1 М x 4 Кбайт = 4 Гбайт. Выведение информации о базовом адресе сегмента и его размере на уровень процессора позволяет аппаратно контролировать, как программы работают с памятью, и предотвращать обращения к адресам, находящимся вне сегмента. Другой аспект защиты заключается в том, что сегменты неравноправны в правах доступа к ним. Информация об этом содержится в специальном байте AR, входящем в состав дескриптора. Тип сегмента определяют следующие элементы байта AR: поле DPL, биты R/W, C/ED и I. Поле DPL — часть механизма защиты по привилегиям. Суть его выражается тем, что конкретный сегмент может находиться на одном из четырех уровней привилегированности с номерами 0, 1, 2 и 3. Максимум поблажек предоставляется уровню 0. Существует ряд ограничений (опять-таки на аппаратном уровне) на взаимодействие сегментов кода, данных и стека с различными уровнями привилегий. Таким образом, в защищенном режиме перед использованием любой области памяти должна быть проведена определенная работа по инициализации соответствующего дескриптора. Эту работу выполняет операционная система или программа, сегменты которой также описываются подобными дескрипторами. Все дескрипторы собираются вместе в одну из трех таблиц:
глобальная таблица дескрипторов (Global Descriptor Table, GDT), адрес которой хранится в регистре GDTR;
локальная таблица дескрипторов (Local Descriptor Table, LDT), ее адрес находится в регистре LDTR;
таблица дескрипторов векторов прерываний (Interrupt Descriptor Table, IDT), ее адрес хранится в регистре IDTR.
В какую именно таблицу должен быть помещен дескриптор, определяется его назначением. Адрес, по которому размещаются эти дескрипторные таблицы, может быть любым; он хранится в специально предназначенном для этого системном РЕГИСТРЕ. Схемы, показанные на рис. 1.3, б и в, иллюстрируют принцип формирования адреса в защищенном режиме. Важно отметить изменение роли сегментных регистров. В защищенном режиме они содержат не адрес, а селектор, то есть указатель на соответствующую ячейку одной из таблиц дескрипторов ( GDT или LDT).
