ріплена одна або більше функцій-фільтрів і відбувається подія, що приводить до спрацьовування хука, ОС Windows викликає першу функцію з черги функцій-фільтрів, і на цьому її відповідальність закінчується. Далі функція відповідальна за те, щоб викликати наступну функцію в ланцюжку, для чого використовується функція Win32 API CallNextHookEx.
ОС підтримує кілька типів хуков, кожен з яких надає доступ до одного з аспектів механізму обробки повідомлень Windows.
Для автора кейлоггера можуть представляти інтерес хукі майже всіх типів: WH_KEYBOARD, WH_KEYBOARD_LL (перехоплення клавіатурних подій при додаванні їх у чергу подій потоку), WH_JOURNALRECORD і WH_JOURNALPLAYBACK (запис і відтворення клавіатурних і мишачих подій) , WH_CBT (перехоплення безлічі подій, включаючи видалення клавіатурних подій із системної черги апаратного введення), WH_GETMESSAGE (перехоплення подій, одержуваних з черги подій потоку).
. 7 Загальна схема обробки
Алгоритм проходження сигналу від натискання користувачем клавіш на клавіатурі до появи символів на екрані можна представити таким чином:
· Операційна система при старті створює в системній процесі csrss.exe потік необробленого введення і системну чергу апаратного введення.
· Потік необробленого введення в циклі посилає запити читання драйверу класу клавіатури, які залишаються в стані очікування до появи подій від клавіатури.
· Коли користувач натискає або відпускає клавішу на клавіатурі, мікроконтролер клавіатури фіксує натискання/відпускання клавіші і посилає в центральний комп'ютер скан-код натиснутоюклавіші і запит на переривання.
· Системний контролер клавіатури отримує скан-код, виробляє перетворення скан-коду, робить його доступним на порту введення-виведення 60h і генерує апаратне переривання центрального процесора.
· Контролер переривань викликає процедуру обробки переривання IRQ 1, - ISR, зареєстровану в системі функціональним драйвером клавіатури i8042prt.
· Процедура ISR зчитує з внутрішньої черги контролера клавіатури з'явилися дані, переводить скан-коди в коди віртуальних клавіш (незалежні значення, визначені системою) і ставить в чергу виклик відкладеної процедури I8042KeyboardIsrDpc.
· Як тільки це стає можливим, система викликає DPC, яка в свою чергу викликає процедуру зворотного виклику KeyboardClassServiceCallback, зареєстровану драйвером класу клавіатури Kbdclass.
· Процедура KeyboardClassServiceCallback витягує з своєї черги чекають завершення запит від потоку необробленого введення і повертає в ньому інформацію про натиснутій клавіші.
· Потік необробленого введення зберігає отриману інформацію в системній черзі апаратного введення і формує на її основі базові клавіатурні повідомлення Windows WM_KEYDOWN, WM_KEYUP, які ставляться в кінець черги віртуального введення VIQ активного потоку.
· Цикл обробки повідомлень потоку видаляє повідомлення з черги і передає його відповідної віконної процедури для обробки. При цьому може бути викликана системна функція TranslateMessage, яка на основі базових клавіатурних повідомлень створює додаткові символьні повідомлення WM_CHAR, WM_SYSCHAR, WM_DEADCHAR і WM_SYSDEADCHAR.
. 8 Модель прямого введення (Raw Input)
Описана вище модель клавіатурного введення має ряд недоліків з погляду розробників додатків. Так, для отримання вводу нестандартного пристрою додаток повинен виконати значне число операцій: відкрити пристрій, періодично його опитувати, піклуватися про можливості паралельного використання пристрою іншим додатком і т.д. Тому в останніх версіях ОС Windows була запропонована альтернативна модель введення, названа моделлю прямого введення, що спрощує розробку додатків, що використовують нестандартні пристрої введення (див. Малюнок 3, додатки DirectInput).
Модель прямого введення відрізняється від оригінальної моделі введення Windows. У звичайній моделі додаток отримує пристрій-незалежний введення у формі повідомлень (таких як WM_CHAR), які надсилаються вікнам додатка. У моделі прямого введення додаток повинен зареєструвати пристрої, від яких воно хоче отримувати ввід. Далі додаток отримує користувальницький введення через повідомлення WM_INPUT. Підтримується два способи передачі даних - стандартний і буферізірованний; для інтерпретації введених даних додатку потрібно отримати інформацію про природу пристрої введення, що можна зробити за допомогою функції GetRawInputDeviceInfo.
ГЛАВА II. ОСНОВНІ ВІДОМОСТІ про різні методи клавіатурний МОНІТОРИНГУ
. 1 Клавіатурні монітор...