Як працює драйвер клавіатури
Погодься, для того що б написати
грамотний keylogger потрібно знати, яким чином
натискання клавіші на клавіатурі
реєструється в системі. Дивись схему:
handle_scancode -> put_queue -> tty_queue -> receive_buf ->
буфер tty_ldisc -> tty_read -> / dev / ttyX -> sys_read ->
процес користувача
Спочатку, коли ви натискаєте кнопку на
клавіатурі, пристрій посилає
відповідний скан код клавіші
клавіатурного драйверу. одиничне натискання
може призвести послідовність до
шести кодів. Функція handle_scancode () в
клавіатурному драйвер обробляє потік
кодів і конвертує їх (за допомогою функції
перекладу kbd_translate ()) в серію подій типу "клавіша
натиснута "," клавіша відпущена ".
Кожен баттон має свій унікальний код від 1
до 127. За допомогою клавіші генерує цей код, а
відпускання - цей код + 128 (наприклад коли ви
натискаєте 'a' то на гора видається код 30, а
коли відпускаєте - 158).
Далі код клавіші відповідно до
картою клавіш конвертуються назад в сам
символ (взагалі кажучи при цьому враховуються
натиснуті функціональні клавіші - Shift. AltGr,
Control, Alt, ShiftL, ShiftR, CtrlL і CtrlR, комбінації
активних "модифікаторів" - CapsLock
наприклад) і передається по ланцюжку буферів і
черг до терміналу.
Драйвер клавіатури може працювати в
чотирьох режимах:
- scancode (RAW MODE): пріложеніце отримує
сканкод з потоку і далі обробляє
його власним драйвером (приклад тому - Х11).
клавіші, перекладений з скан коду
драйвером відповідно до власної
таблицею.
ASCII-код символу або деяку
послідовність ASCII-кодів символів в
Відповідно до таблиці розкладки
клавіатури, яка зберігається в пам'яті / диску
вигляді окремого файлу (можна поміняти
розкладку клавіатури командою kbdconfig, вона
прописує нове значення в файл / etc / sysconfig / keyboard
і завантажує зазначену таблицю в
оперативну пам'ять).
попереднього іншим форматом виведення
символів - UTF8, а не ASCII.
Ці режими в кінці кінців і визначають,
що додаток отримає в результаті
натискання клавіші. (До речі кажучи: режим
роботи драйвера клавіатури можна дізнатися
або змінити за допомогою kbd_mode (). але
пам'ятай! Зміна режиму може взагалі залишити
тебе без клавіатури!)
Kernel based keylogger
Загалом кажучи, ми можемо перехопити потік
кодів двома способами: написати обробник
переривання клавіатури або втрутитися в
передачу на одному з описаних вище етапів.
Дивись як реалізується перший варіант. В
архітектурі Intel для контролера клавіатури
виділене перше переривання. коли воно
виникає наш обробник повинен прочитати
сканкод і статус клавіатури. події
клавіатури можна отримати на 0х60 порту (Keyboard
data register), а її стан - на 0х64 (Keyboard status
register).
/ * Below code is intel specific * /
#define KEYBOARD_IRQ 1
#define KBD_STATUS_REG 0x64
#define KBD_CNTL_REG 0x64
#define KBD_DATA_REG 0x60
#define kbd_read_input () inb (KBD_DATA_REG)
#define kbd_read_status () inb (KBD_STATUS_REG)
#define kbd_write_output (val) outb (val, KBD_DATA_REG)
#define kbd_write_command (val) outb (val, KBD_CNTL_REG)
/ * Register our own IRQ handler * /
request_irq (KEYBOARD_IRQ, my_keyboard_irq_handler, 0, "my keyboard",
NULL);
scancode = kbd_read_input ();
key_status = kbd_read_status ();
log_scancode (scancode);
Цей оброблювач канает тільки для
архітектури Intel, так що в разі перенесення
на іншу платформу він працювати
природно не буде. Хоча, чесно кажучи,
де ти у нас бачив інші платформи ...
Це початкова функція драйвера
клавіатури (keyboard.c), вона обробляє скан
коди, одержувані від клавіатури:
# /usr/src/linux/drives/char/keyboard.c
void handle_scancode (unsigned char scancode, int down);
Ми можемо замінити справжній handle_scancode ()
власної процедурою, яка крім
усього іншого буде записувати коди клавіш.
Покажи цю статтю друзям: