Защита процесса от удаления.

Тема в разделе "WASM.WIN32", создана пользователем nickkadrov, 9 авг 2007.

  1. nickkadrov

    nickkadrov New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2007
    Сообщения:
    2
    Мне надо защитить процесс в Win Vista от завершения с наружи.
    Другими словами, чтобы мог процеес завершиться только
    из нутри или системой при завершении!
    Вообщем не убиваемый процесс!

    Пытался это сделать через права.
    GetKernelObjectSecurity -> GetDacl -> AddDeniedAce -> SetDacl -> SetKernelObjectSecurity

    Через таск менеджер не удаляеться. Сначала обрадовался,
    но потом попробовал Процес Эксплорером, и он удалил

    Есть мысли как это сделать?
     
  2. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    nickkadrov
    думаю перехват NtOpenProcess может тебе помоч
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    перехват NtOpenProcess тоже не решение: можно перечислить хендлы и найти среди них хендл интересующего процесса. Лучше сразу ZwQuerySystemInformation и ZwQueryInformationProcess.

    и лезть в ring0
     
  4. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    от Процес эксплорера спасет :)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    он вообще через драйвер удаляет, насколько я помню.
    Перехватывать придется NtTerminateThread и NtTerminateProcess
    Там сделать ObReferenceObjectByHandle и сравнить EProcess->UniqueProcessId с нужным ProcessId. Если равны, вернуть ошибку.

    В чем прикол перехватывать NtOpenProcess я хз..
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Great
    ну можно же инжектнуцо в процесс и сделать ExitProcess :)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ExitProcess вызовет ExitThread, которая в конце концов вызовет снова ту же ZwTerminateThread.
    так что все ништяк
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Great
    ну можна еще все потоки усыпить-чем не убийство, или в отладку взять. вощем хэндлы на процесс отдавать нежелательно.
     
  9. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    угу, поэтому перехват NtOpenProcess имхо самый простой и удобный вариант
     
  10. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    перечислят хендлы и вызовут createremotethread в никуда ... как следствие падение всего процесса
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    slow
    А ну в принципе да... ) Кстати тут такая тема уже была
     
  12. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    и почти самый безполезный!
     
  13. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    nickkadrov

    0/ Пробежаться по таблице хэндлов под юзермодом и сделать им всем NtDuplicateObject (DUPLICATE_CLOSE_SOURCE) с последующим NtClose

    1/ Хук NtOpenProcess, NtOpenThread (SSDT)
    враги не должны получить хэндл процесса / трида никаким образом

    2/ Чистить импорт до состояния только ntdll.dll/kernel32.dll
    это для следующей стадии

    3/ Хук LoadLibraryExW внутри себя
    для отсеивания dllных паразитов и преведов от user32.dll, кернел мода

    4/ Правка таблицы хэндлов под ядром. Для острастки можно ещё NtDuplicateObject прикрыть.
    нету хэндла, нет проблемы

    5/ Перекрывать функции в Shadow таблице, какие не скажу, но их количество > 6
    окно можно найти многими способами, прибить ещё большим количеством

    6/ Рандомить все, что только можно
    чтобы не могли идентифицировать тебя

    7/ Для кучу хук на NtTerminateProcess (EndTask упадет в таком случае)
    8 и самое главное/ добавить совместимость с остальными программами, после всех этих извращений.

    И даже после всего этого существует, по меньшей мере несколько способов, которые прикончат твой процесс из-под юзермода.

    Я занимался написанием нескольких версий факми (задачи типа - "убей меня как-нибудь", по аналогии с крякми) и пришел к выводу, что полностью защитить оконный процесс практически невозможно.

    Совет: Либо перекрывай все, что только можно и превращайся в КАВ / HIPS, либо бросай эту стремную затею, либо отказывайся от интерфейса и работай в консоли / коммандной строке.
     
  14. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    гы лол, конечно, только своим )))))
     
  15. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    pushick
    А если защищенный таким образом процесс работает под restricted user'ом, и атакующий тоже, и винда пропатчена, хоть в этом случае есть гарантия?

    ЗЫ. Про прикол с PostThreadMessage(threadID, WM_QUIT, 0, 0) знаю, и как от него защититься тоже. А еще что-нибудь есть?
     
  16. nickkadrov

    nickkadrov New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2007
    Сообщения:
    2
    Решил в итоге так:
    Создаю 2 процесса,
    которые следят друг за другом.
    Если один умирает, то другой запускает его
    заново и наоборот. При этом один процесс только
    следит, а другой ещё и выполняет определённую задачу.
    Убить не получилось :)
     
  17. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    nickkadrov
    SuspendThread для всех потоков, а потом можно спокойно килять оба процесса.
     
  18. pushick

    pushick New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2007
    Сообщения:
    95
    Возможно. Однако в моем случае задача всегда состояла в защите/убийстве процесса, работающего в максимально агрессивной среде, где такие слова как патчи/restricted users неведомы.

    Это все можно перекрыть в Shadow таблице. Можно и в юзермоде. А какой у тебя способ?
    Способов полно - самый банальный брутфорс мессаджами окна жертвы.

    Atlantic тут же дал тебе лекарство от такой "крутой" защиты. Это ты у КАВа подсмотрел, да? Ну так там у них в разных версиях по разному. В пятой вроде как они свой процесс делали критическим-системным, чтобы при его снятии был БСОД. В семерке один процесс висит как сервис, проверяет существования пользовательского процесса и если его нет, запускает, а если убивают его, он перезапускается, т.к. это сконфигурированный должным образом сервис. Однако не стоит забывать, что при всем этом КАВ активно вздрючил sdt и shadow.

    Самые неубиваемые из юзермод процессы, это те, что не имеют окон, имхо.
     
  19. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    pushick
    С PostThreadMessage все просто - тупо перехватываю в своем процессе PeekMessage и GetMessage, и фильтрую все мессаги WM_QUIT. А еще я как-то делал прикольный брутфорс - вызывал рандомно кучу keybd_event с такими параметрами, как Alt+Tab и Alt+F4, VK_RETURN, и все проги закрывались на ура.
     
  20. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Это точно. Например последний билд РкУ (3.7.300.503) уязвим из-за того, что одно окно у него все-таки есть (ну и еще кое из-за чего ;). Я уже отправил EP_X0FF очередную версию своего RkU bypass...

    А вообще, единственный неубиваемый процесс - повисший в deadlock'e на NtQueryObject (касаемо только WinXP).