Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EnableDebugPrivilege 
:(
    Опции темы
Rutti
Дата 10.5.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



main.cpp
Код

#include <iostream>
#include <windows.h>
#include <tchar.h>

#include "EnableDebugPrivilege.h"

using namespace std;

int main()
{
//------------------------------------------------------------------------

        EnableDebugPrivilege(INVALID_HANDLE_VALUE);
//------------------------------------------------------------------------

        SC_HANDLE schSCManager;

        schSCManager=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

        if (NULL!=schSCManager)
        {

                SC_HANDLE schService;
                _TCHAR *ser_name=_T("nnCron");
                schService = OpenService(schSCManager, LPCWSTR(ser_name), SERVICE_STOP | DELETE);
                if(NULL!=schService)
                {
                        SERVICE_STATUS Status;
                        ControlService(schService, SERVICE_CONTROL_STOP, &Status);
                        Sleep(200);
                        BOOL bOk = DeleteService(schService);                        
//------------------------------------------------------------------------

                        if(bOk)
                        {
                                Sleep(1000);
                                if(StartService(schService,
                                                                0,
                                                                NULL
                                                          ))
                                else
                                        cout<<"Don't start service..."<<endl;
                        }
//------------------------------------------------------------------------

                        CloseServiceHandle(schService);                
                }
                else
                        cout<<"Service not access - "<<GetLastError()<<endl;
                
                CloseServiceHandle(schSCManager); 
        }
        else
                cout<<"Not Connection - "<<GetLastError()<<endl;
//------------------------------------------------------------------------
        
        return 0;
}


EnableDebugPrivilege.cpp
Код

#include <windows.h>

void EnableDebugPrivilege(bool fEnable)
{
        HANDLE hToken;

        if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
        {
                TOKEN_PRIVILEGES tp;
                tp.PrivilegeCount = 1;
                LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
                tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
                AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL);
                CloseHandle(hToken);
        }
}


Пытаюсь отключить на время службу и потом её включить.
1. С админскими правами службу включить обратно не удаётся;
2. Под Пользователем вообще не удаётся подключиться к Service Control Manager, не смотря на наличие EnableDebugPrivilege().
PM MAIL   Вверх
Damarus
Дата 10.5.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(Rutti @  10.5.2007,  14:26 Найти цитируемый пост)
1. С админскими правами службу включить обратно не удаётся;

Конечно, ты ведь её удаляешь:
Цитата(Rutti @  10.5.2007,  14:26 Найти цитируемый пост)
Код
BOOL bOk = DeleteService(schService);


Цитата(Rutti @  10.5.2007,  14:26 Найти цитируемый пост)
2. Под Пользователем вообще не удаётся подключиться к Service Control Manager, не смотря на наличие EnableDebugPrivilege(). 

По умолчанию, пользователи не могут управлять службами.

ЗЫ. 

Цитата(Rutti @  10.5.2007,  14:26 Найти цитируемый пост)
Код
EnableDebugPrivilege(INVALID_HANDLE_VALUE);

 smile

Добавлено через 5 минут и 16 секунд
И вообще, привилегия SeDebugPrivilege тут не нужна.

Это сообщение отредактировал(а) Damarus - 10.5.2007, 18:54
PM MAIL ICQ Jabber   Вверх
Rutti
Дата 11.5.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



Цитата(Damarus @  10.5.2007,  18:52 Найти цитируемый пост)
1. С админскими правами службу включить обратно не удаётся;Конечно, ты ведь её удаляешь:


Ну а что тогда происходит (с точки зрения кода), когда я через ProcessExplorer (Русиновича) делаю Kill Process или даже Kill Process Tree? После перезапуска системы все "убитые" ProcessExplorer'ом службы восстанавливаются.


Цитата(Damarus @  10.5.2007,  18:52 Найти цитируемый пост)
2. Под Пользователем вообще не удаётся подключиться к Service Control Manager, не смотря на наличие EnableDebugPrivilege(). По умолчанию, пользователи не могут управлять службами.


Так а зачем тогда EnableDebugPrivilege придуман?

Цитата(Damarus @  10.5.2007,  18:52 Найти цитируемый пост)
И вообще, привилегия SeDebugPrivilege тут не нужна.


Это почему вдруг?

PM MAIL   Вверх
SenkraD
Дата 11.5.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



1. Rutti,  слусжбу нужно остановить, ибо если ты её удаляеш, то потом её ещё нужно установить с помощью функции CreateService. 

