x86-Plattformen ist nur ein einziger Treiber der Tastatur(i8042) <strong>und</strong> der Maus umgesetzt.Im Betriebssystem Windows 2000 <strong>und</strong> niedriger istKbd class der Tastaturklassentreiber, dessen wichtigsteAufgaben im Folgenden aufgelistet sind:► Durchführung allgemeiner <strong>und</strong> Hardware-unabhängigerOperationen der Geräteklasse► Unterstützung von Plug and Play, Unterstützung derEinspeisungssteuerung <strong>und</strong> von Windows ManagementInstrumentation (WMI)► Unterstützung von Operationen für Legacy-Geräte► gleichzeitige Durchführung von Operationen aufmehr als einem Gerät► Realisierung der Class Service Callback Routine,die vom Funktionstreiber zur Übermittlung der Datenaus dem Eingangspuffer des Gerätes in den Datenpufferdes Geräteklassentreibers ausgelöst wirdTreiber-Stacks für die Systemeingabegeräte Tastatur <strong>und</strong> MausTreiber-Stack für Plug & Play von PS/2-TastaturenIm Betriebssystem Windows 2000 <strong>und</strong> niedriger isti8042prt der Funktionstreiber für Eingabegeräte, dieden PS/2-Port benutzen (Tastatur <strong>und</strong> Maus). Seinewichtigsten <strong>Funktionen</strong> sind:► Durchführung von Hardware-abhängigen, gleichzeitigenOperationen von PS/2-Eingabegeräten ( Tastatur<strong>und</strong> Maus nutzen gemeinsame Ein- <strong>und</strong> Ausgabeports,verwenden aber verschiedene Interrupts, Interrupt-Behandlungsroutinen(ISR) <strong>und</strong> verschiedeneRoutinen zur Vollendung der Interruptbehandlung)► Unterstützung von Plug and Play, Unterstützung derEinspeisungssteuerung <strong>und</strong> von Windows ManagementInstrumentation (WMI)► Unterstützung von Operationen für Legacy-Geräte► Auslösen der „Class Service Callback“-Routine fürdie Tastatur- <strong>und</strong> Mausklassen zur Übermittlung vonDaten aus dem Eingangsdatenpuffer i8042prt in denDatenpuffer des Klassentreibers<strong>Keylogger</strong>► Auslösen verschiedener Rückruf-<strong>Funktionen</strong>, dievon den Treiberfiltern der oberen Ebene zur flexiblenSteuerung der Geräte realisiert werden können.Treiber-Stack für PS/2-TastaturenDer Treiber-Stack enthält die folgenden Elemente (vonoben nach unten): Kbdclass – einen Filter-Tastaturklassentreiber deroberen Ebene einen optionalen Filter-Tastaturklassentreiber deroberen Ebene i8042 – einen Funktionstreiber der Tastatur einen Kerneltreiber des BussesListe der vom Treiber i8042prt verwendetenHardware-RessourcenObige Abbildung zeigt eine Liste der Hardware-Ressourcen,die vom Treiber i8042prt verwendet werden,die unter anderem mit dem Tool Device Tree der FirmaOpen Systems Resources. Wer die vorangegangenenAbschnitte gelesen hat, den werden die Werte der Eingabe-/Ausgabe-Ports(IO) 60h <strong>und</strong> 64h <strong>und</strong> des Hardware-Interrupts(IRQ) 1 nicht überraschen.Der im dargestellten Treiber-Stack neue Treiberfilterkann beispielsweise zur spezifischen Bearbeitung derTastatureingabe oberhalb der Tastaturklassentreiberergänzt werden. Dieser Treiber muss dieselbe Bearbei-10
tung aller Typen von Ein- <strong>und</strong> Ausgabe-Aufträgen (IRP)<strong>und</strong> von IOCTL-Befehlen unterstützen wie ein Tastaturklassentreiber.Im vorliegenden Fall werden die Datenvor der Übermittlung in das Subsystem des User-Modezur Bearbeitung an den Treiberfilter geleitet.Geräte-Stack für Plug & Play von PS/2-TastaturenIm Folgenden werden die Stacks der Geräte, die dieoben beschriebenen Treiber im Treiber-Stack der Tastaturerzeugen, genauer betrachtet. Auf der folgendenAbbildung sind links die in der MSDN Library für PS/2-Tastaturen aufgeführten Geräte-Stacks dargestellt.Rechts sieht man einen Screenshot des ProgrammsDevice Tree, das die reale Situation auf einem gewöhnlichenComputer zeigt.Bearbeitung der Tastatureingaben durch die AnwendungenRaw Input Thread (Datenempfang vom Treiber)Der vorhergehende Abschnitt beschäftigte sich mitBeispielen zum Aufbau von Tastatur-Stacks im Kernel-Mode des Betriebssystems. Nun soll der Daten-Transfervom Tastendruck zu den Anwendungen des User-Modegenauer betrachtet werden. Das Microsoft-SubsystemWin32 erhält mit Hilfe des Raw Input Threads (RIT) Zugriffauf die Tastatur. Der RIT ist Teil des Systemprozessescsrss.exe (User-Mode des Win32-Subsystems).Beim Start erzeugt das Betriebssystem den RIT <strong>und</strong>die System-Hardware-Eingabe-Queue (System HardwareInput Queue, SHIQ).Der RIT öffnet das Objekt Gerät im Tastaturklassentreiberzur exklusiven Nutzung <strong>und</strong> sendet diesem mitHilfe der Funktion ZwReadFile eine Eingabe-Ausgabe-Anforderung (IRP = Input/Output Request Packets) wiezum Beispiel IRP_MJ_READ. Der Treiber Kbdclass registriertdie Anfrage als unerledigt (pending), reiht siein die Warteschleife ein <strong>und</strong> sendet den RückkehrcodeSTATUS_PENDING zurück. Der RIT muss nun auf dieErledigung der IRP warten, was durch einen asynchronenProzeduraufruf umgesetzt wird (AsynchronousProcedure Call, APC).Konfiguration der Geräteobjekte für Plug and Play von PS/2-TastaturenDer Geräte-Stack (richtiger wäre es, vom Stack der Geräteobjektezu sprechen) besteht insgesamt aus denfolgenden Komponenten: dem Physical Device Object der Tastatur (PDO), dasvon dem Bustreiber erzeugt wird (in diesem Fall BusPCI) – \Device\00000066 dem Functional Device Object der Tastatur (FDO),das von dem Treiber i8042prt erzeugt <strong>und</strong> dem PDOhinzugefügt wird – unbenanntes Objekt (unnamed) optionalen Filter-Objekten der Tastatur, die durchvon Programmierern entwickelte Filtertreiber derTastatur erzeugt werden einem Filter-Objekt der Geräteklasse Tastatur deroberen Ebene, das vom Klassentreiber Kbdclass erzeugtwird – \Device\KeyboardClass0Drückt oder löst der Anwender eine Taste, so erzeugtder System-Tastaturkontroller einen Hardware-Interrupt.Sein Editor löst die vom Driver i8042prt im Systemregistrierte spezielle Interrupt-BehandlungsroutineIRQ 1 aus (Interrupt Service Routine, ISR). DieseRoutine liest die erscheinenden Daten aus der internenQueue des Tastaturkontrollers. Die Verarbeitung desHardware-Interrupts muss so schnell wie möglich erfolgen,daher speichert die ISR den Deferred ProcedureCall (DPC) I8042KeyboardIsrDpc in einer Queue<strong>und</strong> beendet ihre Arbeit. Sobald es möglich ist (IRQLsinkt auf DISPATCH_LEVEL ab), wird ein DPC vomSystem ausgelöst. In diesem Moment wird die Rückruf-Routine KeyboardClassServiceCallback ausgelöst, dievom Treiber Kbdclass des Treibers i8042prt bereitgestelltwird. Die Routine KeyboardClassServiceCallbackzieht aus ihrer Queue den unerledigten IRP-Aufruf, fülltdie maximale Menge der KEYBOARD_INPUT_DATA-Strukturen aus, die alle notwendigen Informationenüber das Drücken <strong>und</strong> Lösen von Tasten enthalten <strong>und</strong>erledigt die IRP. Der Raw Input Thread wird nun aktiviert,bearbeitet die empfangenen Informationen <strong>und</strong>sendet dem Klassentreiber erneut eine IRP des TypsIRP_MJ_READ, welche bis zum nächsten Drückenoder Lösen einer Taste wiederum in einer Queue gespeichertwird. Daher ist im Tastatur-Stack immer mindestenseine unerledigte IRP vorhanden, die sich in derQueue des Treibers Kdbclass befindet.<strong>Keylogger</strong>11