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).
cheie, tradus din codul de scanare
conducătorul auto în funcție de dvs.
tabel.
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ă).
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.: