Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #96, ДЕКАБРЬ 2006 г.

Дилдо для антивируса

Михаил «Horrific» Фленов

Хакер, номер #096, стр. 096-126-3


3. Переменная типа SERVICE_STATUS, через которую мы получим последнее состояние сервиса.

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

Использование менеджера

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

Единственная не рассмотренная мной функция, которая есть в этом примере, – это CloseServiceHandle (аналог CloseHandle). С ее помощью необходимо закрывать открытый нами хэндл сервиса или хэндл менеджера управления сервисами.

Ах, чуть не забыл. Все функции работы с сервисами и менеджером описаны в модуле WinSvc.pas, поэтому не забудь прописать его в разделе uses, иначе пример не скомпилируется.

Стартуем

Обрати внимание, что при рассмотрении функции контроля ControlService я не привел флага, который отвечал бы за запуск сервиса. Нет, я не опустил его из-за ненадобности, просто за запуск отвечает совершенно другая функция - StartService.

function StartService(

hService: SC_HANDLE;

dwNumServiceArgs: DWORD;

var lpServiceArgVectors: Pchar

): BOOL; stdcall;

Давай глянем на параметры этой функции.

1. Хэндл сервиса, который нужно запустить.

2. Количество передаваемых аргументов. Они передаются в виде строк в третьем параметре функции.

3. Массив из строк аргументов. Каждый элемент массива – это строка, которая заканчивается нулем.

Не знаю, отчего в Microsoft запуск сервиса выделили в отдельную функцию и не смогли все реализовать в универсальной ControlService. Мне кажется, что это связано с безопасностью, но когда кажется, нужно креститься. Оставим лишнюю функцию на совести разработчиков, тем более что их совесть выдерживала и не такое :).

Со стартом могут быть проблемы. Не каждый может это сделать, особенно если для корректной работы требуется запуск других сервисов. Если результат не нулевой (true), то запуск произошел успешно, а если нулевой (false), то произошла ошибка.

Оснастим

С помощью функций менеджера управления сервисов ты легко можешь написать собственную оснастку управления сервисами. Конечно, мы ещё не рассмотрели все функции SC-менеджера, потому что их очень много и вместить их в одну статью не реально, а растягивать на несколько - нет смысла. Поэтому, чтобы облегчить твое дальнейшее изучение этой темы, я сделаю краткий обзор функций, которые могут тебя заинтересовать. А дальше уже MSDN тебе в помощь.

- QueryServiceStatus – запрашивает информацию о состоянии сервиса. У функции 2 параметра: хэндл сервиса и переменная типа SERVICE_STATUS, куда будет записан результат.

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

Назад на стр. 096-126-2  Содержание  Вперед на стр. 096-126-4