OpenProcess-OpenProcessToken
От: Аноним  
Дата: 11.11.08 04:40
Оценка:
Доброе время суток.
есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа.
последовательность действий такая:
0)поиск PID explorer.exe
1)OpenProcess(PROCESS_ALL_ACCESS,PID)/ GetProcessHandleWithEnoughRights
2)OpenProcessToken
3)CreateProcessAsUser

но на шаге 1 возвращает ERROR_ACCESS_DENIED. писали, что надо поставить SeDebugPrivilege через AdjustPrivilege, но я не понял, где это надо.

Заранее спасибо.
Re: OpenProcess-OpenProcessToken
От: DarkTranquillity  
Дата: 11.11.08 06:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброе время суток.

А>есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа.
А>последовательность действий такая:
А>0)поиск PID explorer.exe
А>1)OpenProcess(PROCESS_ALL_ACCESS,PID)/ GetProcessHandleWithEnoughRights
А>2)OpenProcessToken
А>3)CreateProcessAsUser

А>но на шаге 1 возвращает ERROR_ACCESS_DENIED. писали, что надо поставить SeDebugPrivilege через AdjustPrivilege, но я не понял, где это надо.


А>Заранее спасибо.


Как где? Прямо перед вызовом OpenProcess. Про это есть ссылка прямо в разделе MSDN про OpenProcess — To open a handle to another another process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.

Желательно бы потом вернуть обратно привилегии, чтобы случайно чего-то не напартачить, если конечно не вредителя пишем.
Re[2]: OpenProcess-OpenProcessToken
От: Аноним  
Дата: 11.11.08 21:09
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:

DT>Как где? Прямо перед вызовом OpenProcess. Про это есть ссылка прямо в разделе MSDN про OpenProcess — To open a handle to another another process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.


DT>Желательно бы потом вернуть обратно привилегии, чтобы случайно чего-то не напартачить, если конечно не вредителя пишем.


кусок кода:
DWORD explorer_ID; // PID explorer.exe
HANDLE hProcess,hToken;

hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId());// или GetCurrentProcess()
if(!hProcess)
// завершение работы
if(!SetPrivilege(hProcess,_T("SeDebugPrivilege"),TRUE)// функция из msdn как пример AdjustTokenPrivilege
// завершение работы
CloseHandle(hProcess);

hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,explorer_ID);
if(!hProcess)
// ...
if(!OpenProcessHandle(hProcess,TOKEN_QUERY,&hToken))
// ...
CloseHandle(hProcess)
// убираю SeDebugPrivilege от текущего процесса
...

проблема в том, что первый вызов OpenProcess возвращает ERROR_ACCESS_DENIED. Пробывал выставлять TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY не помогает, хотя при запуске из под обычного пользователя все нормально, а из под system падает.
Re[3]: OpenProcess-OpenProcessToken
От: Аноним  
Дата: 11.11.08 22:16
Оценка:
LUID seDebug;
TOKEN_PRIVILEGES tkp;
HANDLE hTokenCurr;

OpenProcessToken(GetCurrentProcess(),TOKEN_АDJUST_PRIVILEGES|TOKEN_QUERY,&hTokenCurr);

LookuptPrivilegeValue(NULL,SE_DEBUG_NAME,&seDebug);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Luid=seDebug;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hTokenCurr,FALSE,&tkp,sizeof tkp,NULL,NULL);

CloseHandle(hTokenCurr);

=====
GetLastError() для AdjustTokenPrivileges возвращает 6 (ERROR_INVALID_HANDLE) из под system, но под обычным не привилегированным пользователем все работает.
Re[4]: OpenProcess-OpenProcessToken
От: DarkTranquillity  
Дата: 12.11.08 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>LUID seDebug;

А>TOKEN_PRIVILEGES tkp;
А>HANDLE hTokenCurr;

А>OpenProcessToken(GetCurrentProcess(),TOKEN_АDJUST_PRIVILEGES|TOKEN_QUERY,&hTokenCurr);


