Список установленных хуков окон - PullRequest
8 голосов
/ 19 декабря 2011

Как получить список глобальных хуков, установленных в Windows (с помощью API SetWindowsHookEx)?

Ответы [ 2 ]

6 голосов
/ 28 марта 2013

См.


Поиск хуков По сравнению с другими операциями перечисление установленных крючки довольно легко.

Хуки, специфичные для каждого потока, записываются в данных win32k для каждого потока. структура помечена, довольно образно, как THREADINFO 1 . Это по сути, ETHREAD / TEB, как структура, но с учетом специально для пользователя и информации gdi. Один из его членов (aphkStart) представляет собой массив из 16 элементов указателей, по отдельности они либо укажите NULL, либо заголовок связного списка структур HOOK. Перечисление крючков - это просто мера цепи.

Для удобства и, вероятно, чтобы итерация не требовалась для просмотра если установлены какие-либо хуки, THREADINFO содержит другого члена, fsHooks, что битовое поле. Если бит включен, соответствующий индекс в массив крюков действителен. Вместо 33 сравнений (16 для NULL и 17 для for-loop), для указания наличия крючков требуется только один, отличный!

Глобальные хуки, которые на рабочий стол 2 , также хранятся в структура каждого объекта, также образно названная (DESKTOPINFO), и также хранится в массиве с сопутствующим битовым полем. Преодоление два это pDeskInfo, член THREADINFO, который указывает на его владение DESKTOPINFO.

Несмотря на интрижку во вступлении, работа со всеми этими недокументированные структуры на самом деле не слишком сложны на практике. Символы Windows 7 для win32k.sys включают их расположение, что приятно. Символы для эпохи Vista / Server 2008, хотя, это не то, где изучение собрания приходит и спасает день.

Знать, как эти структуры выглядят, это одно, понять их это еще один ...

Получив наши грязные перчатки, мы находим запись структур HOOK Большинство соответствующей информации сами:

struct tagHOOK
{
    THRDESKHEAD head; // info about the creator
    struct tagHOOK* phkNext; // next entry in linked list
    int iHook; // WH_ hook type
    UINT_PTR offPfn; // RVA to hook function in ihmod library
    UINT flags; // HF_ flags (GLOBAL, ANSI)
    int ihmod;
    THREADINFO* ptiHooked; // the hooked thread
    PVOID rpDesk; // saved desktop pointer
    ULONG nTimeout :7;
    ULONG fLastHookHung :1;
};

Вы можете скачать программное обеспечение здесь


Ниже приведен обзор обнаружения установленных глобальных хуков:

  1. Вызовите PsGetCurrentThread и получите структуру ETHREAD текущего потока. ETHREAD - непрозрачная структура данных в соответствии с Документация MSDN.
  2. Извлеките структуру THREADINFO, вызвав PsGetThreadWin32Thread. Оба они не имеют документов.
  3. Извлеките DESKTOPINFO.
  4. Там вы можете найти все глобально установленные крючки. Они организованы в массиве. Каждый элемент представляет собой связанный список и соответствует определенный крюк (WH _ *).

Ниже приведен обзор обнаружения установленных локальных хуков:

  1. Учитывая идентификатор потока.
  2. Вызовите PsLookupThreadByThreadId и получите структуру ETHREAD указанного потока.
  3. Извлеките структуру THREADINFO, вызвав PsGetThreadWin32Thread.
  4. Там вы можете найти все локально установленные хуки для указанного потока. Они организованы в массиве. Каждый элемент является связанный список и соответствует определенному хуку (WH _ *).

Вы можете увидеть источник здесь


Плагин для Process Hacker 2 (http://processhacker.sourceforge.net), отображает системные хуки и возможность отсоединения (меню правой кнопки мыши).

Получите исходный код Process Hacker и скомпилируйте его, затем добавьте HookTools.vcxproj для Plugins.sln. VS 2013 был использован. Настройте свою библиотеку путь в каталогах VC ++.


или связанный с ним вопрос с ответом здесь

Но я до сих пор не нашел надежного способа сделать это.

3 голосов
/ 19 декабря 2011

Один злой способ - перехватить все функции перехвата, прежде чем что-либо еще получит шанс.

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