#4 24.11.06 13:52
Re: Службы Windows
При старте ОС запускается менеджер служб(SCM Manager).Считывая данные из реестра (имя сервиса, способ загрузки, тип драйвера и т.д.), он составляет базу данных для управления службами. Я опишу некоторые функции, с помощью которых можно управлять сервисами. Сначала требуется создать связь с этой базой данных (SCM database), затем передать указатель баз данных некоторым функциям, управляющими сервисами.
OpenSCManager
Как я уже сказал, первым делом нужно создать связь с базой данных 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
Функция 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-разрешает остановку работы сервиса.
Данная функция возвращает указатель открываемой службы. Получив его мы можем управлять службой в соответствии с заданными правами.
CreateService
Эта функция нужна для создания сервиса (службы).
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.
(с)xakep.ru,кажется.
Offline
#5 24.11.06 21:52
Re: Службы Windows
тогда уж лучше обратиться к первоисточнику ;) Service Functions
Исправлено Logos (24.11.06 21:53)
Offline