2. Да, в твоём случае действительно не нужно давать процессу такие привилегии, а нужна эта функция чтобы повысить права твоему процессу, к примеру, ты хочеш выключить комп или проинжектироватся в системный процесс.

P.S. Кажись всё было так


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
korbian
Дата 11.5.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



DeleteService() безжалостно сносит службу. После ее успешного вызова scam о службе уже ничего не знает.
Такой код не безопасен: 
Цитата(Rutti @  10.5.2007,  15:26 Найти цитируемый пост)

Код

BOOL bOk = DeleteService(schService);
if(bOk)
{
Sleep(1000); 
if(StartService(schService,0,NULL)) 
else
cout<<"Don't start service..."<<endl;
}



А чего ты хочешь добиться вызовом EnableDebugPrivilege() ? 


--------------------
korbian ©
PM   Вверх
Rutti
Дата 11.5.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



Цитата(korbian @  11.5.2007,  09:13 Найти цитируемый пост)
А чего ты хочешь добиться вызовом EnableDebugPrivilege() ? 


Добиться исполнения кода (остановки или убития процесса) под Пользователем.
PM MAIL   Вверх
Pulse69
Дата 11.5.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



По умолчанию, привелегией SeDebugPrivilege не обладают простые пользователи (зайдите в локальные параметры безопасности и посмотрите кому дана привелегия "Отладка программ" в назначении прав пользователя).
Так что от попыток её включить или отключить толку не будет.
Если же добавить туда пользователя или группу, то программы, запущенные от его имени, смогут получить DEBUG-прив.
Добавить привелегии можно и программно. Если хотите, могу выложить код.


--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Rutti
Дата 11.5.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



Цитата(Pulse69 @  11.5.2007,  10:28 Найти цитируемый пост)
Если хотите, могу выложить код.


Хотите.
PM MAIL   Вверх
Pulse69
Дата 11.5.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Получайте.
Запускать, естественно, от администратора.

Код

#define SECURITY_WIN32

#include <windows.h>
#include <Lm.h>
#include <ntsecapi.h>
#include <stdlib.h>
#include <aclapi.h>
#include <sspi.h>

#include <tchar.h>

#define STATUS_SUCCESS 0

#pragma comment( lib, "secur32.lib")




//----------------------------------------------------------
//    НАЗНАЧЕНИЕ
//        Преобразовывает WSTR к PLSA_UNICODE_STRING
//    IN:
//        pwszString - Строка, которую надо преобразовать к PLSA_UNICODE_STRING
//    OUT:
//        pLsaString - Преобразованная строка
//
//    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
//        TRUE, если преобразование прошло успешно, иначе - FALSE
//----------------------------------------------------------
bool InitLsaString( PLSA_UNICODE_STRING pLsaString,
                    LPCWSTR pwszString )
{
    DWORD dwLen = 0;    

    if (NULL == pLsaString)
        return FALSE;

    //    Длина строки
    if (NULL != pwszString) 
    {
        dwLen = static_cast<int>(wcslen(pwszString));
        if (dwLen > 0x7ffe)   // Слишком большая строка
            return FALSE;
    }

    // Сохраняем строку
    pLsaString->Buffer = (WCHAR *)pwszString;
    pLsaString->Length =  (USHORT)dwLen * sizeof(WCHAR);
    pLsaString->MaximumLength= (USHORT)(dwLen+1) * sizeof(WCHAR);

    return TRUE;
}
//----------------------------------------------------------
//    НАЗНАЧЕНИЕ:
//        Получает описатель политики для компьютера
//    IN:
//        SystemName - имя компьютера, 
//        для которого нужно получить описатель политики
//
//    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
//        Хэндл политики, или NULL в случае ошибки
//----------------------------------------------------------
LSA_HANDLE GetPolicyHandle(wchar_t *SystemName)
{
    LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    USHORT SystemNameLength;
    LSA_UNICODE_STRING lusSystemName;
    NTSTATUS ntsResult;
    LSA_HANDLE lsahPolicyHandle;

    //    Инициализация
    ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));

    //    Инициализация
    SystemNameLength = (SystemName!=NULL)?static_cast<USHORT>(wcslen(SystemName)):0;
    lusSystemName.Buffer = SystemName;
    lusSystemName.Length = SystemNameLength * sizeof(WCHAR);
    lusSystemName.MaximumLength = (SystemNameLength+1) * sizeof(WCHAR);

    // Get a handle to the Policy object.
    ntsResult = LsaOpenPolicy(
        &lusSystemName,    //Name of the target system.
        &ObjectAttributes, //Object attributes.
        POLICY_ALL_ACCESS, //Desired access permissions.
        &lsahPolicyHandle  //Receives the policy handle.
        );

    if (ntsResult != STATUS_SUCCESS)
    {
        // An error occurred. Display it as a win32 error code.
        return NULL;
    } 
    return lsahPolicyHandle;
}
//----------------------------------------------------------
//    НАЗНАЧЕНИЕ:
//        Получает описатель безопасности для учётной записи
//    IN:
//        server - имя компьютера, которому принадлежит УЗ
//        AccountName - название УЗ
//
//    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
//        Хэндл описателя безопасности, или NULL в случае ошибки
//----------------------------------------------------------
PSID GetSIDInformation (LPWSTR server, LPWSTR AccountName)
{
    PSID psid    = NULL;
    DWORD dwSize = 0;

    TCHAR *buf  = NULL;
    DWORD dwBuf = 0;

    SID_NAME_USE siu;

    //    Узнаем необходимые размеры буферов
    LookupAccountName( server,
        AccountName,
        NULL,
        &dwSize,
        NULL,
        &dwBuf,
        &siu );

    //    Выделим память под буферы
    psid = operator new ( dwSize );//    За освобождение этого указателя отвечает вызывающая функция
    buf  = (TCHAR*)operator new ( dwBuf*sizeof( TCHAR ) );

    //    Получим описатель безопасности
    if(!LookupAccountName( server,
        AccountName,
        psid,
        &dwSize,
        buf,
        &dwBuf,
        &siu ))
    {
        if( buf ) operator delete ( buf );
        if( psid) operator delete ( psid );
        return NULL;
    }

    //    нам не нужны имена доменов, в которых происходил поиск
    if( buf ) operator delete ( buf );
    return psid;
}

