Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.214.215] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте
Посоветуйте, как можно проверить, что софт запущен от учетной записи системы? Не знаю, как люди его запускают, нужно контролировать такое и выводить предупреждение / делать перезапуск с нормальными юзер-правами. Пробовал апи GetUserNameW - все хорошо, но оно выдает имя с учетом языка; т.е. будет "Система" "System" и еще бог знает что. Не вариант. Пробовал вот так: OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &th); GetTokenInformation(th, TokenUser, p_t, 256, &RL) LookupAccountSidA(0, p_t->User.Sid,user1, &s, domain1, &s1, &s2); Возвращает имя и домен "NT Authority" , можно ли полагаться на эти данные, т.е. если домен такой, то это права системы или нет? Проверка по Integrity level не пойдет, ибо есть ХР/2к3 |
Сообщ.
#3
,
|
|
|
Qraizer
спасибо, а чем проверять? CheckTokenMembership или тут другое ? |
Сообщ.
#4
,
|
|
|
Наиболее общее – получив токен процесса OpenProcessToken(), запросить информацию о нём GetTokenInformation(). Там есть всё, и юзер, и группы. Возможно, будет достаточно запросить TokenUser и проанализировать его SID
|
Сообщ.
#5
,
|
|
|
Цитата zer0cat @ Посоветуйте, как можно проверить, что софт запущен от учетной записи системы? Т.е. ты хочешь узнать, имеются ли права администратора ? Попробуй так: // --------------------------------------------------------------------------------- #pragma comment(lib, "Advapi32.lib") #pragma comment(lib, "Netapi32.lib") // --------------------------------------------------------------------------------- BOOL WINAPI IamIsAdmin (void) { BOOL RetC = FALSE; WCHAR pUserName [2048]; DWORD dwUNBufLen = ARRAYSIZE(pUserName); if(!::GetUserNameW(pUserName, &dwUNBufLen)) return RetC; NET_API_STATUS nStatus; LPUSER_INFO_1 pLevel1Buf; nStatus = ::NetUserGetInfo(NULL, pUserName, 1, (LPBYTE*)&pLevel1Buf); if(NERR_Success != nStatus) return RetC; switch(pLevel1Buf->usri1_priv) { case USER_PRIV_GUEST : break; case USER_PRIV_USER : break; case USER_PRIV_ADMIN : RetC=TRUE; break; default : break; } ::NetApiBufferFree(pLevel1Buf); return RetC; } // --------------------------------------------------------------------------------- |
Сообщ.
#6
,
|
|
|
Администратор и Система — это разные учётки, разные возможности, разные привилегии.
|
Сообщ.
#7
,
|
|
|
Все верно, нужна проверка на права Системы, а не Админа.
Спасибо за ответы, вектор направления понял! |
Сообщ.
#8
,
|
|
|
Цитата zer0cat @ Пробовал апи GetUserNameW - все хорошо, но оно выдает имя с учетом языка; т.е. будет "Система" "System" и еще бог знает что. Не вариант. Это может быть вариантом. Например - смотрим, кто является юзером svchoct, после чего сравниваем юзеров подсудимого процесса и svchoct-а. (или всех svchost-ов) Ещё вариант: Смотрим PID парента подсудимого процесса. Если он равен PID-у парента svchoct или равен PID процесса "services", значит нашли. Ещё можно пройтись по иерархии парентов процесса - если доберёмся до "services", значит опять нашли. --- Возможно решение проблемы иначе - если подсудимый процесс не имеет в своей иерархии парентов базового родителя "explorer" значит он подозрителен и должен быть убит. |
Сообщ.
#9
,
|
|
|
Цитата zer0cat @ Все верно, нужна проверка на права Системы, а не Админа. Предположим, что наш процесс получил права админа. --- Он извлекает из своих ресурсов исполнимый файл-службу, инсталлирует её в систему и сразу запускает. Служба работает с првилегиями System. После успешного запуска службы, он просит её запустить себя - и новая копия себя запущена с привилегиями System. После этого, 1-ая версия себя с административными привилегиями останавливает службу, де-инсталлирует её из системы, уничтожает файл службы на диске и заканчивает работу. И остаётся процесс с правами System. --- Описанный алгоритм я не пробовал, но он вполне реален. |
Сообщ.
#10
,
|
|
|
Чтобы инсталлировать службу, нужны права админа. Если есть права админа, то сделать можно много что, но программно – только если заранее предусмотреть в программе такую возможность. Насколько я понял, у ТС такого не предусмотрено, значит юзеры используют какой-то другой механизм. В XP это делалось легко, но дальше уже весьма затруднительно. Наверняка где-то в безопасности системы дыра.
Добавлено Цитата zer0cat @ Это несложно на самом деле. Если ты уже с правами Системы, то простое WTSGetActiveConsoleSessionId() и WTSQueryUserToken() дадут токен пользователя текущего сеанса, на основе которого несложно перезапустить себя CreateProcessAsUser(). делать перезапуск с нормальными юзер-правами. |