Доброе время суток.
есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа.
последовательность действий такая:
0)поиск PID explorer.exe
1)OpenProcess(PROCESS_ALL_ACCESS,PID)/ GetProcessHandleWithEnoughRights
2)OpenProcessToken
3)CreateProcessAsUser
но на шаге 1 возвращает ERROR_ACCESS_DENIED. писали, что надо поставить SeDebugPrivilege через AdjustPrivilege, но я не понял, где это надо.
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток. А>есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа. А>последовательность действий такая: А>0)поиск PID explorer.exe А>1)OpenProcess(PROCESS_ALL_ACCESS,PID)/ GetProcessHandleWithEnoughRights А>2)OpenProcessToken А>3)CreateProcessAsUser
А>но на шаге 1 возвращает ERROR_ACCESS_DENIED. писали, что надо поставить SeDebugPrivilege через AdjustPrivilege, но я не понял, где это надо.
А>Заранее спасибо.
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 падает.
=====
GetLastError() для AdjustTokenPrivileges возвращает 6 (ERROR_INVALID_HANDLE) из под system, но под обычным не привилегированным пользователем все работает.
Здравствуйте, Аноним, Вы писали:
А>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 ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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>Или ДЛЛ внедряется в другой процесс?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, DarkTranquillity, Вы писали:
DT>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню.. DT>>Или ДЛЛ внедряется в другой процесс?
А>эту длл юзает система каждый раз при печати.
То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?
Здравствуйте, DarkTranquillity, Вы писали:
DT>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, DarkTranquillity, Вы писали:
DT>>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню.. DT>>>Или ДЛЛ внедряется в другой процесс?
А>>эту длл юзает система каждый раз при печати.
DT>То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?
Здравствуйте, Malizia, Вы писали:
M>Здравствуйте, DarkTranquillity, Вы писали:
DT>>Здравствуйте, Аноним, Вы писали:
А>>>Здравствуйте, DarkTranquillity, Вы писали:
DT>>>>Чисто теоретически, если ДЛЛ используется обычным образом — (Ваш процесс ее вызывает и использует), то препятствий не припомню.. DT>>>>Или ДЛЛ внедряется в другой процесс?
А>>>эту длл юзает система каждый раз при печати.
DT>>То есть процесс спулера? Хм, это не совсем обычный процесс, а системный, и, возможно, система не дает выполнить в нем потенциально опасные с точки зрения безопаности функции — покопайте в эту сторону. Этот же код в Вашем тестовом приложении отрабатывает нормально?
M>вполне.
Ну что ж, значит как я и сказал выше, куда копать. Кстати, попробуйте без проверки на ошибку — некоторые API-функции отрабатывают нормально, хотя GetLastError показывает ошибку.
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток. А>есть некий драйвер, есть залогиненный пользователь У, есть некий исполняемый бинарник Х. возникла необходимость запуска из драйвера (работает под SYSTEM) процесса Х с привилегиями пользователя У. на форуме были подобные темы, но они остались без ответа. А>последовательность действий такая: А>0)поиск PID explorer.exe
Хм, а кто сказал, что он должен быть запущен? Или в этом случае процесс запускать не надо?