Windows Hooks. Part 1Автор:
Bill Prisoner / TPOC
Что же это такое Windows hooks и зачем
это надо нам? Hook переводиться как крюк. С помощью крючка мы цепляемся за
что-то. В наших программах мы будет цепляться за события передаваемые какому
либо окну. Т.е. с помощью хуков мы можем перехватить практически любые сообщения
направляемые своему собственному окну, либо другого окна любого процесса.
В Windows бывает два вида хуков:
1) локальные – хуки в пределах вашего процесса
2) глобальые – хуки способные перехватывать события в других процессах
Глобальные хуки бывают потоковые и системные. Потоковые перехватывают события от
какого-либо потока в другом процессе. Глобальные системные хуки перехватывают
события для всех потоков каких-либо процессов. Очевидно, что если мы пишем
keylogger, то надо использовать глобальные системные хуки.
Хуки различаются по типам. Тип хука – это тип сообщения который он ловит. В
Windows существет 14 типов хуков:
WH_CALLWNDPROC - хук вызывается пpи вызове SendMessage.
WH_CALLWNDPROCRET - хук вызывается, когда возвpащается SendMessage.
WH_GETMESSAGE - хук вызывается, когда вызывается GetMessage или PeekMessage.
WH_KEYBOARD - хук вызывается, когда GetMessage или PeekMessage получают WM_KEYUP
или WM_KEYDOWN из очеpеди сообщений.
WH_MOUSE - хук вызывается, когда GetMessage или PeekMessage получают сообщение
от мыши из очеpеди сообщений.
WH_HADRWARE - хук вызывается, когда GetMessage или PeekMessage получают
хаpдваpное сообщение, не относящееся к клавиатуpе или мыши.
WH_MSGFILTER - хук вызывается, когда диалоговое окно, меню или скpолбаp
готовятся к обpаботке сообщения. Этот хук - локальный. Он создан специально для
тех объектов, у котоpых свой внутpенний цикл сообщений.
WH_SYSMSGFILTER - то же самое WH_MSGFILTER, но системный.
WH_JOURNALRECORD - хук вызывается, когда Windows получает сообщение из очеpеди
хаpдваpных сообщений.
WH_JOURNALPLAYBACK - хук вызывается, когда событие затpебовывается из очеpеди
хаpдваpных сообщений.
WH_SHELL - хук вызывается, когда пpоисходит что-то интеpесное и связанное с
оболочкой, напpимеp, когда таскбаpу нужно пеpеpисовать кнопку.
WH_CBN - хук используется специально для CBT.
WH_FOREGROUND - такие хуки используются Windows. Обычным пpиложениям от них
пользы немного.
WH_DEBUG - хук используется для отладки хук-пpоцедуpы.
В зависимости от типов хуков мы можем изменть сами сообщения посылаемые окну
либо просто их мониторить. Допустим мы создали глобальные системый хук типа
WH_MOUSE. Если юзер двинул мышкой или щелкнул на ней, то вызывается специальная
функция перехвата которую мы программируем. При создании хука мы указываем одним
из параметров указатель на функцию перехвата. Функция перехвата вызывается ДО
того как сообщение отправиться адресованному окну.
Для использования глобальных хуков наша функция перехвата должна находиться в
DLL, чтобы каждый процесс смог вызвать её. Если у нас стоит глобальные хук и
какому-либо приложению посылается сообщение перехватываемое нами, то выполняется
код функции-фильтра. Но этот код должен быть в адресном пространстве текущего
процесса. Для этого функцию-фильт и помещают в отдельную DLL. Если создается
хук, то DLL проецируется(mapped)в адресное пространство текущего процесса, но
проецируется для всех только сегмент кода, а сегмент данных для каждой DLL свой,
т.е. не проецируется. Нам нужно чтобы DLL была идентична в каждом процессе. Для
этого мы создаём секцию неинициализированных данных как общую. Это одна из опций
линкера. В MASm’е это делается так: |
link /section:.bss,S
/DLL |
где, “,S” после имени секции
неинициализированных данных означает, что секция разделяемая(shared).
Если хук локальный, то функцию перехвата достаточно описать в своей программе.
Хакеры не забывайте и о том, что хуки очень замедляют
систему, поэтому надо стараться использовать как можно аккуратнее.
Если углубиться во внутреннее устройство Windows, то мы увидим что каждого хука
существует своя цепочка(chain). Это цепочка указателей на hook процедуры aka
функции-фильтры aka функции перехвата. При перехвате сообщения управление
передается последней установленной процедуре. Она может передать управление
следующему элементу в цепочке, а может и не передавать.
На Win32 хуки поддерживаются несколькими процедурами. Далее я опишу эти
процедуры и их параметры. |
LRESULT CALLBACK HookProc(int nCode,
WPARAM wParam, LPARAM lParam) |
Это прототип хук процедуры. В зависимости от типа хука Windows заполняет
параметры процедуры. Эту процедуру вы должны определить в DLL. Имя процедуры
может быть произвольным, но сигнатура, т.е. количество и типы параметров и тип
возвращаемого значения, фиксирована.
nCode - код хука, что определить хуку что
делать при этом вызове.
WPARAM wParam и LPARAM lParam значения зависящие от конкретного типа хука. |
HHOOK SetWindowsHookEx(
int idHook, // тип хука(указаны выше)
HOOKPROC lpfn, //указатель на hook процедуру
HINSTANCE hMod, // описатель модуля приложения
DWORD dwThreadId // идентификатор потока для потоковых функций
); |
Эта API функция используется для
создания хука.
BOOL UnhookWindowsHookEx(
HHOOK hhk // описатель созданного хука
); |
Эта API функция используется для
уничтожения хука.
LRESULT CallNextHookEx(
HHOOK hhk, //описатель текущего хука
int nCode, //хук код для следующей хук процедуры
WPARAM wParam, //значение для следующей хук процедуры
LPARAM lParam // значение для следующей хук процедуры
); |
Эта API функция используется в хук
процедурах для передачи управления слудующей хук процедуре в цепочке. Для
каждого типа хуков значения wParam и lParam различаются. Чтобы узнать что именно
содержится в этих параметрах посмотрите справку по Win32.
Заключение
В данной статье была рассмотрена теория
хуков. Но теория без практики это как тело без души. В следующей статье я опишу
как использовать хуки. Мы напишем вместе простой кейлогер на ассемблере. До
встречи в киберпростроанстве…
[C] Bill Prisoner / TPOC | Новые события из жизни нашей лаборатории Статьи и переводы лаборатории TPOC Программы лаборатории TPOC Здесь мы сообщаем Вам, какие творения скоро появятся Ссылки на сайты, где можно найти больше информации История нашей лаборатории и ее члены |