Службы Windows изнутри.  Управление драйверами и службами Windows с помощью ServiWin Управление сервисами и драйверами windows

Порядок загрузки драйверов и сервисов в Windows



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

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

Как видно из рисунка, сначала загружаются драйверы устройств, необходимые для запуска системы, а потом различные Windows-сервисы. Поскольку между загрузкой сервисов и загрузкой драйверов есть некоторые различия, рассматривать их будем по отдельности.

Драйверы

В качестве подопытного возьмем драйвер Microsoft ACPI (Advanced Configuration and Power Interface), который отвечает за обнаружение аппаратного обеспечения и управление питанием. Задача ACPI - обеспечить взаимодействие между операционной системой и аппаратным обеспечением, поэтому драйвер ACPI загружается в самом начале.

Программа Loadorder предоставляет довольно ограниченную информацию о порядке загрузки, поэтому за более точными данными идем в реестр. У каждого драйвера и Windows-сервиса есть свой раздел в ветви реестра HKLM\SYSTEM\CurrentControlSet\Services. Названы разделы по имени драйвера\сервиса, соответственно нам нужен раздел ACPI.

За порядок загрузки драйвера отвечают три параметра реестра. Основной параметр Start - определяет тип запуска драйвера. Вот правила, по которым драйверы устанавливают значение своего параметра Start:

Драйверы, которые должны загружаться системным загрузчиком при запуске операционной системы , указывают значение Start равное 0 (запуск при загрузке системы ). Пример - драйверы системных шин и драйвер файловой системы, используемый при загрузке системы;
Драйвер, который не требуется непосредственно для загрузки системы , указывает в Start значение, равное 1 (запуск системой ). Пример - стандартный драйвер видеокарты (VgaSave);
Драйвер, не обязательный для загрузки системы , устанавливает значение Start равным 2 (автозапуск ). Пример - драйвер многосетевого UNC-npoвайдера (Multiple UNC Provider, MUP), поддерживающий UNC-имена удаленных ресурсов (типа );
Драйверы, не обязательные для работы операционной системы (например, драйверы сетевых адаптеров), указывают значение Start равным 3 (запуск по требованию ).

Также драйверы устройств могут использовать параметры Group и Tag для контроля порядка своей загрузки при запуске системы. Параметр Group драйверы\сервисы используют, чтобы указать группу, к которой они принадлежат, а порядок загрузки групп определяется параметром List , находящимся в разделе HKLM\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder\.

Кстати, параметр Group указывать не обязательно. Если драйвер\сервис не входит в какую либо группу, то он загружается в самом конце очереди.

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

Посмотрев на порядок загрузки, можно подумать что сначала загружаются драйверы с меньшими значениями Tag, потом - с большими, но это не совсем так. Приоритет значений параметров Tag в рамках группы определяется в разделе HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList.

Для примера откроем двоичный параметр Boot Bus Extender, который соответствует одноименной группе, к которой относится и драйвер ACPI. Параметр представляет из себя набор двойных слов (по 4 байта каждое). Первое слово (выделено красным) задает общую длину переменной (количество двойных слов), в нашем примере 06. Остальные двойные слова как раз и являются тэгами. Драйверу ACPI соответствует тэг, равный 01 (выделен зеленым).

Приоритетность тега определяется не значением тега, а его положением: чем выше расположен тэг, тем выше его приоритет в группе, и тем выше приоритет драйвера, которому этот тэг соответствует. А поскольку 01 выше остальных тегов, то и драйвер ACPI загружается первым в группе.

Сервисы

Порядок загрузки Windows-сервисов несколько отличается от порядка загрузки драйверов. В качестве примера возьмем сервис aвтоматического обновления (wuauserv). Он не особо критичен для работы системы и поэтому грузится в последнюю очередь.

Опять идем в реестр. Параметры запуска сервиса находятся в разделе HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Я выделил два основных параметра, отвечающих за порядок загрузки данного сервиса.

Windows-сервисы запускаются диспетчером управления сервисами (Service Control Manager, SCM) в соответствии со значением параметра Start . Параметр этот для сервисов может принимать следующие значения:

Авто запуск (2) - сервис запускается автоматически, сразу после запуска основного SCM-процесса Services.exe;
Запуск по требованию (3) - сервис запускается при необходимости, по требованию какого либо сервиса или программы;
Отключено (4) - сервис отключен и не запускается ни при каких условиях.

Значения 0 (запуск при загрузке системы) и 1 (запуск системой) для сервисов не могут быть указаны, только для драйверов устройств.

Кроме того, начиная с Windows Vista\Server 2008 для сервисов появился еще один режим запуска - отложенный автозапуск. Отвечает за него параметр DelayedAutoStart = 1 , который который указывает SCM произвести автоматический старт данного сервиса с задержкой. SCM запускает службы, для которых выбран отложенный запуск, после загрузки сервисов, отмеченных для автозапуска.

Режимом запуска сервисов можно управлять не только из реестра, но и в графическом режиме, из консоли Службы (Services).

