Предыстория такова: Написал dll-ку, которая перехватывает TerminateProcess, загрузил её в task manager. Перехват работает отлично, управление попадает на мою функцию-перехватчик. Моя цель состоит в следующем: если пытаются завершить какой-то конкретный процесс, то нужно этому воспрепятствовать. Проблема: в функцию перехватчик передается хэндл процесса, который хочет завершить Task Manager. Так вот по этому хэндлу NTQueryInformationProcess возвращает код С0000022(access denied), GetProcessId возвращает 0, GetModuleFileName(не знаю уместна ли она в этом случае) тож ничего путевого не возвращает. В оконцовке я не могу определить, какой именно процесс завершается, нужный мне или нет. Вообще никакой доп.инфы по этому хэндлу отыскать не получается. Есть какие-нибудь варианты решения данной проблемы? Я подумываю в сторону дополнительного перехвата OpenProcess, но хотелось бы сделать все красиво, в единственной функции перехватчике. Заранее благодарю.
Вероятно хендл открывается с правами только на terminate (PROCESS_TERMINATE или както так доступ). А чтобы не давать себя уничтожить - лучше на корню перехватывать открытие, не давая открывать хендл твоего процесса вообще.
Спасибо! Мне вот тут подумалось, если я буду перехватывать открытие процесса, мой процесс будет отображаться в диспетчере задач? наверное да...а SeDebugPrivilege мне не поможет?
mart Будет. И именно так обычно и защищают процесс от закрытия. Не поможет. Наверное, есть способ получше, чтобы определить, принадлежит ли хэндл, передаваемый в TerminateProcess, подзащитному процессу, но могу предложить только такой (если не прехватывать открытие процесса): Открываем подзащитный процесс самостоятельно. Полученный хэндл и проверяемый хэндл ищем в ZwQuerySystemInformation->SystemHandleInformation. Сравниваем поля Object для обоих хэндлов. Если они равны, значит мы обнаружили попытку завершения подзащитного процесса.
Об этом способе тож задумывался. Но он показался мне несколько громоздким. В любом случае спасибо за инфу! P.S. Перехватил OpenProcess. В случае совпадения pid, переданным в функцию-перехватчик с pid-ом целевого процесса, возвращаю INVALID_HANDLE_VALUE. И нихера, если завершаю процесс в Task Manager-e, он завершается((( DLL с перехватом внедряю через реестр.
тфу блин, напечатал, а сам ушёл гулять .\ Great ++, зачем вводить юзера в замешательство, и заставлять его наблюдать как его кликанье на [Да] игнорируется наглой системой? выплёвывай AD на открытии и всё тут! или вобще - на перечисление процессов ставь ху(к?) и нечего будет удалять вовсе.
На Zw/NtQuerySystemInformation хуки ставить не хочется пока что) Меня заинтересовало, где я просчитался поставив хук на Openprocess....
Возвращаясь к перехвату TerminateProcess - если, как заметил Great, причина отказа GetProcessId() в недостатке прав доступа, то для таких случаев отказа можно делать DuplicateHandle(...&NewHandle, PROCESS_QUERY_LIMITED_INFORMATION, ...).
Sol_Ksacap DuplicateHandle не позволяет повышать привилегии существующего хэндла. Только понижать или оставлять.
Вы не поверите, но DuplicateHandle решил мою проблему! Самое интересное, что я сначала вспомнил об этой функции и все написал и только сейчас зашел сюда и увидел, что Sol_Ksacap посоветовал мне её использовать=)