//-----------------------------------------------------
//    Устанавливает политику для указанной учётной записи.
//-----------------------------------------------------
BOOL SetPolicy( wchar_t* server, wchar_t *wacct, wchar_t *policy )
{
    //    Получаем описатель безопасности для учётной записи
    PSID psid =  GetSIDInformation( server, wacct );
    //    Получаем дескриптор политик для компьютера
    LSA_HANDLE  ph = GetPolicyHandle( server );
    LSA_UNICODE_STRING lucPrivilege;
    NTSTATUS ntsResult;

    //    Создаём LSA-строку
    if (!InitLsaString(&lucPrivilege, policy))
    {
        return FALSE;
    }

    //    Добавляем политику
    ntsResult = LsaAddAccountRights(ph,    psid, &lucPrivilege, 1 );     
    BOOL bRet;
    if (ntsResult == STATUS_SUCCESS) 
    {
        bRet = TRUE;
    }
    else
    {
        bRet =  FALSE;
    }
    //    закрываем описатель политики
    LsaClose( ph );
    //    удаляем память, выделенную под описатель безопасности УЗ
    operator delete (psid);
    return bRet;
}




int _tmain(int argc, _TCHAR* argv[])
{
    SetPolicy( NULL/*локальный компьютер*/,
        L"Пользователи", L"SeDebugPrivilege" );
    return 0;
}




--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Damarus
Дата 11.5.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(Rutti @  11.5.2007,  07:50 Найти цитируемый пост)
Ну а что тогда происходит (с точки зрения кода), когда я через ProcessExplorer (Русиновича) делаю Kill Process или даже Kill Process Tree? После перезапуска системы все "убитые" ProcessExplorer'ом службы восстанавливаются.

И что? Службы ты при этом не удаляешь.
Цитата(Rutti @  11.5.2007,  07:50 Найти цитируемый пост)
Так а зачем тогда EnableDebugPrivilege придуман?

Тебе виднее, ты её написал.

Добавлено через 3 минуты и 4 секунды
Цитата(Rutti @  11.5.2007,  07:50 Найти цитируемый пост)
Это почему вдруг?

Потому, что не нужна.
Цитата(SenkraD @  11.5.2007,  09:09 Найти цитируемый пост)
... ты хочеш выключить комп ...

Для выключения нужна SeShutdownPrivilege.
Цитата(Rutti @  11.5.2007,  10:15 Найти цитируемый пост)
Добиться исполнения кода (остановки или убития процесса) под Пользователем. 

Не поможет.
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.