Перехват TerminateProcess и получение информации от Handle It - PullRequest
0 голосов
/ 07 ноября 2010

Если вы хотите остановить прерывание процесса, одним из способов является подключение к TerminateProcess (или NtTerminateProcess).Если процесс завершается сам (например, потому что вы закрыли его окно), дескриптор, предоставленный этим функциям, имеет значение NULL, поэтому вы можете узнать, какой исполняемый файл завершается, используя GetCurrentProcess () & GetModuleFileNameEx ().Поскольку GetCurrentProcess () возвращает псевдо-дескриптор, вы можете получить к нему доступ без проблем.

Однако если один процесс завершает другой, предоставленный дескриптор не равен NULL.Он представляет процесс, который завершается.Проблема в том, что вы не можете получить информацию об этом процессе.Вы можете просто вернуть код с надписью «отказано в доступе» вместо вызова оригинальной [Nt] TerminateProcess (), но это одеяло останавливает все процессы от завершения других - что является плохой идеей.

Дескриптор должен представлять что-то действительное, иначе TerminateProcess не сможет с ним ничего полезного - но я даже не могу вызвать для него GetProcessId (), я получаю ERROR_INVALID_HANDLE (или ERROR_ACCESS_DENIED).Я пробовал различные методы, полученные из справки и из Интернета, включая получение привилегии отладки (успех) и DuplicateHandle () (та же ошибка) и ZwQueryInformationProcess () для получения идентификатора (STATUS_ACCESS_DENIED).Я даже не могу перечислить процессы, потому что они возвращают идентификаторы, и я не могу получить идентификатор, и OpenProcess () всегда возвращает новый дескриптор, поэтому я не могу сравнить дескрипторы.

Я могу только предположить, что дескриптор имеет право PROCESS_TERMINATE и больше ничего.Я знаю, что Vista и выше имеют защищенные процессы благодаря управлению цифровыми правами, но я использую ProcessExplorer в качестве подопытного кролика, так что это определенно не мультимедийное приложение!

Кто-нибудь знает, как еще я мог бы получить какую-либо информацию о прекращении процесса из этого дескриптора?

1 Ответ

1 голос
/ 07 ноября 2010

Это просто обычный дескриптор процесса. Вопрос в том, в каком процессе выполняется ваша функция ловушки? Если это вызывающий процесс, дескриптор может использоваться как есть для GetProcessId или NtQueryInformationProcess. Если нет, вам нужно вызвать DuplicateHandle для дублирования дескриптора в вашем процессе.

Если вы получаете ошибки об отказе в доступе, это может быть связано с тем, что дескриптор процесса имеет только доступ PROCESS_TERMINATE. В этом случае используйте DuplicateHandle, чтобы «заново открыть» процесс с доступом PROCESS_QUERY_ (LIMITED_) INFORMATION.

...