Так же как и драйверы, Windows-сервисы могут использовать параметр Group в своем разделе реестра, чтобы указать группу, к которой они принадлежат. Сейчас, для наглядности, возьмем наш сервис wuauserv, находящийся в самом конце списка загрузки. С помощью ключа Group поместим его в группу Event Log, перезагрузимся и посмотрим порядок загрузки в Loadorder. Как видите, порядок изменился и wuauserv поднялся с последнего места, загрузившись сразу после своего одногруппника - службы eventlog. Правда порядок размещения внутри группы изменить уже не получится, т.к. Tag для сервисов не используется.

И еще один параметр, который косвенно влияет на порядок загрузки сервисов - DependOnService . Он указывает, от каких сервисов зависит данный сервис. Соответственно сервис не загружается, пока не будут загружены сервисы, перечисленные в DependOnService.

Зависимости работают следующим образом - если сервисы находятся в одной группе, то зависимый сервис перемещается в конец списка и запускается после сервисов, от которых зависит. Если же группы разные, то сервис просто не запустится, а SCM выдаст ошибку.

Более наглядно это показано в оснастке Службы, где на вкладке Зависимости (Dependency) указаны как сервисы, от которых зависит данный сервис, так и сервисы, зависящие от него.

Вот мы и выяснили, в каком порядке загружаются драйверы и сервисы в Windows и как этот порядок можно изменить. Но прежде чем бросаться править реестр помните, что порядок загрузки драйверов и сервисов определяется автоматически, и не стоит вносить в него изменения без веской причины. Всего один неправильно выставленный параметр может привести к полной неработоспособности системы, и не факт что ее удасться восстановить. Поэтому, прежде чем приступить к редактированию реестра, обязательно сделайте его резервную копию, а также желательно иметь под рукой загрузочный носитель.

В спецификациях технологии PnP определено, как компьютер обнаруживает и настраивает подключаемое оборудование, а также автоматически устанавливает драйверы. Технология PnP поддерживается в Windows 7, поэтому после подключения устройства автоматически выполняются поиск подходящего пакета драйверов и настройка устройства. Это существенно упрощает установку.

Тем не менее, не следует разрешать пользователям подключать к рабочим компьютерам любые устройства. Программа драйвера работает как часть ОС, имея неограниченный доступ ко всему компьютеру, поэтому следует разрешать установку только проверенного оборудования. Когда пользователь Windows 7 присоединяет устройство, происходит его обнаружение. Служба Plug and Play идентифицирует устройство и ищет в хранилище нужный драйвер. Если он найден, устройство считается авторизованным, и файлы драйвера при помощи службы Plug and Play копируются из хранилища драйверов в системное расположение, как правило, в папку С:\Windows\System32\Drivers . При помощи службы Plug and Play выполняется настройка реестра и запуск установленного драйвера.

Установка драйверов устройств из Центра обновления Windows

По умолчанию обновленные драйверы устройств, выгруженные в Центр обновления Windows (Windows Update ), загружаются и устанавливаются на клиентских компьютерах автоматически. Изменить такое поведение можно в диалоговом окне Параметры установки устройств (Device Installation Settings ). Самый простой способ его открыть - ввести в поле поиска меню Пуск (Start ) фразу установка устройства (device installation ) и щелкнуть вариант Изменение параметров установки устройства (Change Device Installation Settings ).

По умолчанию установлено значение Да, делать это автоматически (рекомендуется) (Yes, Do This Automatically (Recommended) ). Чтобы запретить установку на компьютеры с Windows 7 непроверенных драйверов, установите переключатель Никогда не устанавливать драйверы из Центра обновления Windows (Never Install Driver Software From Windows Update ).

Если выбран вариант Всегда устанавливать наиболее подходящие драйверы из Центра обновления Windows (Always Install The Best Driver Software From Windows Update ), целесообразность замены уже установленного драйвера определяется автоматически. При этом у вас не будет возможности протестировать новый драйвер перед установкой. Выбрав вариант Устанавливать драйверы из Центра обновления Windows , если они не найдены на компьютере (Only Install Driver Software From Windows Update If It Is Not Found On My Computer ), вы также не сможете протестировать новый драйвер перед установкой. В среде предприятия, особенно, когда ПО распространяется через службы обновления Windows (WSUS ), возможность обновления драйверов с сайта Центра обновления Windows (Windows Update) следует отключить, а сайт исключить из пути поиска.

Размещение драйвера устройства

Если нужного драйвера нет в хранилище, администратор должен одобрить это устройство. Этот процесс называется размещением (staging).

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

В Windows 7 процесс размещения начинается с поиска подходящего пакета драйвера в папках, указанных в записи реестра DevicePath . Как настроить дополнительные папки поиска драйверов устройств в Windows 7, вы узнаете на практикуме данного занятия. Если подходящий драйвер не найден, выполняется поиск в Центре обновления Windows (Windows Update). Затем пользователю предлагается вставить установочный диск. Если драйвер найден, система проверяет, есть ли у пользователя право размещать пакет драйвера в хранилище. Для этого у пользователя должны быть учетные данные администратора или политика компьютера должна допускать установку драйверов известных устройств обычным пользователям. Затем выполняется проверка цифровой подписи пакета. Если пакет драйвера не подписан или подписан при помощи сертификата, не найденного в хранилище надежных издателей, пользователю будет предложено подтвердить действие. Если драйвер утвержден полномочным пользователем, копия пакета драйвера размещается в хранилище драйверов и установка продолжается.

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

Установка устройства, не поддерживающего Plug and Play

Если устройство не поддерживает PnP (например, старое устройство), для его установки вам понадобится учетная запись с административными полномочиями. Если у вас есть установочный диск устройства, Майкрософт рекомендует воспользоваться записанной на нем программой установки. Обычно это делается перед подключением устройства. В противном случае откройте Диспетчер устройств (Device Manager ), щелкните правой кнопкой имя компьютера в дереве консоли и выберите команду Установить старое устройство (Add Legacy Hardware ). Откроется Мастер установки оборудования (Add Hardware Wizard ).

Выполняя инструкции мастера, вы сможете выполнить поиск оборудования или установить оборудование, выбранное вручную из списка. В первом случае устройство необходимо подключить к компьютеру. Процедура установки такая же, что и при установке PnP-оборудования, не прошедшего предварительную авторизацию. Если вы решите выбрать оборудование самостоятельно, вам будет предложен список типов устройств. Если вы выделите вариант Показать все устройства (All Devices ), выберите устройство из списка производителей. Если у вас есть драйвер (не обязательно пакет установки драйвера) на съемном диске или в папке на жестком диске, щелкните кнопку Установить с диска (Have Disk ). После выбора драйвера мастер установит оборудование. При наличии неполадок (например, ошибки с кодом 10 - не удается запустить устройство) они будут перечислены на последней странице мастера.

Настройки политик установки устройств

На практикуме этого занятия вам предстоит разрешить пользователям, не являющимся администраторами, устанавливать устройства заданного класса установки в Редакторе локальной групповой политики (Local Group Policy Editor ). С его помощью можно настроить и политики установки устройств. Последовательно разверните узлы: Конфигурация компьютера (Computer Configuration ), Административные шаблоны (Administrative Templates ), Система (System ), Установка устройства (Device Installation ) и щелкните элемент Ограничения на установку устройств (). Перейдите на вкладку Стандартный (Standard ) со списком политик.

Чтобы открыть Редактор локальной групповой политики (Local Group Policy Editor ), введите gpedit.msc в поле поиска меню Пуск (Start ). Обязательно просмотрите сведения о каждой политике в разделе Ограничения на установку устройств (Device Installation Restrictions ) и в разделе Установка устройства (Device Installation ), дважды щелкнув политику.

Работа с драйверами устройств

Известно, что для установки оборудования нужно найти файлы установки драйвера и установить драйвер. После установки драйвер можно обновить (установив другой драйвер), удалить, отключить и включить. Если вы обновили драйвер и новый драйвер работает хуже предыдущего, выполните откат до предыдущего драйвера.

Если обновленный драйвер распространяется через Центр обновления Windows (Windows Update ), как правило, он устанавливается автоматически после загрузки. В Диспетчере устройств (Device manager ) также есть возможность обновления драйвера. Обычно ею пользуются для установки нового или обновленного драйвера от поставщика оборудования до публикации драйвера в Центре обновления Windows (Windows Update). Чтобы получить последнюю версию драйвера и протестировать его на компьютере-образце под управлением Windows 7, загрузите файлы драйвера с веб-сайта поставщика и выполните обновление драйвера вручную.

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

Существует два способа начать процесс обновления драйвера в Диспетчере устройств (Device Manager ):

  • щелкните устройство правой кнопкой и выберите команду Обновить драйверы (Update Driver Software );
  • дважды щелкните устройство и щелкните Обновить (Update Driver ) на вкладке Драйвер (Driver ).

Иногда проблему можно решить не удалением и повторной установкой драйвера, а его отключением.

При наличии конфликта драйверов, если речь идет не о PnP-устройстве, попробуйте отключить один из драйверов или остановить его. Чтобы откатить драйвер, откройте вкладку Драйвер (Driver ) окна свойств устройства. Если установлен только один драйвер, кнопка Откатить (Roll Back Driver ) недоступна. Откат драйвера выполняют, если обновленный драйвер устройства работает хуже предыдущего или конфликтует с другими драйверами. При этом предыдущий драйвер остается в хранилище, а процесс происходит без вмешательства пользователя (за исключением подтверждения действия в окне UAC).

Чтобы собрать сведения о неполадках драйвера или просто получить дополнительные сведения о драйвере, щелкните кнопку Сведения (Driver Details ) на вкладке Драйвер (Driver ). На экране отобразится информация о месте хранения файлов драйвера. Обратите внимание, что это не хранилище драйверов (оно является защищенной областью). Файлы работающего драйвера, как правило, имеют расширение SYS и действуют как часть ОС. Файлы установки драйвера имеют расширение INF . В сведениях о драйвере содержится информация о поставщике (обычно, стороннем производителе), версии файла, цифровой подписи (как правило, Майкрософт) и авторских правах. Версия файла пригодится для поиска сведений о проблемном драйвере в Интернете, например, в блогах Майкрософт.

Разрешение конфликтов драйверов

В наши дни конфликты драйверов встречаются куда реже, чем раньше. А ведь еще лет 15 назад при подключении принтера могла перестать работать мышь! Почти все современное оборудование поддерживает технологию PnP. Установка происходит под управлением ОС, и конфликтов, как правило, удается избежать. Однако система неидеальна, и возможность возникновения конфликтов есть. Обычно, конфликт возникает, когда двум устройствам требуются одни и те же ресурсы, особенно при пересечении прерываний или диапазонов ввода-вывода. Задать использование ресурсов можно в диалоговом окне Свойства (Properties ) на вкладке Ресурсы (Resources ). Для большинства драйверов установлен флажок Автоматическая настройка (Use Automatic Settings ), а кнопка Изменить (Change Settings ) недоступна.

Конфликты между устройствами PnP возникают редко. Для их разрешения достаточно на время отключить одно из устройств. Иногда разрешить конфликт можно, обновив драйвер (если обновление имеется) или удалив и повторно установив оборудование. Если в конфликте участвует устройство, не поддерживающее PnP, для решения проблемы может понадобиться его остановка. Чтобы остановить устройство, не поддерживающее PnP, выполните следующие действия:

  1. Откройте Диспетчер устройств (Device Manager ).
  2. В меню Вид (View ) выберите команду Показать скрытые устройства (Show Hidden Devices ).
  3. Дважды щелкните элемент Драйверы несамонастраиваемых устройств (Non-Plug and Play Drivers ), щелкните правой кнопкой устройство, которое нужно остановить, и выберите Свойства (Properties ).
  4. На вкладке Драйвер (Driver ) щелкните кнопку Остановить (Stop ), затем Ok .

Почти так же осуществляется и повторный запуск устройства. Только вместо кнопки Остановить (Stop ) нужно щелкнуть кнопку Запустить (Start ). Кроме того, на данной вкладке можно изменить тип запуска. Обратите внимание: если кнопка Запустить (Start ) на вкладке Драйвер (Driver ) недоступна, драйвер уже загружен.

Поиск конфликтов в программе Сведения о системе (System Information)

Если вы предполагаете, что драйвер устройства работает неправильно из-за конфликта ресурсов, откройте утилиту Сведения о системе (System Information ) и просмотрите требования, предъявляемые всеми устройствами к параметрам ввода-вывода и IRQ . Это удобнее, чем открывать вкладку Ресурсы (Resources ) для каждого устройства в отдельности. Чтобы запустить утилиту, введите msinfo32 в строке поиска меню Пуск (Start ), в окне Выполнить (Run ) или в командной строке. Для запуска Msinfo32 не требуется командная строка с повышенными полномочиями. В программе приводятся общие сведения о системе.

В узле Аппаратные ресурсы (Hardware Resources ) вы найдете сведения о ресурсах памяти, ввода-вывода и прерывания IRQ для каждого из устройств компьютера. Наиболее полезные сведения для разрешения конфликтов содержит узел Конфликты и совместное использование (Conflicts/Sharing ). При возникновении проблем с конкретным устройством введите его имя в поле Искать (Find What ).

Сведения о конкретных устройствах (CD-ROM, звуковое устройство, дисплей и т.д.) находятся в узле Компоненты (Components ). При диагностике самый полезный раздел - Устройства с неполадками (Problem Devices ). В нем перечислены неработающие устройства, устройства, для которых не установлены драйверы, и пр. В узле Программная среда (Software Environment ) имеется раздел Системные драйверы (System Drivers ), в котором перечислены драйверы ядра. Здесь можно узнать, работает драйвер или нет. Вы можете найти драйвер по имени или описанию при помощи поля Искать (Find What ).

Диспетчер проверки драйверов

Не всегда неполадки драйверов вызваны конфликтами. Бывает, что устройства работают неправильно или возникают STOP-ошибки, а сведений о конфликтах нет, и отключение других драйверов ничего не дает. В комплект Windows 7 входит инструмент Диспетчер проверки драйверов (Driver Verifier Monitor ), позволяющий вести наблюдение за драйверами устройств и выявлять недопустимые вызовы процедур или действия, способные нанести вред системе. Он позволяет ставить драйверы «под нагрузку» и тестировать их на предмет некорректного поведения.

Диспетчер проверки драйверов (Driver Verifier Monitor ), вызываемый командой verifier . Флаг /volatile позволяет запустить проверку любого драйвера без перезагрузки, даже если Диспетчер проверки драйверов (Driver Verifier Monitor ) уже не работает, а также запустить проверку уже загруженного драйвера. Подобное нововведение, впервые представленное в Windows Vista, значительно сокращает число перезапусков. Это экономит время и позволяет вести наблюдение за драйвером во время подключения или удаления устройства.

