Перейти до змісту
  • Програмне забезпечення
  • Службы Windows изнутри


    Рекомендовані повідомлення

    Здесь описывается программирование служб в ОС 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.

     

    Загрузка руткита

     

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

     

    #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;

    }

     

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

    Посилання на коментар
    Поділитись на інші сайти

    ну ну....те кому она может понадобится думаю имеют гору своей документации.

    78076[/snapback]

    источник www.xakep.ru или www.infosec.com.ua (use google:))
    Посилання на коментар
    Поділитись на інші сайти

    Ага, содрал, и даже сцилку на источник не кинул ((

    >> Информационный портал компьютерной безопасности http://192.168.38.160 <<


    Куплю винчестер. Жесткие диски не предлагать.

    Посилання на коментар
    Поділитись на інші сайти

    ×
    ×
    • Створити...

    Важлива інформація

    Використовуючи цей сайт, Ви погоджуєтеся з нашими Умови використання, Політика конфіденційності, Правила, Ми розмістили cookie-файлы на ваш пристрій, щоб допомогти зробити цей сайт кращим. Ви можете змінити налаштування cookie-файлів, або продовжити без зміни налаштувань..