Перехват завершения процесса

Тема в разделе "WASM.WIN32", создана пользователем psu, 12 ноя 2007.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Надо сделать так, чтобы процес, в который внедряемся, не завершился до окончания работы внедряемого кода. Самое простое, что приходит в голову - перехват ExitProcess-подобных функций. Насколько я понимаю, все они сводятся к ZwTerminateProcess или LdrShutdownProcess. Достаточно перехватывать эти две?
     
  2. seeQ

    seeQ New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2003
    Сообщения:
    71
    а что если процесс завершится при перехвате ExitProcess??? Немного странный вопрос...
    Тем не мение, первое что приходит в голову мне - на время перехвата, остановить в перехватываемом процессе все потоки.
     
  3. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Не понял вопроса. Что значит при перехвате.

    Останавливать потоки нельзя. Идея в том, чтобы вместо, например ZwTerminateProcess, вызвалась моя функция, в которой будет что-то типа

    Код (Text):
    1. WaitForSingleObject( hMutex );
    2. real_ZwTerminateProcess(...)
    а при завершении внедряемого кода будет вызываться ReleaseMutex( hMutex )
     
  4. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    psu
    делаем так. работает
    при имплементации помни что ZwTerminateProcess не возвращается
     
  5. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    http://wasm.ru/forum/viewtopic.php?id=22106&p=1

    Так значит после первого возвращается или нет? ( еще не дебажил на предмет двойного вызова ZwTerminateProcess из ExitProcess, приду домой - проверю. Но все же.. )
    --
    Проверил. Таки возвращается
    Хотя в моем случае это не важно. Главное перехватить вызов и подождать, пока Х-код выполнится.
     
  6. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Если в ядре - можно хукнуть DeleteProcedure из PsProcessObjectType/PsThreadObjectType
     
  7. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    не в ядре

    --

    Реализовал такой перехват.

    В самом начале перехваченных функций код, при чем обьект события с именем EXIT_EVENT_NAME уже существует и занят.
    Код (Text):
    1.     HANDLE h = CreateEvent( 0, 0, 0, EXIT_EVENT_NAME );
    2.     WaitForSingleObject( h, INFINITE );
    3.     SetEvent( h );
    В тестовой проге сразу же после вызова Х-кода, вызываю ExitProcess. Происходит вызов моей функции, WaitForSingleObject "подвисает", далее рабоает поток, в котором выполняется Х-код. И вот там при вызове CopFileW прога виснет. При дебаге в нтдлл несколько раз встречается EnterCriticalSection, подозреваю, что проблема приблизительно такая: перед вызовом перехваченной ZwTerminateProcess вход в критическую секцию уже был сделан, а выход из-за WaitForSingleObject - нет. Вызов CopyFileW приводит к зависанию на входе в ту же секцию. Выходит, нельзя так перехватывать? или я ошибся где-то?
     
  8. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    psu
    выхода из секции PebLock нет и не будет, процессу писец уже
    эта секция везде юзается, например на входе в CreateFileW
    в этом процессе никакой код кроме простейшего уже работать не будет
    короче - выноси все свои Copy в другой процесс, а тут оставляй только Wait
     
  9. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    плохо
    тогда может хукать что-нибуть повыше уровнем? Типа ExitProcess, TerminateProcess. Не так уж и много прог пользуть недокументированные ZwTerminateProcess и т.д

    А создавать отдельный процесс.. слишком палевно
     
  10. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    psu
    если похучишь TerminateProcess во _всех_ процессах и ExitProcess в этом - то да, тогда будет ок
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    psu
    зачем создавать? есть винлогон лсасс сервицес експлорер в конце концов, инжектись туда, создавай тред и там все делай, а в таргетном - только вейт