С помощью диспетчера вы можете запрашивать параметры, добавлять и удалять устройства, но наибольшей функциональностью обладает параметр /faults , позволяющий вводить нагрузочные тесты заданного уровня сложности для определения способности драйвера корректно работать в любых ситуациях. Например, можно имитировать недостаток ресурсов или режим ожидания, возвращающий неожиданный результат. Вы можете наблюдать за использованием ресурсов (распределением пула) и следить за количеством посланных в систему ошибок. Диспетчер проверки драйверов (Driver Verifier Monitor ) - это главным образом инструмент для создания нагрузки, который проинформирует вас, например, о возможности сбоя драйвера, если использование диска или памяти превысит определенный порог. Наблюдать за использованием ресурсов и диагностировать причины нехватки ресурсов можно при помощи более общих средств, например Системного монитора (Performance Monitor ) или Диспетчера задач (Task Manager ).

Подписи драйверов и цифровые сертификаты

Цифровые подписи позволяют администраторам и пользователям, устанавливающим ПО для Windows, получать сведения о подлинности издателя, предоставившего программный пакет. Для установки неподписанных компонентов, работающих в режиме ядра, требуются административные полномочия. Драйверы должны быть подписаны при помощи сертификатов, являющихся доверенными в Windows 7. Сертификаты с подписями надежных издателей хранятся в хранилище сертификатов Доверенные издатели (Trusted Publishers ).

Администратор волен утвердить установку неподписанного драйвера или драйвера с подписью, которой нет в хранилище сертификатов от доверенных издателей. Это допустимо, при условии что драйвер устанавливается на тестовый компьютер в ознакомительных целях, а не в целях массового распространения на клиентские компьютеры. Многие драйверы приходят из надежных источников (например, от производителей оборудования), но еще не прошли процесс проверки, результатом которого является цифровая подпись. Не имеют подписи даже некоторые драйверы Майкрософт. Когда вы или другие администраторы устанавливаете драйверы, авторизация - не проблема. Другое дело, когда вам нужно, чтобы драйвер установили обычные пользователи. Даже после размещения драйвера пользователи не смогут установить его, поскольку утвердить установку драйвера без действительной подписи может только администратор.

Получить самозаверяющий (self-signed) сертификат, действительный в пределах организации, можно только от сервера ЦС под управлением Windows Server с работающими службами сертификации (Certificate Services ). Такой сертификат не действителен в другой организации, если между организациями нет доверительных отношений. Даже внутри организации Майкрософт рекомендует применять эту процедуру только в тестовой сети, а в производственной среде устанавливать исключительно драйверы с действительной подписью.

Чтобы подписанный драйвер устройства мог использоваться в других организациях, сертификат должен быть выпущен доверенным внешним ЦС, например, VeriSign . Получить такой сертификат гораздо сложнее. Чтобы пользователи могли установить драйвер без доверенной подписи, нужно подписать пакет драйвера устройства при помощи цифрового сертификата, а затем доставить сертификат на клиентские компьютеры. Так вы избавите пользователей от необходимости проверять степень надежности издателя или драйвера устройства.

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

Наличие цифровой подписи - гарантия того, что пакет пришел из заявленного источника (подлинность) без повреждений и изменений (целостность). Цифровой сертификат служит удостоверением организации. Он заслуживает доверия, так как подвергается электронной проверке в центре сертификации.

Общая процедура подписи драйвера устройства такова:

  1. Создайте цифровой сертификат в консоли Сертификаты (Certificates ) на сервере сертификатов. Кроме того, можете воспользоваться утилитой MakeCert .
  2. Добавьте сертификат в хранилище Доверенные корневые центры сертификации (Trusted Root Certification Authorities ). Эта операция выполняется в консоли Сертификаты (Certificates ) путем копирования и вставки.
  3. Добавьте сертификат в хранилище Доверенные издатели (Trusted Publishers ). Это также делается в оснастке Сертификаты (Certificates ).
  4. Подпишите пакет драйвера устройства при помощи сертификата. Для этого подготовьте INF-файл пакета драйвера, создайте файл каталога для пакета драйвера и подпишите файл каталога с помощью утилиты Signtool .

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

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

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

Драйверы

В качестве подопытного возьмем драйвер Microsoft ACPI (Advanced Configuration and Power Interface), который отвечает за обнаружение аппаратного обеспечения и управление питанием. Задача ACPI - обеспечить взаимодействие между операционной системой и аппаратным обеспечением, поэтому драйвер ACPI загружается в самом начале.

Программа Loadorder предоставляет довольно ограниченную информацию о порядке загрузки, поэтому за более точными данными идем в реестр. У каждого драйвера и Windows-сервиса есть свой раздел в ветви реестра HKLM\SYSTEM\CurrentControlSet\Services. Названы разделы по имени драйвера\сервиса, соответственно нам нужен раздел ACPI.

За порядок загрузки драйвера отвечают три параметра реестра. Основной параметр Start - определяет тип запуска драйвера. Вот правила, по которым драйверы устанавливают значение своего параметра Start:

Драйверы, которые должны загружаться системным загрузчиком при запуске операционной системы, указывают значение Start равное 0 (запуск при загрузке системы). Пример - драйверы системных шин и драйвер файловой системы, используемый при загрузке системы;
Драйвер, который не требуется непосредственно для загрузки системы, указывает в Start значение, равное 1 (запуск системой). Пример - стандартный драйвер видеокарты (VgaSave);
Драйвер, не обязательный для загрузки системы, устанавливает значение Start равным 2 (автозапуск). Пример - драйвер многосетевого UNC-npoвайдера (Multiple UNC Provider, MUP), поддерживающий UNC-имена удаленных ресурсов (типа \\Computer\Share);
Драйверы, не обязательные для работы операционной системы (например, драйверы сетевых адаптеров), указывают значение Start равным 3 (запуск по требованию).

Также драйверы устройств могут использовать параметры Group и Tag для контроля порядка своей загрузки при запуске системы. Параметр Group драйверы\сервисы используют, чтобы указать группу, к которой они принадлежат, а порядок загрузки групп определяется параметром List, находящимся в разделе HKLM\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder\.

Кстати, параметр Group указывать не обязательно. Если драйвер\сервис не входит в какую либо группу, то он загружается в самом конце очереди.

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

Посмотрев на порядок загрузки, можно подумать что сначала загружаются драйверы с меньшими значениями Tag, потом - с большими, но это не совсем так. Приоритет значений параметров Tag в рамках группы определяется в разделе HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList.

Для примера откроем двоичный параметр Boot Bus Extender, который соответствует одноименной группе, к которой относится и драйвер ACPI. Параметр представляет из себя набор двойных слов (по 4 байта каждое). Первое слово (выделено красным) задает общую длину переменной (количество двойных слов), в нашем примере 06. Остальные двойные слова как раз и являются тэгами. Драйверу ACPI соответствует тэг, равный 01 (выделен зеленым).

Приоритетность тега определяется не значением тега, а его положением : чем выше расположен тэг, тем выше его приоритет в группе, и тем выше приоритет драйвера, которому этот тэг соответствует. А поскольку 01 выше остальных тегов, то и драйвер ACPI загружается первым в группе.

Сервисы

Порядок загрузки Windows-сервисов несколько отличается от порядка загрузки драйверов. В качестве примера возьмем сервис aвтоматического обновления (wuauserv). Он не особо критичен для работы системы и поэтому грузится в последнюю очередь.

Опять идем в реестр. Параметры запуска сервиса находятся в разделе HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Я выделил два основных параметра, отвечающих за порядок загрузки данного сервиса.

Windows-сервисы запускаются диспетчером управления сервисами (Service Control Manager, SCM) в соответствии со значением параметра Start . Параметр этот для сервисов может принимать следующие значения:

Авто запуск (2) - сервис запускается автоматически, сразу после запуска основного SCM-процесса Services.exe;
Запуск по требованию (3) - сервис запускается при необходимости, по требованию какого либо сервиса или программы;
Отключено (4) - сервис отключен и не запускается ни при каких условиях.

Значения 0 (запуск при загрузке системы) и 1 (запуск системой) для сервисов не могут быть указаны, только для драйверов устройств.

Кроме того, начиная с Windows Vista\Server 2008 для сервисов появился еще один режим запуска - отложенный автозапуск. Отвечает за него параметр DelayedAutoStart = 1, который который указывает SCM произвести автоматический старт данного сервиса с задержкой.SCM запускает службы, для которых выбран отложенный запуск, после загрузки сервисов, отмеченных для автозапуска.

Режимом запуска сервисов можно управлять не только из реестра, но и в графическом режиме, из консоли Службы (Services).

Так же как и драйверы, Windows-сервисы могут использовать параметр Group в своем разделе реестра, чтобы указать группу, к которой они принадлежат. Сейчас, для наглядности, возьмем наш сервис wuauserv, находящийся в самом конце списка загрузки. С помощью ключа Group поместим его в группу Event Log, перезагрузимся и посмотрим порядок загрузки в Loadorder. Как видите, порядок изменился и wuauserv поднялся с последнего места, загрузившись сразу после своего одногруппника - службы eventlog. Правда порядок размещения внутри группы изменить уже не получится, т.к. Tag для сервисов не используется.

И еще один параметр, который косвенно влияет на порядок загрузки сервисов - DependOnService . Он указывает, от каких сервисов зависит данный сервис. Соответственно сервис не загружается, пока не будут загружены сервисы, перечисленные в DependOnService.

Зависимости работают следующим образом - если сервисы находятся в одной группе, то зависимый сервис перемещается в конец списка и запускается после сервисов, от которых зависит. Если же группы разные, то сервис просто не запустится, а SCM выдаст ошибку.

Более наглядно это показано в оснастке Службы, где на вкладке Зависимости (Dependency) указаны как сервисы, от которых зависит данный сервис, так и сервисы, зависящие от него.

