Tastatur umwandelt <strong>und</strong> sie in der VIQ des Threads derAnwendung Microsoft Word anlegt.Bearbeitung der Meldungen durch ein konkretesFensterReihenfolge der RIT-Anfragen an den TastaturtreiberMit Hilfe des Tools IrpTracker des bereits erwähntenUnternehmens Open Systems Resources kann mandie Reihenfolge der während der Bearbeitung derTastatureingaben erfolgenden Aufrufe einsehen.Bearbeitung der Tastatureingabe im User-ModeEs stellt sich nun die Frage, wie der Thread die Meldungenverarbeitet, die in seiner Message-Queue einlaufen.Der Standard-Verarbeitungs-Zyklus von Meldungensieht für gewöhnlich folgendermaßen aus:while(GetMessage(&msg, 0, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}Mit Hilfe der Funktion GetMessage werden die Tastaturereignisseaus der Queue gezogen <strong>und</strong> mittels derFunktion DispatchMessage in eine Fensterroutine weitergeleitet,die die Meldungen für das Fenster bearbeitet,wo im gegebenen Augenblick der Input-Fokuskonzentriert ist. Der Input-Fokus ist ein von der Anwendungoder von Windows erzeugtes Attribut, das demFenster hinzugefügt werden kann. Verfügt ein Fensterüber einen Input-Fokus, empfängt die entsprechendeFunktion dieses Fensters alle Tastaturmeldungen ausder System-Queue. Anwendungen können den Input-Fokus von einem Fenster zu einem anderen weiterreichen,wie etwa beim Wechsel von einer Anwendungzur anderen mit Hilfe der Tastenkombination Alt+Tab.Wie bearbeitet der RIT nun die eingehenden Informationen?Alle Tastaturereignisse werden in die SHIQ eingereiht,woraufhin sie nacheinander in Windows-Meldungenumgewandelt werden (wie etwa WM_KEY*,WM_?BUTTON* oder WM_MOUSEMOVE) <strong>und</strong> sichans Ende der virtualisierten Eingabe-Queue (VIQ =Virtualized Input Queue) des Vordergr<strong>und</strong>-Threadseinreihen. In den Windows-Meldungen werden dieTasten-Scan-Codes durch virtuelle Tastencodes ersetzt,die nicht der Anordnung der Tasten auf der Tastatur,sondern der Aktion, die die jeweilige Taste ausführt,entsprechen. Der Mechanismus der Codeumwandlunghängt vom jeweils aktiven Tastaturlayout, von dergleichzeitigen Betätigung anderer Tasten (wie etwaSHIFT) <strong>und</strong> anderen Faktoren ab.Geht der Anwender ins System, generiert der WindowsExplorer einen Thread, der eine Aufgabenliste <strong>und</strong> einenArbeitstisch (WinSta0_RIT) erzeugt. Dieser Threadwird an den RIT gekoppelt. Startet der Anwender MicrosoftWord, so fügt sich der Thread dieser Anwendung,der das Fenster erzeugt, sofort zu dem RIT hinzu. Daraufhinlöst sich der zum Explorer gehörende Threadvom RIT, da immer nur ein Thread zur Zeit an den RITgekoppelt sein kann. Bei der Betätigung von Tastenerscheint in der SHIQ ein entsprechendes Element,das dafür sorgt, dass der RIT aktiviert wird, dass er dieEreignisse der Hardware-Eingabe in Mitteilungen derNoch vor der Funktion DispatchMessage wird für gewöhnlichdie Funktion TranslateMessage ausgelöst, dieauf der Gr<strong>und</strong>lage der Meldungen WM_KEYDOWN,WM_KEYUP, WM_SYSKEYDOWN <strong>und</strong> WM_SYS-KEYUP die „symbolischen“ Meldungen WM_CHAR,WM_SYSCHAR, WM_DEADCHAR <strong>und</strong> WM_SYS-DEADCHAR generiert. Diese symbolischen Meldungenreihen sich in die Message-Queue der Anwendung ein,wobei die originalen Tastatur-Meldungen nicht aus derQueue gelöscht werden.Datenfelder des Tastenzustands der TastaturBei der Entwicklung des Hardware-Eingabemodellsin Windows war die Gewährleistung der Ausfallunempfindlichkeitein wichtiger Punkt. Diese wird durcheine unabhängige Verarbeitung der Eingabe durch dieThreads gewährleistet, wodurch ungünstige Wechselwirkungender Threads miteinander verhindert werden.Eine zuverlässige Isolation der Threads voneinanderist dadurch allerdings noch nicht gegeben, daher unterstütztdas System noch eine zusätzliche Konzep tion,den lokalen Eingabezustand. Jeder Thread verfügtüber einen eigenen Eingabezustand, der in der StrukturTHREADINFO dokumentiert ist. Die Informationenüber den Zustand enthalten Daten über die virtualisierteEingabe-Queue des Threads sowie eine Gruppe vonVariablen. Letztere enthalten steuernde Informationen<strong>Keylogger</strong>12
über den Eingabe-Zustand. Bezüglich der Tastaturwerden die folgenden Angaben unterstützt: welchesFenster befindet sich im Fokus der Tastatur, welchesist gegenwärtig aktiv, welche Tasten sind gedrückt, inwelchem Zustand befindet sich der Eingabecursor.Angaben dazu, welche Tasten gedrückt sind, werdenim Datenfeld des synchronen Tastenzustandes gespeichert.Alle Variablen des lokalen Eingabezustands desThreads enthalten einen Synchronous Key State Array,während sich alle Threads nur ein Datenfeld des asynchronenEingabezustands teilen, welches analoge Informationenenthält. Diese Datenfelder geben Auskunftüber den Zustand aller Tasten zu jedem beliebigen Zeitpunkt,<strong>und</strong> mit der Funktion GetAsyncKeyState lässtsich bestimmen, ob eine einzelne Taste gegenwärtiggedrückt ist. Die Funktion GetAsyncKeyState sendetstets 0 (nicht gedrückt) zurück, wenn der Thread, derdie Funktion aufruft, nicht derjenige ist, der das Fenstermit dem derzeitigen Input-Fokus erzeugt hat.von Filterfunktionen erleichtert <strong>und</strong> die Performancedes Betriebssystems verbessert wird.Windows unterstützt einzelne Ketten für jeden Hook-Typ. Unter einer Hook-Kette versteht man eine Listevon Verweisen auf Filterfunktionen (spezielle von derAnwendung definierbare Rückruf-<strong>Funktionen</strong>). Findetein bestimmtes Ereignis statt, das mit einem konkretenHook-Typ in Verbindung steht, so sendet das Systemnacheinander jeder Filterfunktion in der Hook-Ketteeine Meldung. Welche Aktion von der jeweiligen Filterfunktiondurchgeführt werden kann, hängt von demHook-Typ ab: Einige <strong>Funktionen</strong> können lediglich dasEreignis an sich verfolgen, andere sind in der Lage, dieParameter einer Meldung zu modifizieren oder gar dieVerarbeitung einer Meldung zu stoppen, indem sie denAufruf der nächsten Filterfunktion in der Hook-Ketteoder die Verarbeitungsfunktionen der Fenster-Meldungenblockieren.Die folgende Funktion GetKeyState unterscheidet sichdadurch von der Funktion GetAsyncKeyState, dass sieden Tastaturzustand in dem Moment zurücksendet, indem die letzte Tastaturmeldung aus der Thread-Queueentfernt wird. Diese Funktion kann jederzeit aufgerufenwerden, unabhängig davon, welches Fenster sich geradeim Fokus befindet.TastaturhooksAls Hook wird im Windows-Betriebssystem ein Mechanismusbezeichnet, der Ereignisse unter Verwendungeiner bestimmten Funktion (wie etwa der Übermittlungvon Windows-Meldungen, der Eingabe über die Mausoder die Tastatur) abfängt, bis diese zu den Anwendungengelangen. Diese Funktion kann daraufhin aufdie Ereignisse reagieren <strong>und</strong> sie unter Umständen verändernoder außer Kraft setzen.<strong>Funktionen</strong>, denen die Ereignisse gemeldet werden,heißen Filterfunktionen <strong>und</strong> werden nach Typen entsprechendder von ihnen abzufangenden Ereignisseunterschieden. Damit Windows eine Filterfunktion aufrufenkann, muss diese Funktion an einen Hook gekoppeltsein, etwa an einen Tastatur-Hook. Die Anbindungeines oder mehrerer Filterfunktionen an einen beliebigenHook nennt man Hook-Installation. Zum Installieren<strong>und</strong> Löschen von Funktionsfiltern einer Anwendungwerden die Win32-API-<strong>Funktionen</strong> SetWindowsHookEx<strong>und</strong> UnhookWindowsHookEx verwendet. Einige Hookskönnen sowohl für das gesamte System als auch füreinen konkreten Thread installiert werden.Werden an einen Hook mehrere Filterfunktionen gekoppelt,realisiert Windows eine <strong>Funktionen</strong>-Queue,wobei die als letzte angekoppelte Funktion an den Anfang<strong>und</strong> die allererste Funktion ans Ende der Queuegestellt wird. Die Queue der Filterfunktionen wird vonWindows selbst unterstützt, wodurch das SchreibenFunktionsfilter-Kette in WindowsWenn eine oder mehrere Filterfunktionen an einenHook gekoppelt sind <strong>und</strong> ein Ereignis stattfindet, dasszur Aktivierung des Hooks führt, ruft Windows die ersteFunktion aus der Funktionsfilter-Queue auf, womitdessen Verantwortlichkeit beendet ist. Im Folgenden istdie Funktion dafür verantwortlich, die nächste Funktionin der Kette aufzurufen, wofür die Win32-API-FunktionCallNextHookEx verwendet wird.Das Betriebssystem unterstützt verschiedene Hook-Typen, von denen jeder einzelne Zugriff auf einen derAspekte des Bearbeitungsmechanismus von Windows-Meldungen ermöglicht. Für einen <strong>Keylogger</strong>-Autorensind fast alle Hook-Typen von Interesse: WH_KEY-BOARD, WH_KEYBOARD_LL (Abfangen der Tastaturereignisse<strong>und</strong> deren Hinzufügen in die Ereignis-Queuedes Threads), WH_JOURNALRECORD <strong>und</strong> WH_JOURNALPLAYBACK (Aufzeichnung <strong>und</strong> Wieder gabeder Maus- <strong>und</strong> Tastaturereignisse), WH_CBT (Abfangeneiner Vielzahl von Ereignissen, einschließlich desLöschens der Tastaturereignisse aus der System-Hardware-Eingabe-Queue),WH_GETMESSAGE ( Abfangender aus der Ereignis-Queue des Threads empfangenenEreignisse).<strong>Keylogger</strong>13