Linux kernel keylogger своїми руками №1

Як працює драйвер клавіатури

Погодься, для того що б написати
грамотний 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).
  • keycode (MEDIUMRAW MODE): програма отримує код
    клавіші, перекладений з скан коду
    драйвером відповідно до власної
    таблицею.

  • ASCII (XLATE MODE): код клавіші перетворюється в
    ASCII-код символу або деяку
    послідовність ASCII-кодів символів в
    Відповідно до таблиці розкладки
    клавіатури, яка зберігається в пам'яті / диску
    вигляді окремого файлу (можна поміняти
    розкладку клавіатури командою kbdconfig, вона
    прописує нове значення в файл / etc / sysconfig / keyboard
    і завантажує зазначену таблицю в
    оперативну пам'ять).

  • Unicode (UNICODE MODE): цей режим відрізняється від
    попереднього іншим форматом виведення
    символів - 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 ()
    власної процедурою, яка крім
    усього іншого буде записувати коди клавіш.

    Покажи цю статтю друзям:







    Схожі статті