Введение

Здесь описывается программирование служб
в ОС Windows (я также буду употреблять термин
"сервис",что равносильно термину "служба"),
приводится пример использования для
загрузки драйверов или руткитов.

Сервисы

При старте ОС запускается менеджер служб(SCM
Manager).Считывая данные из реестра (имя
сервиса, способ загрузки, тип драйвера и т.д.),
он составляет базу данных для управления
службами. Я опишу некоторые функции, с
помощью которых можно управлять сервисами.
Сначала требуется создать связь с этой
базой данных (SCM database), затем передать
указатель баз данных некоторым функциям,
управляющими сервисами.

Как я уже сказал, первым делом нужно
создать связь с базой данных SCM. Для этого
служит функция OpenSCManager.

SC_HANDLE OpenSCManager(LPCTSTR lpMachineName, LPCTSTR
lpDatabaseName, DWORD dwDesiredAccess);

LPCTSTR lpMachineName - указатель на строку,
завершающуюся нулём, указывающую на имя
локального компьютера. Этот параметр
можно установить в NULL.

LPCTSTR lpDatabaseName- указатель на строку,
завершающуюся нулём, содержащая в себе имя
открываемой базы данных.Этот параметр
также слудует установить в NULL.

DWORD dwDesiredAccess - этот параметр содержит в себе
флаги, означащие права доступа к базе
данных.Я не буду перечислять все флаги, в
данной статье я рассматриваю только те
возможности программирования служб, нужные
для загрузки руткитов.

SC_MANAGER_ALL_ACCESS - стандартные права доступа к БД.
SC_MANAGER_CONNECT - разрешает соединяться с БД SCM.
SC_MANAGER_CREATE_SERVICE- разрешает создание новых
сервисов.

Создав связь с БД SCM,вы можете управлять
сервисами.

Функция OpenService служит для получения
описателя службы. Учтите, что эта функция не
создаёт службу, для создания службы служит
CreateService, а открывает уже созданную ранее
службу.

SC_HANDLE OpenService(SC_HANDLE hSCManager, LPCTSTR
lpServiceName, DWORD dwDesiredAccess);

SC_HANDLE hSCManager - указатель, возвращенный
функцией OpenSCManager.

LPCTSTR lpServiceName - имя открываемого сервиса.

DWORD dwDesiredAccess- права с которыми мы можем
открыть службу. Вот некоторые из них:

SERVICE_ALL_ACCESS- это стандартные права доступа.
SERVICE_START-разрешает запуск работы сервиса.
SERVICE_STOP-разрешает остановку работы сервиса.

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

Эта функция нужна для создания сервиса (службы).

SC_HANDLE CreateService(SC_HANDLE hSCManager, LPCTSTR
lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType,
DWORD dwStartType, DWORD dwErrorControl, LPCTSTR lpBinaryPathName, LPCTSTR
lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR
lpServiceStartName, LPCTSTR lpPassword);

Первый параметр (hSCManager) указывает на
указатель, возвращенный функцией OpenSCManager.
Следующие два параметра указывают на
строки, содержащие имя создаваемой службы и
имя, которое будет использовано
пользовательским интерфейсом. Следующий
параметр содержит в себе флаги,
определяющие права доступа к службе. Здесь
используются те же флаги, что и в функции
OpenService. В большинстве случаев понадобится
установка этого флага в SERVICE_ALL_ACCESS. Параметр
dwServiceType определяет тип создаваемого
сервиса. В данном случае нужно установить
его в SERVICE_KERNEL_DRIVER, что в свою очередь
означает, что сервис будет управлять
драйвером уровня ядра. Другие же значения
означают, что это будет драйвер файловой
системы и т.д. Параметр dwStartType очень важен, т.к
определяет способ старта службы. В нашем
случае его следует установить в
SERVICE_BOOT_START или SERVICE_AUTO_START, что означает
практически одно и тоже - запуск службы во
время запуска самой операционной системы.
Параметр dwErrorControl указывает на способ
обработки возникающих ошибок, в нашем
случае его следует установить в SERVICE_ERROR_NORMAL.
Следующий параметр - lpBinaryPathName - указатель на
завершающуюся нулём строку, указывающую на
полный путь к драйверу (в нашем случае
руткиту), которым будет управлять служба.
Следующие пать параметров следует
установить в NULL, т.к. они не важны в данном
случае.

Для запуска службы существует функция
StartService.

BOOL StartService(SC_HANDLE hService, DWORD
dwNumServiceArgs, LPCTSTR *lpServiceArgVectors);

SC_HANDLE hService - указатель службы, возвращённый
функцией CreateService или OpenService. Параметр
dwNumServiceArgs содержит в себе число параметров,
указанных в масиве lpServiceArgVectors. В этом
массиве указываются параметры, которые
будут переданы службе. Учтите, что сервисы
драйверов не используют этот параметр,
поэтому два последних параметра в нашем
случае нужно установить в NULL. Если функция
выполнилась успешно, то она возвращает
ненулевое значение. Функции для остановки
службы нет, но ее можно легко написать с
использованием функции ControlService:

