Проблема: Перехват TerminateProcess.

Тема в разделе "WASM.WIN32", создана пользователем mart, 27 ноя 2008.

  1. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Предыстория такова: Написал dll-ку, которая перехватывает TerminateProcess, загрузил её в task manager. Перехват работает отлично, управление попадает на мою функцию-перехватчик. Моя цель состоит в следующем: если пытаются завершить какой-то конкретный процесс, то нужно этому воспрепятствовать.

    Проблема: в функцию перехватчик передается хэндл процесса, который хочет завершить Task Manager. Так вот по этому хэндлу NTQueryInformationProcess возвращает код С0000022(access denied), GetProcessId возвращает 0, GetModuleFileName(не знаю уместна ли она в этом случае) тож ничего путевого не возвращает. В оконцовке я не могу определить, какой именно процесс завершается, нужный мне или нет. Вообще никакой доп.инфы по этому хэндлу отыскать не получается. Есть какие-нибудь варианты решения данной проблемы? Я подумываю в сторону дополнительного перехвата OpenProcess, но хотелось бы сделать все красиво, в единственной функции перехватчике. Заранее благодарю.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вероятно хендл открывается с правами только на terminate (PROCESS_TERMINATE или както так доступ).

    А чтобы не давать себя уничтожить - лучше на корню перехватывать открытие, не давая открывать хендл твоего процесса вообще.
     
  3. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Спасибо! Мне вот тут подумалось, если я буду перехватывать открытие процесса, мой процесс будет отображаться в диспетчере задач? наверное да...а SeDebugPrivilege мне не поможет?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    mart
    Будет. И именно так обычно и защищают процесс от закрытия.
    Не поможет.

    Наверное, есть способ получше, чтобы определить, принадлежит ли хэндл, передаваемый в TerminateProcess, подзащитному процессу, но могу предложить только такой (если не прехватывать открытие процесса):
    Открываем подзащитный процесс самостоятельно. Полученный хэндл и проверяемый хэндл ищем в ZwQuerySystemInformation->SystemHandleInformation. Сравниваем поля Object для обоих хэндлов. Если они равны, значит мы обнаружили попытку завершения подзащитного процесса.
     
  5. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Об этом способе тож задумывался. Но он показался мне несколько громоздким. В любом случае спасибо за инфу!

    P.S. Перехватил OpenProcess. В случае совпадения pid, переданным в функцию-перехватчик с pid-ом целевого процесса, возвращаю INVALID_HANDLE_VALUE. И нихера, если завершаю процесс в Task Manager-e, он завершается(((
    DLL с перехватом внедряю через реестр.
     
  6. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    тфу блин, напечатал, а сам ушёл гулять .\
    Great
    ++, зачем вводить юзера в замешательство, и заставлять его наблюдать как его кликанье на [Да] игнорируется наглой системой?
    выплёвывай AD на открытии и всё тут!

    или вобще - на перечисление процессов ставь ху(к?) и нечего будет удалять вовсе.
     
  7. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    На Zw/NtQuerySystemInformation хуки ставить не хочется пока что;)) Меня заинтересовало, где я просчитался поставив хук на Openprocess....
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Возвращаясь к перехвату TerminateProcess - если, как заметил Great, причина отказа GetProcessId() в недостатке прав доступа, то для таких случаев отказа можно делать DuplicateHandle(...&NewHandle, PROCESS_QUERY_LIMITED_INFORMATION, ...).
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Sol_Ksacap
    DuplicateHandle не позволяет повышать привилегии существующего хэндла. Только понижать или оставлять.
     
  10. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Вы не поверите, но DuplicateHandle решил мою проблему! Самое интересное, что я сначала вспомнил об этой функции и все написал и только сейчас зашел сюда и увидел, что Sol_Ksacap посоветовал мне её использовать=)
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ну значит облом. :)
     
  12. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Наоборот хорошие новости!!!
     
  13. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    наши прорвали левый фланг?
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тут есчо ктото пользуетсо диспетчером задач ?
     
  15. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    задача, видимо, рассчитана на простых юзеров. это как бы viros.Delphi.D/GEN
     
  16. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Задача чисто учебная.