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

жонглирование ядром

ФЛЕНОВ МИХАИЛ AKA HORRIFIC

Спецвыпуск: Хакер, номер #071, стр. 071-030-1


(WWW.VR-ONLINE.RU)

КЕРНЕЛ КОДИНГ

ДАЖЕ ЕСЛИ ТЫ НЕ СОБИРАЕШЬСЯ ПИСАТЬ ДРАЙВЕРА, ЭТА СТАТЬЯ ПРИГОДИТСЯ ДЛЯ ПОНИМАНИЯ НЕКОТОРЫХ ВНУТРЕННИХ ОСОБЕННОСТЕЙ ОС WINDOWS. НЕСМОТРЯ НА ТО, ЧТО MICROSOFT ЗАБОТИТСЯ О ПРОГРАММЕРАХ И ПРЕДОСТАВЛЯЕТ ДОСТАТОЧНО ПОДРОБНУЮ ИНФОРМАЦИЮ ОБ API, АРХИТЕКТУРА ОС ОСТАЕТСЯ НАИМЕНЕЕ ОТКРЫТОЙ, А ИНФОРМАЦИЯ — ОБРЫВОЧНОЙ

[набор инструментов.]

Для создания драйвера под Windows необходим специальный набор инструментов, который называется DDK (Driver Development Kit). Помимо этого желательно установить специализированную версию Windows, которая содержит отладочную информацию. Это поможет в отладке драйвера, что не такое уж и простое занятие.

Для каждой версии ОС существует свой набор DDK, и распространяется он отдельно от компилятора. Это значит, что если даже у тебя установлена полная версия Visual Studio, DDK придется ставить отдельно. Причем просто так скачать его с сайта Microsoft нельзя (на момент написания этих строк DDK не доступен, хотя пару лет назад был в свободном доступе), потому что он распространяется вместе с платной подпиской MSDN. Но если у тебя есть лишняя денежка, то DDK можно заказать здесь: www.microsoft.com/whdc/devtools/ddk/default.mspx.

На самом деле, DDK дают на халяву, деньги же нужны за пересылку компакт-диска. Существуют и неофициальные версии и залежи наборов для разработчиков драйверов — ищи в поисковиках. За пять минут реально найти полную версию для Windows XP. Ссылки давать бессмысленно, так как на момент выхода номера они могут быть уже мертвы...

[язык программирования.]

Стандартом при написании драйверов является язык С. Да, именно он. Конечно, можно ухитриться написать на С++, но я не рекомендовал бы играть с объектами. Можно написать драйвер даже на Delphi, но только старой версии (до Delphi 5), и для сборки проекта в драйвер все равно понадобиться DDK, потому что стандартные компиляторы не умеют собирать необходимый бинарник. В новых версиях создается не совместимый с утилитой BUILD объектный файл.

[властелин колец.]

Теперь перейдем непосредственно к архитектуре. Как только процессоры от Intel стали 32-разрядными (начиная с процессора 386), их возможности значительно расширились. Процессор научился работать в четырех режимах, нумеруемых от 0 до 4. Эти режимы называют кольцами: от RING0 до RING3. В окнах используется только два кольца и два конца, в смысле, поддерживаются только RING0 и RING3.

Уровень RING0 самый привилегированный. На нем доступны абсолютно все возможности процессора, прямой доступ к железу, памяти и много всего вкусного, но здесь может работать только ядро и драйвера ОС. Пользовательские процессы работают на 3-м уровне с большими ограничениями. Именно поэтому хакеры так мечтают очутиться на нулевом кольце :).

Дабы изолировать драйвера от пользовательских программ, окна выделили для них разные участки памяти. Таким образом, пользовательский процесс никогда не сможет вмешаться в работу драйвера или ядра.

При описании архитектуры в разных источниках даются разные схемы. Скорее всего это связано с тем, что эта часть ОС не так открыта, как Windows API, и при описании некоторых компонентов мы можем только догадываться об их существовании именно в данном месте и именно с такими связями. Но ясно, что режим ядра изолирован от пользовательских процессов, хотя мы можем обращаться к ним через библиотеку NTDLL.DLL или вызывая функции напрямую.

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