Objekttypen auflisten
Es gibt viele Möglichkeiten, um alle Objekttypen des Microsoft Windows Betriebssystemkerns aufzulisten. In diesem kurzen Beitrag stelle ich drei davon vor: den Microsoft Debugger, Sysinternals' WinObj und ein Plugin für das Speicheranalyse-Framework Volatility.
Microsoft Debugger
Microsofts Debugger "WinDbg" ermöglicht auf sehr einfache Weise die Auflistung aller Objektklassen des Kernels. Hierzu muss man lediglich alle Elemente des Verzeichnisses \ObjectTypes abfragen:
kd> !object \ObjectTypes
Object: e1004ab0 Type: (812be278) Directory
ObjectHeader: e1004a98 (old version)
HandleCount: 0 PointerCount: 25
Directory Object: e1004dc0 Name: ObjectTypes
Hash Address Type Name
---- ------- ---- ----
00 812be278 Type Directory
01 8128f5e0 Type Mutant
81292c68 Type Thread
03 81293c28 Type FilterCommunicationPort
05 812b5e70 Type Controller
07 8128eca0 Type Profile
8128f980 Type Event
812be448 Type Type
09 8128e560 Type Section
8128f7b0 Type EventPair
812be0a8 Type SymbolicLink
10 8128e730 Type Desktop
11 8128ee70 Type Timer
12 812b5730 Type File
8128e900 Type WindowStation
16 812b5ad0 Type Driver
18 812b0e70 Type WmiGuid
8128ead0 Type KeyedEvent
19 812b5ca0 Type Device
81292040 Type Token
20 81292398 Type DebugObject
21 812b5900 Type IoCompletion
22 81292e38 Type Process
24 812b5040 Type Adapter
26 8128b980 Type Key
28 81292a98 Type Job
31 812b68c0 Type WaitablePort
812b6a90 Type Port
32 8128f410 Type Callback
33 81293df8 Type FilterConnectionPort
34 8128e040 Type Semaphore
Für jede Klasse nennt der Debugger die Basisadresse. Einzelheiten über die Klasse zeigen dann die Kommandos !object und "display type" (dt):
kd> !object 81292e38
Object: 81292e38 Type: (812be448) Type
ObjectHeader: 81292e20 (old version)
HandleCount: 0 PointerCount: 1
Directory Object: e1004ab0 Name: Process
kd> dt _OBJECT_TYPE 81292e38
ntdll!_OBJECT_TYPE
+0x000 Mutex : _ERESOURCE
+0x038 TypeList : _LIST_ENTRY [ 0x81292e70 - 0x81292e70 ]
+0x040 Name : _UNICODE_STRING "Process"
+0x048 DefaultObject : (null)
+0x04c Index : 5
+0x050 TotalNumberOfObjects : 0x15
+0x054 TotalNumberOfHandles : 0x4e
+0x058 HighWaterNumberOfObjects : 0x16
+0x05c HighWaterNumberOfHandles : 0x52
+0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
+0x0ac Key : 0x636f7250
+0x0b0 ObjectLocks : [4] _ERESOURCE
WinObj
Möchten Sie sich einen Eindruck von der Objekthierarchie verschaffen und hierfür lieber eine graphische Oberfläche verwenden, dann ist
WinObj von Mark Russinovich möglicherweise das richtige Programm für Sie. Die Objektklassen sind wiederum im Verzeichnis "\ObjectTypes" zu finden.

Volatility
Letztlich habe ich mich entschlossen, selbst ein Plugin für das Speicheranalyse-Framework Volatility zu schreiben. Leider musste ich dazu auch einige Dateien des Frameworks ändern; das Plugin läuft also nicht mit der Standard-Distribution. Bitte entpacken Sie das Archiv im Basisverzeichnis von Volatility (aber vergessen Sie nicht, vorher eine Sicherungskopie zu erstellen!).
Das Plugin enthält ein paar kleine Tricks, um die Struktur _OBJECT_HEADER korrekt zu interpretieren und um physische Adressen in virtuelle Adressen des Kernels umzurechnen; letztgenannte Funktion ist deutlich vom Modul "strings" der Volatility-Distribution inspiriert.
Das Plugin gibt die folgenden Informationen aus:
- Phys.Addr - physische Adresse des ObjT Blocks im Pool
- Obj Type - Zeiger auf die Definition der Klasse "ObjectType". Der Wert ist abhängig vom jeweiligen System und kann sich auch nach einem Neustart ändern. Während einer laufenden Sitzung sollten aber alle Objekte der selben Klasse auf die selbe Definition verweisen.
- #Ptr - Anzahl der Zeiger auf das ObjectType Objekt
- #Hnd - Anzahl der Handles für das ObjectType Objekt
- Objects - aktuelle und maximale Anzahl von Objekten dieser Klasse
- Handles - aktuelle und maximale Anzahl von Handles auf Objekte dieser Klasse
- Pool alloc - Pool Tag und Pool Typ (auslagerbar/nicht auslagerbar) für Objekte dieser Klasse
- TypePtr - virtuelle Adresse des Kernels des ObjectType Objektes
- Name - Name der Klasse
Hier ist ein Beispiel für die Programmausgabe, das durch Ausführung des Plugins mit einem populären Speicherabbild aus dem NIST CFReDS Projekt erzeugt wurde:
python volatility objtypescan -f xp-laptop-2005-06-25.dd
Ich muss eingestehen, dass diese Informationen im Rahmen einer forensischen Untersuchung des Arbeitsspeichers eher nicht hilfreich sind. Ich verwende das Plugin eher als Hilfsmittel bei der Entwicklung anderer Tools. Die Maximalstände der Objekt- und Handle-Zahlen können allerdings erste Anhaltspunkte auf einen ungewöhnlichen Systemzustand geben.