This is an old revision of the document!
Arhiva de suport pentru exerciții se găsește aici. Descărcați arhiva și apoi decomprimați-o folosind comanda
unzip cap-07-tasks.zip
Una din liniile de întrerupere cu care lucrăm cel mai ușor este linia de întrerupere 1
corespunzătoare întreruperii, de obicei conectată la controller-ul de întrerupere i8042
. Vom urmări un driver care va afișa un mesaj ori de câte ori este activată acea linie de întrerupere: adică la fiecare apasare (pres) respectiv ridicare (release) de tastă.
În directorul keyboard-hook/
din arhiva de suport a capitolului se găsește implementarea unui astfel de driver. Driver-ul se înregistrează la linia de întrerupere a tastaturii și afișează un mesaj pentru fiecare tastă apăsată.
Testați acest driver prin compilarea acestuia și apoi copierea modulului de kernel în mașina virtuală QEMU și apoi încărcarea sa în kernel.
Actualizați driverul de la punctul anterior pentru a afișa în mesaj tasta care a fost apăsată, în măsura în care este afișabilă (ASCII). Va trebui să folosiți cele două porturi de tastatură (0x60
și 0x64
) și să folosiți funcția inb()
pentru a citi informațiile. În portul/registrul de stare puteți vedea dacă este vorba de o tastă apăsată iar în registrul de date aveți codificare tastei.
Implementați o funcționalitate de tipul keylogger a driverului și rețineți într-un buffer din kernel tastele apăsate. Datele (tastele apăsate) se scriu în continuare în buffer; când bufferul este plin, nu se mai scrie nimic.
Prin intermediul unei intrări în /proc
(/proc/keylogger
) datele din buffer pot fi citite. În momentul citirii din /proc/keylogger
buffer-ul este resetat și se scrie de la începutul bufferului la noi taste apăsate.