Можно ли отключить крючок, созданный с помощью времени выполнения SetWindowsHookEx?

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

c++,windows,hook,

3

Ответов: 3


Нет, нет.

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

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


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

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

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


1

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

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


1

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

C ++, окна, крюк,
Похожие вопросы