Keylogger de kernel cu propriile mâini # 1

Cum funcționează driverul tastaturii

Sunt de acord, pentru a scrie
gratis de keylogger trebuie să știe cum
Apăsați tasta de pe tastatură
este înregistrată în sistem. Vezi diagrama:







handle_scancode -> put_queue -> tty_queue -> receive_buf ->
buffer tty_ldisc -> tty_read -> / dev / ttyX -> sys_read ->
procesul utilizatorului

În primul rând, când apăsați tasta
tastatura, dispozitivul trimite
codul corespunzător pentru scanarea cheii
driver de tastatură. singură apăsare
poate produce o secvență de până la
șase coduri. Funcția handle_scancode () în
driverul tastaturii procesează fluxul
coduri și le transformă (folosind funcția
traducând kbd_translate ()) într-o serie de evenimente de tip "cheie"
apăsat "," eliberat ".
Fiecare buton are propriul cod unic de la 1
până la 127. Apăsând tasta se generează acest cod și
eliberare - acest cod este + 128 (de exemplu, atunci când
apăsați pe "a" iar apoi pe munte se dă codul 30 și
când eliberați - 158).

Mai mult, codul cheie conform
cardul cheie este transformat înapoi în sine
simbol (în general, acest lucru este luat în considerare
Se apasă tastele Shift. AltGr,
Control, Alt, ShiftL, ShiftR, CtrlL și CtrlR, combinații
"Modificatori" activi - CapsLock
de exemplu) și este trecut de-a lungul unui lanț de tampoane și
cozi către terminal.

Driverul de tastatură poate funcționa
patru moduri:

  • scancode (RAW MODE): aplicația devine
    scancode din flux și alte procese
    driverul propriu (de exemplu, X11).
  • codul de taste (MEDIUMRAW MODE): programul primește codul
    cheie, tradus din codul de scanare
    conducătorul auto în funcție de dvs.
    tabel.

  • ASCII (XLATE MODE): codul cheie este convertit în
    Cod ASCII sau alții
    secvență de coduri de caractere ASCII în
    conform tabelului de aspect
    tastatură, care este stocată în memorie / disc
    ca fișier separat (puteți schimba
    tastatură cu comanda kbdconfig, aceasta
    atribuie o nouă valoare fișierului / etc / sysconfig / keyboard
    și încarcă tabelul specificat în
    memorie operativă).

  • Unicode (UNICODE MODE): acest mod diferă de
    alt format anterior de ieșire
    caractere - UTF8, nu ASCII.






  • Aceste regimuri determină în cele din urmă,
    ceea ce cererea va obține ca rezultat
    apăsare de tastă. (De altfel, regimul
    funcționează driverul tastaturii
    sau modificați-l cu kbd_mode (). dar
    Amintiți-vă! Modificarea regimului poate, în general, să părăsească
    fără tastatură!)

    Kenogger bazat pe kernel

    În general, putem intercepta fluxul
    coduri în două moduri: scrie un handler
    întrerupeți tastatura sau interferați
    transmisie într-unul din etapele descrise mai sus.

    Uită-te cum este implementată prima opțiune. În
    Intel arhitectura pentru controler de tastatură
    prima întrerupere este evidențiată. Când este
    manipulatorul nostru ar trebui să citească
    codul de scanare și starea tastaturii. evenimente
    tastatura poate fi obținută pe portul 0x60 (tastatură
    registru de date), iar starea sa este de 0x64 (starea tastaturii
    înregistrați).

    / * codul de mai jos este specific informațiilor * /
    #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)
    / * înregistrarea propriului nostru operator de IRQ * /
    request_irq (KEYBOARD_IRQ, my_keyboard_irq_handler, 0, "tastatura mea",
    NULL);

    scancode = kbd_read_input ();
    cheie_status = kbd_read_status ();
    log_scancode (scancode);

    Acest handler numai pentru
    arhitectură, deci în cazul migrației
    pe o altă platformă pe care o face
    în mod firesc nu o va face. Deși, sincer vorbind,
    unde ați văzut alte platforme ...

    Aceasta este funcția inițială a driverului
    (keyboard.c), procesează scanarea
    codurile primite de la tastatură:

    # /usr/src/linux/drives/char/keyboard.c
    void handle_scancode (codul de scanare char nesemnat, int jos);

    Putem înlocui actualul handle_scancode ()
    procedura proprie, care, în plus față de
    totul va înregistra codurile cheie.

    Distribuiți acest articol cu ​​prietenii dvs.:







    Articole similare

    Trimiteți-le prietenilor: