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.

WinObj zeigt Objekte des Windows Kernels

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.

Archiv

Impressum

Dieses Blog ist ein Projekt von:
Andreas Schuster
Im Äuelchen 45
D-53177 Bonn
impressum@forensikblog.de

Copyright © 2005-2012 by
Andreas Schuster
Alle Rechte vorbehalten.
Powered by Movable Type 5.12