Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Ring0

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-062-1


Уход в нулевое кольцо защиты Win9x

Писать вири под Win32, не используя возможностей Ring0 – это все равно что писать DOS-вирусы, не пользуясь тринадцатым прерыванием или портами ввода/вывода :). В этой статье мы научимся одному из важнейших вирмейкерских приемов - проникновению в нулевое кольцо защиты Windows9x!

Перво-наперво я вкратце расскажу тебе о том, что такое protected mode aka защищенный режим. Ты спрашиваешь, зачем вирмейкеру знать PM? Хм. На релизе Win95 Гейтс сказал, что новая система на 100% защищена от вирусной угрозы, так как, благодаря использованию особых технологий, она незаражаема в принципе. Он имел в виду, что все взаимодействие потенциального вирмейкера с системой будет проходить не напрямую, а через некий шлюз. Роль такого шлюза в Win32-системах играет API. На эту тему можно еще много разглагольствовать, но факт остается фактом: если писать под Windows традиционным, так сказать, официальным способом, об эффективных вирусах действительно можно забыть. Но кто сказал, что нет альтернативных методов? Один из таких методов описан в этой статье. Но для понимания его сути тебе надо кое-что знать о защищенном режиме процессора. Думаю, ты хоть немного знаешь ассемблер, поэтому я не буду объяснять, что значит «mov word ptr».

PM aka защищенка

286+ процессор имеет два режима работы: реальный и защищенный (на самом деле, есть еще один – V86, но для нас это несущественно). Реальный – это таблица векторов прерываний, свободный доступ к портам и прочие прелести. Режим защищенный намного сложнее и запутаннее, но ничего не поделаешь – придется разбираться. К тому же, в этот раз мы коснемся его совсем чуть-чуть.

Зачем вообще нужен защищенный режим? Принято считать, что DOS – это однозадачная ОСь. Позвольте, а как же тогда резиденты? Так что многозадачность в DOS’е была, но не такая, какой бы ее хотелось видеть: отсутствие приоритетов при переключении задач, единое адресное пространство для всех запущенных процессов и т.д. Всех этих недостатков лишен защищенный режим, предоставляющий принципиально новые возможности для реализации многозадачности, и одна из этих возможностей – защита программ от взаимного влияния, которая и дала название всему режиму.

Первое, что ты должен узнать, так это понятия «сегмент», «дескриптор» и «селектор». Сегмент, грубо говоря – это изолированный кусок памяти. Дескриптор – это структура, описывающая конкретный сегмент. В дескрипторе содержится такая информация, как адрес сегмента в памяти, его размер, тип, привилегии и т.д. Все дескрипторы собираются в три основные таблицы: GDT (Global Descriptor Table), LDT (Local Descriptor Table) и IDT (Interrupt Descriptor Table). Я сказал, три таблицы. Не совсем так, потому что LDT может быть и не одна, на то она и локальная. Селектор – это идентификатор дескриптора, указатель на дескриптор в таблице дескрипторов. Хранится он в каждом из сегментных регистров – CS, DS и т.д. (помнишь, в реальном режиме там хранилась база сегментов кода, данных и стека). Процессор, при обращении к сегменту, сначала извлекает из сегментного регистра селектор, с помощью селектора находит в таблице дескриптор, а уже в дескрипторе описано положение требуемого сегмента в памяти, привилегии и т.д.

Содержание  Вперед на стр. 035-062-2