Перехват создания сервиса

Тема в разделе "WASM.WIN32", создана пользователем karabas_barabas, 5 май 2011.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    Интересует каким образом можно узнать кто "физически" создает сервис, а именно делает наподобие CreateProcess,
    чтобы можно было сделать перехват создания сервиса процессом для модификации кода сервиса до старта точки входа.
    Экспериментировал я на win7 с сервисом type: Share Process, при запуске сервиса апишками аля StartService,... создается физически новый процесс svchost.exe с новым pid и с сервисной дллкой, первое что пришло в голову - это посмотреть pid процесса родителя, им оказался services.exe в этот процесс установил api монитор и что только не перехватывал CreateProcessW/CreateProcessInternalW/NtCreateProcess/NtCreateProcessEx/NtCreateUserProcess/NtResumeThread - но ничего интересного это не дало, services.exe явно не принимает "физического" участия в создание этого процесса, такое ощущение что кто-то другой его полностью создает физически, а в PEB записывает родителя services.exe.
    У кого какие мысли есть по поводу природы создания сервиса ? может сервисный процесс полностью создается в ядре или все-таки какой-то юзермодный процесс запускает его?
     
  2. blackcod

    blackcod New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2011
    Сообщения:
    21
    тоже экспериментировал, bp в r3 на NtResumeThread, NtResumeProcess ничего не дал. видимо загрузчик сервисов расположен в ядре.
     
  3. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    svchost.
     
  4. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    NtLoadDriver хукать пробовали?
    Если не ошибаюсь, StartService сводится именно к NtLoadDriver
     
  5. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    также экспериментировал с Procmon , в нем очень наглядно видно кто кого запускает и т.д. - опция Show Process and Thread Activity , но опять данный сервисный процесс там появляется из ниоткуда
    StartService пляшет вокруг вызова NdrClientCall2 , которая собсно и стартует сервис
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Могу ошибаться, но насколько я помню, вызов происходит в контексте csrss.
     
  7. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
  8. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    to gaeprust:
    сможет ли как-то помочь мне эта писанина по твоей ссылке ? я так понимаю что ты хочешь сказать что его запускает один из процессов svchost ? но это не отобразилось в procmon, к сожаленью пытался я заинжектить дллку апи монитора в svchost.exe (ntsvcs, Plug&Play,...) и именно в этот процесс не прокатило почему-то. Моя цель - словить момент создания сервиса чтобы "пропатчить" его до начала выполнения, пока я не вижу реального решения на данный момент.
     
  9. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Только что проверил на xpsp3, при старте юзермодных сервисов вызывается services.exe->ZwCreateProcessEx.
    svchost тут скорее следствие чем причина, это задается в реестре->ImagePath.
    Не врубаюсь в чем у вас проблема))

    Сдается мне что ваши апи мониторы просто не ставят хуки в services.exe...
     
  10. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Вопрос патчинга это уже ваша фантазия))
    Можно проследить как в ZwCreateProcessEx передаются флаги и сделать саспендед->поставить APC. Можно указать свой дебаг порт и тогда вообще полный контроль =)
     
  11. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    karabas_barabas
    Вам onSide верно говорит. В ядерном отладчике брейк на сервис, создающий процесс. Потом смотрим текущий процесс и колстек. Да и вобще есть специальные средства диагностики, как например SystemObjectInformation, возвращающую информацию об родителе, ProcessHandleTracing возвращающая колстек на момент создания обьекта и пр. Да и процессы это юзермодные, с которыми олли чудесно справляется.
     
  12. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    я даже не сомневаюсь что на XP все так просто, данный вопрос больше волнует меня для систем >= Vista , там все по-другому, монитор работает отлично т.к. перехватывал создание services.exe процесса taskhost.exe
     
  13. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    karabas_barabas
    Пока на форуме системных вопросов, требующих размышления нет, то опишу некоторую хорошую, годную матчасть.
    Вначале следует дать понятие про процедуры. То их восприятие, которое у вас(не лично у вас, а вобще у всех) явно не достаточно для понимания стековой маршрутизации. Итак поехали.
    Цитата из одного привад тру хек мана(идите за пивом :)):
    Ну и несколько сносок:
    Короче говоря, дельта SFN <= NL. Это определяет наличие Bp-фреймов в процедурах. Что это даёт. Имея NL целевой процедуры, относительно текущей, мы получим SFN необходимый для бактрейса. Так мы найдём целевой стековый фрейм и заменив в нём адрес возврата при возврате получим управление, это называется стековой маршрутизацией или Post-редиректом. Как определять SFN. Для этого нужно знать NL и проверить каждую процедуру на формирование Bp-фрейма. Обычно это излишне.
    1. Описываем графом CreateProcess().
    2. Определяем уровень вложенности исходной процедуры относительно целевой(всякий двиг при трассировке графа должен определять NL), так как виньапи имеют stdcall-конвенцию и колбек тоже, то SFN = f(NL). Статическим анализом мы определим необходимую дельту. Определение дельты не надёжно, так как возможно, хотя и маловероятно изменение прототипа процедур.
    3. Из колбека выполняем стековю маршрутизацию. NL определён в 3, либо не известен. Если не известен, то выполняем бактрейс и проверяем вхождение(принадлежность) Ip каждого фрейма описанной в графе процедуре CreateProcess().
    4. При найденном фрейме выполняем маршрутизацию - загружаем в фрейм ссылку на хэндлер. Так как прототип фиксирован, то данная манипуляция абсолютна стабильна.
    5. После возврата получаем управление и делаем с процессом что угодно.
    6. Так как процесс может быть создан запущенным(!CREATE_SUSPENDED, это утверждение инвалидно - остановлен главны тред), то нужно его остановить. Это можно выполнить посредством динамической маршрутизации. Кратко говоря это трейс + бактрейс. Если NL(NtCreateProcessEx) <= BreakIp, то выполняем трейс, иначе бактрейс).
    7. Так как морфер не все писали, то нужно решение попроще. Релоцируем модуль и патчим его. Оригинальная проекция не изменна. Модифицируем стаб. Это переключение треда на отморфленный код. Так как код не изменяется, а меняется база, то свич примитивен: Ip' = Ip + Delta.
    8. Все пункты выше требует повышение NL. Для этого необходимо получить останов гдето внутри целевой апи. Можно использовать Ldr-колбеки. Автор использовал апи RtlAllocateHeap(), внутри которой получаем останов(способов стопяцот, поиск по васму).
    9. Профит. Абсолютный недетект перехватчика.

    Вопросы ?
     
  14. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Кстате я выше написал про извлечение аргументов из стека, но забыл упомянуть часто задаваемый вопрос про NtCreateProcess. Как определить имя экзе из которого создаётся процесс. Извлекаем из стека хэндл секции(Section Handle), проецируем её и извлекаем имя посредством NtQueryVirtualMemory(MemoryMappedFilenameInformation, MapBase). NtQuerySection не возвратит имя экзе.
     
  15. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    "привад тру хек мана" всплывают кусками, но разве кто сомневался, и причиной этому не интерес, оно ведь всегда всплывает
     
  16. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Ну не знаю ... мне, например, ответ понравился.
    А это выдержки откуда?
    Полный источник можно? Чтобы с содержанием,
    постановкой задачи, решением и заключительной благодарностью. )))
     
  17. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Какие-то все пассивные)) Вспомнил про этот топик, решил глянуть на виртуалке. Правда там семерка, а не виста.
    Неужели вам тяжело просто похукать ф-ции создания процесса и посмотреть что вызывается? SCM находится в services.exe это же написано у Руссиновича, что в 4 что в 5 издании.

    Вобщем вызывается ZwCreateUserProcess =) А taskhost тут никаким боком, так же как и svchost, я же писал что это задается в реестре.
     
  18. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    спс за интересный и подробный пост, но проблемы в технике установки перехвата абсолютно нет.
    специально накидал тестовую прогу, которая будет останавливать сервис и снова его запускать http://www.sendspace.com/file/1dk4fh
    пробовал перехватывать апи-монитором и olly в процессе services.exe на 2 компах - результат 0 , брейки на CreateProcessW/CreateProcessInternalW/NtCreateProcess/NtCreateProcessEx/NtCreateUserProcess/NtResumeThread/NtWriteVirtualMemory
    не срабатывают, система WIN7+SP1+UAC
     
  19. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Юзайте кернел отладчик, либо напишите свой инжект в services.exe и хуки заодно. Вызывается CreateProcessW.
    http://s44.radikal.ru/i106/1105/da/dd67cfd3160e.jpg
    скрин
     
  20. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    karabas_barabas
    Поправочка - с патчем кода проблем наверно нет. И со снятием его тоже нет никаких проблем. И с обнаружением. А значит не приемлимо :)