Уроки Iczelion'а



         

Урок 24. Windows-хуки - часть 3


Теперь, когда мы немного подучили теорию, мы можем перейти к тому, как, собственно, устанавливать/снимать хуки.

Чтобы установить хук, вам нужно вызвать функцию SetWindowsHookEx, имеющую следующий синтаксис:

SetWindowsHookEx proto HookType:DWORD, pHookproc:DWORD, hInstance:DWORD, ThreadID:DWORD

  • HookTyрe - это одно из значений, перечисленных выше (WH_MOUSE, WH_KEYBOARD и т.п.).
  • рHookрroc - это адрес хук-процедуры, которая будет вызвана для обработки сообщений от хука. Если хук является удаленным, он должен находиться в DLL. Если нет, то он должен быть внутри процесса.
  • hInstance - это хэндл DLL, в которой находится хук-процедура. Если хук локальный, тогда это значения должно быть pавно NULL.
  • ThreadID - это ID треда, на который вы хотите поставить хук. Этот параметр определяет является ли хук локальным или удаленным. Если этот параметр равен NULL, Windows будет считать хук системным и удаленным, который затрагивает все треды в системе. Если вы укажете ID одного из тредов вашего собственного процесса, хук будет локальным. Если вы укажете ID треда из другого процесса, то хук будет тредоспециализированным и удаленным. Из этого правила есть два исключения: WH_JOURNALRECORD и WH_JOURNALpLAYBACK - это всегда локальные системные хуки, которым не нужно быть в DLL. Также WH_SYSMSGFILTER - это всегда системный удаленный хук. Фактически он идентичен хуку WH_MSGFILTER при ThreadID pавным 0.
  • Если вызов успешен, он возвращает хэндл хука в eax. Если нет, возвращается NULL. Вы должны сохранить хэндл хука, чтобы снять его в дальнейшем.

    Вы можете деинсталлировать хук, вызвав UnhookWindowsHookEx, которая принимает только один параметр - хэндл хука, который нужно деинсталлировать. Если вызов успешен, он возвращает ненулевое значение в eax. Иначе он возвратит NULL.

    Хук-процедура будет вызываться каждый раз, когда будет происходить событие, ассоциированное с инсталлированным хуком. Hапример, если вы инсталлируете хук WH_MOUSE, когда происходит событие, связанное с мышью, ваша хук-процедура будет вызвана. Вне зависимости от типа установленного хука, хук-процедура всегда будет иметь один и тот же прототип:




    Содержание  Назад  Вперед