BOOL ControlService(SC_HANDLE hService, DWORD dwControl,
LPSERVICE_STATUS lpServiceStatus);

Параметр dwControl содержит флаги, с помощью
которых вы задаёте, что нужно сделать со
службой. Если вам нужно остановить работу
службы, то можете установить её в
SERVICE_CONTROL_STOP. С помощью этой функции можно и
более удобно останавливать и запускать
службу. Например для паузы работы сервиса,
установите параметр dwControl в SERVICE_CONTROL_PAUSE, а
для продолжения работы в SERVICE_CONTROL_CONTINUE.
Параметр lpServiceStatus - указатель на структуру
SERVICE_STATUS, куда заносится текущий статус
службы. Установите его в NULL, если вам не
важен текущий статус работы службы. Эта
функция возвращает ненулевое значение при
успешном выполнении.

Я перечислил все необходимые функции для
загрузки руткитов (драйверов).Для закрытия
структуры DT SCM используйте функцию
CloseServiceHandle. Она принимает единственный
параметр - DT SCM, т.е. описание, возвращённое
функцией OpenSCManager.

Всех этих функций вполне достаточно для
загрузки и исполнения руткитов. Ниже я
приведу пример использования этих функций.

#define rootkitname "myrootkit" //
задаём имя нашего руткита

BOOL StopRootkit(SC_HANDLE hService) //
Объявляем
функции остановки и старта работы службы

BOOL StartRootkit(SC_HANDLE hService)//
int main()
{
SC_HANDLE hManager,hService; //
описатели
SCM базы и службы

LPVTSTR rootkpath="C:\myrootkit.sys"; //

полный путь к нашему руткиту

hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //
создаём
связь с БД SCM

if (hManager) // если всё в порядке
{

hService=CreateService(hManager, rootkitname,rootkitname,SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, SERVICE_BOOT_START,SERVICE_ERROR_NORMAL, \rootkpath,
NULL,NULL,NULL, NULL,NULL,NULL); // создаём
службу, управляющую нашим руткитом

if (hService) // всё в порядке?
{
StartService(hService,NULL,NULL); //
запускаем
созданную службу, тем самым запуская наш
руткит

}

if (StopRootkit(hService)) // если
остановка прошла успешно,

{
StartRootkit(hService);//
то заново
запускаем её

};
CloseServiceHandle(hManager); //
закрываем
DT SCM (БД SCM).

}
BOOL StopRootkit(SC_HANDLE hService)
{
BOOL ok=true;
if (hService)
{
ok=ControlService(hService,SERVICE_CONROL_STOP,NULL); //
вызываем
функцию ControlService с флагом SERVCE_CONTROL_STOP, тем

if (!ok) // самым останавливая
работу сервиса

{
ok=false;
};
};
return ok;
}

BOOL StartRootkit(SC_HANDLE hService)
{
BOOL ok=true;
if (hService)
{
ok=ControlService(hService,SERVICE_CONTROL_START,NULL); // вызываем
функцию ControlService с флагом SERVCE_CONTROL_START, тем

if (!ok) //с амым запуская службу
{
ok=false;
};
};
return ok;
}

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

Советую вам прочитать в книге Свена
Шрайбера ("Недокументированные
возможности Windows 2000") раздел, посвящённый
программированию драйверов. Также
рекомендую цикл статей от Four-F, посвященный
созданию драйверов в Windows NT. Посмотрите
статью от Ms-Rem,"Перехват API функций в Windows NT
(часть 3).Нулевое кольцо". И не проходите
мимо rootkit.com .

    Для управления службами в Windows используются следующие средства:
  • Оснастка services.msc - самое удобное средство управления службами;
  • Программа msconfig.exe - кроме управления службами позволяет еще управлять запуском Windows (смотри главу Полезные служебные программы Windows 7);
  • Команды net и sc - используются для управления службами из командной строки. Щелкните на кнопке Пуск, введите services.msc и нажмите клавишу Enter. Вы увидите оснастку управления службами.

Разберемся, как управлять службами. Дважды щелкните на какой-нибудь службе - выберите любую, нас сейчас не интересует какая-то конкретная служба. Вы увидите окно свойств службы.


Вкладка Общие содержит имя службы, описание службы, имя выполняемого файла службы, кнопки управления службой. Здесь вы можете изменить тип запуска. Из списка Тип запуска можно выбрать один из типов запуска службы.

    В поле Состояние выводится текущее состояние службы:
  • Работает - служба запущена и работает в данный момент;
  • Остановлена - служба не запущена;
  • Приостановлена - служба запущена, но приостановлена в данный момент.
    Кнопки управления службами:
  • Запустить - запускает остановленную (или еще не запущенную) службу;
  • Остановить - остановить службу;
  • Приостановить - приостановить выполнение службы (не все службы поддерживают приостановку); для продолжения выполнения службы используется кнопка Продолжить;
  • Продолжить - продолжить выполнение службы.

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

Похожие публикации