На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Как проверить, что софт запущен от учетной записи Системы? , Проверить что запущено от NT SYSTEM / LocalSystem / etc
    Здравствуйте
    Посоветуйте, как можно проверить, что софт запущен от учетной записи системы? Не знаю, как люди его запускают, нужно контролировать такое и выводить предупреждение / делать перезапуск с нормальными юзер-правами.

    Пробовал апи GetUserNameW - все хорошо, но оно выдает имя с учетом языка; т.е. будет "Система" "System" и еще бог знает что. Не вариант.

    Пробовал вот так:

    ExpandedWrap disabled
      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
      Думаю, по стандартным GUID надёжно. Смотри тут.
        Qraizer
        спасибо, а чем проверять? CheckTokenMembership или тут другое ?
          Наиболее общее – получив токен процесса OpenProcessToken(), запросить информацию о нём GetTokenInformation(). Там есть всё, и юзер, и группы. Возможно, будет достаточно запросить TokenUser и проанализировать его SID
            Цитата zer0cat @
            Посоветуйте, как можно проверить, что софт запущен от учетной записи системы?

            Т.е. ты хочешь узнать, имеются ли права администратора ?
            Попробуй так:
            ExpandedWrap disabled
              // ---------------------------------------------------------------------------------
              #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;
              }
              // ---------------------------------------------------------------------------------
            Сообщение отредактировано: ЫукпШ -
              Администратор и Система — это разные учётки, разные возможности, разные привилегии.
                Все верно, нужна проверка на права Системы, а не Админа.
                Спасибо за ответы, вектор направления понял!
                  Цитата zer0cat @
                  Пробовал апи GetUserNameW - все хорошо, но оно выдает имя с учетом языка; т.е. будет "Система" "System" и еще бог знает что. Не вариант.

                  Это может быть вариантом.
                  Например - смотрим, кто является юзером svchoct, после чего сравниваем юзеров
                  подсудимого процесса и svchoct-а. (или всех svchost-ов)
                  Ещё вариант:
                  Смотрим PID парента подсудимого процесса.
                  Если он равен PID-у парента svchoct или равен PID процесса "services",
                  значит нашли.
                  Ещё можно пройтись по иерархии парентов процесса - если доберёмся до "services",
                  значит опять нашли.
                  ---
                  Возможно решение проблемы иначе - если подсудимый процесс не имеет в своей
                  иерархии парентов базового родителя "explorer" значит он подозрителен
                  и должен быть убит.
                  Сообщение отредактировано: ЫукпШ -
                    Цитата zer0cat @
                    Все верно, нужна проверка на права Системы, а не Админа.

                    Предположим, что наш процесс получил права админа.
                    ---
                    Он извлекает из своих ресурсов исполнимый файл-службу, инсталлирует
                    её в систему и сразу запускает. Служба работает с првилегиями System.
                    После успешного запуска службы, он просит её запустить себя - и новая
                    копия себя запущена с привилегиями System.
                    После этого, 1-ая версия себя с административными привилегиями
                    останавливает службу, де-инсталлирует её из системы, уничтожает
                    файл службы на диске и заканчивает работу.
                    И остаётся процесс с правами System.
                    ---
                    Описанный алгоритм я не пробовал, но он вполне реален.
                    Сообщение отредактировано: ЫукпШ -
                      Чтобы инсталлировать службу, нужны права админа. Если есть права админа, то сделать можно много что, но программно – только если заранее предусмотреть в программе такую возможность. Насколько я понял, у ТС такого не предусмотрено, значит юзеры используют какой-то другой механизм. В XP это делалось легко, но дальше уже весьма затруднительно. Наверняка где-то в безопасности системы дыра.

                      Добавлено
                      Цитата zer0cat @
                      делать перезапуск с нормальными юзер-правами.
                      Это несложно на самом деле. Если ты уже с правами Системы, то простое WTSGetActiveConsoleSessionId() и WTSQueryUserToken() дадут токен пользователя текущего сеанса, на основе которого несложно перезапустить себя CreateProcessAsUser().
                      Сообщение отредактировано: Qraizer -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0349 ]   [ 16 queries used ]   [ Generated: 29.03.24, 05:58 GMT ]