Как определить кто запустил сервис

Тема в разделе "WASM.WIN32", создана пользователем MirrorBlack, 3 май 2009.

  1. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Учитывая то, что сервис является EXE файлом, запуск его возможен как SCM, так и пользователем.
    Нужно определить, что сервис запущен именно SCM.
    Пока думаю использовать QueryServiceStatusEx. Сравнивать PID процесса с SERVICE_STATUS_PROCESS.dwProcessId и SERVICE_START_PENDING.dwCurrentState должен быть равен SERVICE_START_PENDING.
    Может есть способ проще?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    есть
    может и не проще но правильнее
    OpenProcessToken
    GetTokenInformation(TokenSource)
    memcmp(SourceName, "*SYSTEM*", 8)

    а с чего ты решил что dwCurrentState будет SERVICE_START_PENDING ?
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    По идее, если сервис запущен SCM, то PID его родителя будет соответсвовать PID'у SCM (services.exe).
    Но если services.exe может быть завершён(?), то подобный способ никуда не годится.
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    z0mailbox
    Если я правильно понял - ловится учётка SYSTEM?
    Если да, то это ни есть гуд... Сервис однако под разными учётками можно запускать.

    Это не я решил, а на rsdn вычитал.
    Вот здесь:
    http://www.rsdn.ru/article/baseserv/svcadmin-2.xml

    К сожалению PID службы во время запуска недоступен, а вот dwCurrentState равен SERVICE_START_PENDING.
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    нет неправильно понял
    это так подписывается токен процесса
    фишка эта недокументированная и непонятная
    насколько я знаю - *SYSTEM* это системные процессы system/csrss/lsass/services/winlogon
    а также все сервисы под любыми учетными записями стартовавшие через StartService
    а вот если сервис вызвал CreateProcess то учетная запись нового процесса будет например родительская, например LOCAL_SYSTEM, а токен подпишется пустой строкой

    я не очень понимаю в какой момент ты исследуешь сервис
    ты перехватил StartService? или заинжектился в services.exe и похучил RPC таблицу?
    само собой что иногда стейт будет равен START_PENDING, вопрос - можно ли это уверенно отловить?
     
  6. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    z0mailbox
    Спасибо, добрый человек :)

    В момент запуска своего сервиса.
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Если кому интересно, единственно правильный путь - то что написал Sol_Ksacap
     
  8. mitek

    mitek New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2012
    Сообщения:
    4
    Вообще обычно это делается чтением флага WSF_VISIBLE для window station-а процесса. Если visible - то процесс запущен пользователем, если нет, то SCM:

    Код (Text):
    1. USEROBJECTFLAGS flags;
    2. DWORD sizeNeeded;
    3. BOOL isStartedAsService = GetUserObjectInformation(GetProcessWindowStation(), UOI_FLAGS, &flags, sizeof(flags), &sizeNeeded)
    4.    &&  !(flags.dwFlags & WSF_VISIBLE);
     
  9. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    нет
    необязательно SCM
    возможно совсем другим процессом
    например - заходим телнетом на комп и запускаем процесс -> WSF_VISIBLE =0
    или - запуск через at без /INTERACTIVE
    итд итп