А>LookuptPrivilegeValue(NULL,SE_DEBUG_NAME,&seDebug);

А>tkp.PrivilegeCount=1;
А>tkp.Privileges[0].Luid=seDebug;
А>tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

А>AdjustTokenPrivileges(hTokenCurr,FALSE,&tkp,sizeof tkp,NULL,NULL);


А>CloseHandle(hTokenCurr);


А>=====

А>GetLastError() для AdjustTokenPrivileges возвращает 6 (ERROR_INVALID_HANDLE) из под system, но под обычным не привилегированным пользователем все работает.

Неплохо бы проверять, что возвращают ВСЕ функции:

    if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken ))
    {
        ret = GetLastError();
        WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
        goto EXIT;
    }

    // Получим значение LUID привилегии по символическому названию
    state.PrivilegeCount = 1;
    if ( !LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &state.Privileges[0].Luid ))
    {
        ret = GetLastError();
        WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
        goto EXIT;
    }

    // Запросим привилегию для нашего маркера
    state.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( !AdjustTokenPrivileges( hToken, false, &state, sizeof(state), NULL, NULL ))
    {
        ret = GetLastError();
        WriteLog(LOG_PATH, _T("LINE: %u\tError: %u"), __LINE__, ret);
        goto EXIT;
    }


Это кусок кода для моих нужд, не стал переделывать, думаю, это не сложно — он работал под Local System.
Re[5]: OpenProcess-OpenProcessToken
От: Аноним  
Дата: 14.11.08 05:25
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:

DT> if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken ))


не может этого сделать — ERROR_ACCESS_DENIED
а это нормально, если это все в .dll ?
Re[6]: OpenProcess-OpenProcessToken
От: DarkTranquillity  
Дата: 17.11.08 10:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DarkTranquillity, Вы писали:


DT>> if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken ))


А>не может этого сделать — ERROR_ACCESS_DENIED

А>а это нормально, если это все в .dll ?

Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню..
Или ДЛЛ внедряется в другой процесс?
Re[7]: OpenProcess-OpenProcessToken
От: Аноним  
Дата: 18.11.08 06:27
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:

DT>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню..

DT>Или ДЛЛ внедряется в другой процесс?

эту длл юзает система каждый раз при печати.
Re[8]: OpenProcess-OpenProcessToken
От: DarkTranquillity  
Дата: 18.11.08 06:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DarkTranquillity, Вы писали:


DT>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню..

DT>>Или ДЛЛ внедряется в другой процесс?

А>эту длл юзает система каждый раз при печати.


То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?
Re[9]: OpenProcess-OpenProcessToken
От: Malizia  
Дата: 18.11.08 07:45
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:

DT>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, DarkTranquillity, Вы писали:


DT>>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню..

DT>>>Или ДЛЛ внедряется в другой процесс?

А>>эту длл юзает система каждый раз при печати.


DT>То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?


вполне.
Re[10]: OpenProcess-OpenProcessToken
От: DarkTranquillity  
Дата: 19.11.08 06:50
Оценка:
Здравствуйте, Malizia, Вы писали:

M>Здравствуйте, DarkTranquillity, Вы писали:


DT>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, DarkTranquillity, Вы писали:


DT>>>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню..

DT>>>>Или ДЛЛ внедряется в другой процесс?

А>>>эту длл юзает система каждый раз при печати.


DT>>То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?


M>вполне.


Ну что ж, значит как я и сказал выше, куда копать. Кстати, попробуйте без проверки на ошибку — некоторые API-функции отрабатывают нормально, хотя GetLastError показывает ошибку.
Re: OpenProcess-OpenProcessToken
От: Were  
Дата: 19.11.08 07:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброе время суток.

А>есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа.
А>последовательность действий такая:
А>0)поиск PID explorer.exe
Хм, а кто сказал, что он должен быть запущен? Или в этом случае процесс запускать не надо?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.