Возможно ли отключить хук, сделанный с помощью SetWindowsHookEx во время выполнения? - PullRequest
3 голосов
/ 16 июня 2009

Если приложение (моё или, например, во внешнем процессе) с именем SetWindowsHookEx, сможет ли я отцепить крючок? Помните, что это был не я, кто сделал крючок первым, поэтому у меня нет никаких переменных или указателей на оригинальные крючки.

Ответы [ 3 ]

5 голосов
/ 16 июня 2009

Нет, нет.

В те дни (до эры до NT) вам, возможно, удавалось играть в некоторые игры с полученным вами HHOOK, так как возвращаемый HHOOK был ссылкой в ​​цепочке хуков , которую нужно было назвать. Даже тогда я не уверен, что это было возможно.

Сегодня Windows не делегирует вам вызов следующего хука в цепочке (таким образом, устаревший параметр CallNextHookEx ), а HHOOK не позволяют вам добраться до хуков, которых вы не делали зарегистрируйтесь.


Точнее, нет хорошего и поддерживаемого способа сделать это.
Вы можете установить руткит, углубиться во внутренние компоненты Windows и найти цепочку подключений таким образом; но это, очевидно, приведет к нелепым и опасным последствиям.

Перехват (через одно из бесчисленных решений для перехвата API, Обход кажется популярным) SetWindowsHookEx и CallNextHookEx может помочь вам в этом приложения, которые соответствуют до-NT соглашениям. Суть заключается в том, чтобы немедленно отцепить новые хуки после вызовов SetWindowsHookEx, отцепить все переданные хуки (которые не являются вашими) с CallNextHookEx. Чтобы гарантировать «чистое» приложение, вам также необходимо смоделировать ряд событий, чтобы заставить любые уже вызванные хуки вызывать их, чтобы их можно было отцепить. Кроме того, этот режим выйдет из строя, как только вы столкнетесь с любым из приложений, написанных за последние 8+ лет, которые передают NULL в CallNextHookEx.

Так что, хотя технически возможно (возможно) отсоединить HHOOK, которые ваше приложение не зарегистрировало, вам, вероятно, лучше попытаться выполнить то, что вам нужно, за другим, менее ужасным хрупкий путь.

1 голос
/ 16 июня 2009

На самом деле, я обнаружил, что да, это возможно. Перехват CallNextHook даст вам идентификатор перехвата, который вы можете использовать для отсоединения.

1 голос
/ 16 июня 2009

Не думаю, что ты можешь. Вам нужен дескриптор для ловушки, зарегистрированной с помощью SetWindowsHookEx () , чтобы вы могли отцепить ее с помощью UnhookWindowsHookEx ()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...