жонглирование ядром ФЛЕНОВ МИХАИЛ 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 или вызывая функции напрямую. |