Skip to content

__EventFilterEventConsumer

WMI Parser

Finden Sie WMI Event Subscriptions — den Filter, den Consumer und das Binding, das beide verknüpft — im CIM-Repository. Aktive Objekte über den Index, gelöschte aus freiem Speicher gecarvt. Im Browser mit WebAssembly geparst; nichts wird hochgeladen.

  • OBJECTS.DATA
  • INDEX.BTR
  • MAPPING1-3.MAP
  • CCM_RecentlyUsedApps

Repository-Ordner von WMI hier ablegen

OBJECTS.DATA allein genügt, um Filter, Consumer und Bindings zu carven, auch gelöschte. Mit INDEX.BTR und MAPPING1-3.MAP erhalten Sie die strukturierte Ansicht: Namespaces sowie aktiv oder gelöscht. Ordner und ZIP-Triage-Sammlungen (KAPE, Velociraptor) funktionieren unverändert.

Ein synthetisches Repository aus einem fiktiven Angriff — keine echten Daten, keine funktionsfähigen Payloads. Tipp: Öffnen Sie das Binding IntelPerfMonitor, wechseln Sie dann zu Ausführungsnachweise (SCCM) und zentrieren Sie den Zeitraum auf m64.exe (±1 h).

100 % clientseitig: Das Repository wird per WebAssembly in Ihrem Browser geparst und nie hochgeladen.

So erhalten Sie Ihre Daten

Vollständige Anleitung zur Sicherung

Sichern Sie den gesamten Ordner C:\Windows\System32\wbem\Repository — OBJECTS.DATA, INDEX.BTR und MAPPING1-3.MAP vom selben Zeitpunkt — und legen Sie ihn hier ab. Auf einem laufenden System sind die Dateien vom WMI-Dienst gesperrt; lesen Sie sie daher aus einer Schattenkopie.

  1. Repository-Ordner kopieren
  2. Ordner oder ZIP hier ablegen
  3. Im Browser geparst, nie hochgeladen

In Windows PowerShell einfügen, als Administrator ausgeführt (Systemlaufwerk C:). Es wird eine Schattenkopie erstellt, damit alle Repository-Dateien vom selben Zeitpunkt stammen, der Repository-Ordner kopiert und der Snapshot danach entfernt.

PowerShell · Admin
New-Item -ItemType Directory -Force -Path C:\triage | Out-Null
$sc = Invoke-CimMethod -ClassName Win32_ShadowCopy -MethodName Create -Arguments @{ Volume = 'C:\' }
$vss = Get-CimInstance -ClassName Win32_ShadowCopy -Filter "ID='$($sc.ShadowID)'"
cmd /c mklink /d C:\triage\vss "$($vss.DeviceObject)\"
robocopy C:\triage\vss\Windows\System32\wbem\Repository C:\triage\Repository /E /B /R:0 /W:0 /NP /NDL
cmd /c rmdir C:\triage\vss
$vss | Remove-CimInstance

Ergebnis: C:\triage\Repository mit OBJECTS.DATA, INDEX.BTR und den MAPPING-Dateien. Legen Sie diesen Ordner hier ab (per Drag-and-drop oder über Ordner wählen).

Analyse auf einem anderen Rechner? Packen Sie alles in eine ZIP-Datei mit dem in Windows 10 1803 und neuer integrierten tar.exe (eine mit Compress-Archive aus PowerShell erstellte ZIP funktioniert ebenfalls):

PowerShell / cmd
tar -a -c -f C:\triage\wmi-repository.zip -C C:\triage Repository

Nur ein schneller erster Blick? Dies listet nur die aktiven Bindings (keine gelöschten Objekte; die Abfrage läuft über WMI selbst, ein manipuliertes WMI kann also Dinge verbergen):

PowerShell · Admin
'__EventFilter','__EventConsumer','__FilterToConsumerBinding' | ForEach-Object { Get-CimInstance -Namespace root/subscription -ClassName $_ } | Format-List *

ConfigMgr-Client? CCM_RecentlyUsedApps liegt im selben Repository, die Kopie oben enthält es also bereits. Um vorab zu prüfen, ob der Configuration-Manager-Client installiert ist (Dienst CcmExec, Namespace root\ccm), und einen Blick auf die aktiven Datensätze zu werfen:

PowerShell · Admin
Get-Service CcmExec -ErrorAction SilentlyContinue
Get-CimInstance -Namespace root/ccm/SoftwareMeteringAgent -ClassName CCM_RecentlyUsedApps |
  Sort-Object LastUsedTime -Descending |
  Select-Object LastUsedTime, LastUserName, FolderPath, ExplorerFileName, LaunchCount, CompanyName, ProductName |
  Format-Table -AutoSize

Stolperfallen

  • Eine normale Kopie schlägt fehl, solange der WMI-Dienst läuft. Beenden Sie den Dienst nicht, um die Dateien zu kopieren: Er schreibt das Repository neu und kann gelöschte Datensätze verwerfen. Nutzen Sie den Schattenkopie-Befehl, KAPE oder Velociraptor.
  • Sichern Sie alle Dateien zum selben Zeitpunkt. Eine INDEX.BTR oder MAPPING-Datei von einem anderen Zeitpunkt bricht die strukturierte Ansicht (Carving funktioniert weiterhin, und das Tool warnt).
  • Gelöschte Subscriptions bleiben nur erhalten, bis WMI ihre Seiten wiederverwendet: Sichern Sie früh, vor Neustarts und Softwareinstallationen.

Was ist eine WMI Event Subscription?

WMI (Windows Management Instrumentation) kann eine Aktion ausführen, wenn etwas geschieht. Eine permanente Event Subscription besteht aus drei Teilen: einem __EventFilter (eine WQL-Abfrage, die das Ereignis beschreibt), einem Event Consumer (was zu tun ist: eine Befehlszeile oder ein VBScript/JScript ausführen, eine Protokollzeile, einen Ereignisprotokolleintrag oder eine E-Mail schreiben) und einem __FilterToConsumerBinding, das beide verknüpft.

Subscriptions werden im WMI-(CIM-)Repository gespeichert und überstehen Neustarts. Ihre Aktionen laufen als SYSTEM — eine Befehlszeile, gestartet vom WMI-Provider-Host (WmiPrvSE.exe), oder ein Skript, ausgeführt von scrcons.exe — ohne Eintrag in einem Run-Schlüssel oder einer geplanten Aufgabe. Deshalb nutzen Angreifer sie für Persistenz (MITRE ATT&CK T1546.003), und deshalb werden sie leicht übersehen.

Wo sie gespeichert ist

  • C:\Windows\System32\wbem\Repository\OBJECTS.DATA — jede Klassendefinition und Instanz, in Seiten zu 8 KiB. Freigegebene Seiten behalten ihren alten Inhalt, bis sie wiederverwendet werden.
  • INDEX.BTR — ein B-Baum aus Schlüsseln wie NS_<hash>\CI_<hash>\IL_<hash>.<page>.<record>.<length>, wobei jeder Hash der SHA-256 (MD5 unter XP) eines in Großbuchstaben umgewandelten Namens ist.
  • MAPPING1.MAP, MAPPING2.MAP, MAPPING3.MAP — Zuordnungen logischer zu physischen Seiten für OBJECTS.DATA und INDEX.BTR; Windows hält drei Generationen vor und verwendet die neueste.
  • Subscriptions liegen normalerweise im Namespace root\subscription, aber jeder Namespace funktioniert.

Was dieses Tool zeigt

  • Jedes Binding zusammen mit seinem Filter (der auslösenden Abfrage) und seinem Consumer (Befehlszeile, Skript, Protokolldatei oder Ziel-Ereignisprotokoll).
  • Zwei Wege, jedes Objekt zu finden, immer gekennzeichnet: strukturiert (über INDEX.BTR und die aktuelle MAPPING-Datei, wie python-cim) und Carving (ein Scan von ganz OBJECTS.DATA nach Datensatz-Headern und Binding-Text, wie PyWMIPersistenceFinder).
  • Gelöschte und ältere Versionen von Objekten, wiederhergestellt aus freigegebenen Seiten und Page Slack und von aktiven Objekten unterschieden, sofern die MAPPING-Dateien vorliegen.
  • Begründete Befunde: kodiertes PowerShell, benutzerbeschreibbare Pfade, Skript-Consumer, Persistenz-Auslöser (Laufzeit, Anmeldung, Timer), Bindings außerhalb von root\subscription, ungebundene oder defekte Teile sowie die Windows-eigenen Standards (SCM Event Log und BVT), anhand von Name und Inhalt erkannt.
  • Auf Rechnern mit dem Configuration-Manager-Client: CCM_RecentlyUsedApps als Ausführungsnachweis — Pfad, Benutzer, LastUsedTime, Startanzahl und Versionsinformationen, einschließlich älterer Kopien aus freiem Speicher, mit Zeitraum und Befunden.

Einschränkungen

  • WMI-Subscription-Objekte tragen keine dokumentierten Zeitstempel. Jeder Instanz-Header enthält zwei undokumentierte FILETIMEs, die als Hinweise angezeigt werden; die Subscription-Ansichten haben keinen Zeitfilter (die SCCM-Ansicht schon: LastUsedTime ist eine echte Zeit).
  • Gecarvte Datensätze haben keinen Namespace, und ein über nicht benachbarte freigegebene Seiten verteilter Datensatz ist eventuell nur teilweise lesbar.
  • Ohne INDEX.BTR und eine MAPPING-Datei stammen die Klassenlayouts aus einer integrierten Kopie der Windows-Standardklassen (an jedem Datensatz validiert), und aktive und gelöschte Datensätze lassen sich nicht unterscheiden.
  • MOF-Dateien, die AutoRecover-Liste und andere Persistenzorte sind nicht abgedeckt; das Layout von Windows XP wird unterstützt, ist aber weniger getestet.

So erhalten Sie die Dateien

  • Sichern Sie den gesamten Repository-Ordner mit KAPE (Target WBEM), Velociraptor (Windows.Triage.Targets, WBEM) oder aus einem Datenträger-Image.
  • Lesen Sie die Dateien auf einem laufenden System aus einer Volumeschattenkopie, damit alle vom selben Zeitpunkt stammen. Beenden Sie niemals den WMI-Dienst, um sie zu kopieren.
  • Bewahren Sie auch ältere Kopien auf (Schattenkopien, Windows.old): Eine gelöschte Subscription kann dort noch vorhanden sein.

Danksagungen und Methode

  • flare-wmi / python-cim — Willi Ballenthin, FireEye (now Mandiant). Die Repository-Strukturen — MAPPING-Dateien, INDEX.BTR-Seiten, Inhaltsverzeichnis von OBJECTS.DATA, Header von Klassendefinitionen und Instanzen — sind aus python-cim portiert, und der strukturierte Modus folgt dessen Objektauflösung. Apache-2.0.
  • PyWMIPersistenceFinder — David Pany, Mandiant. Der String-Carving-Durchlauf folgt dessen Idee: __FilterToConsumerBinding-Text und seine Referenzen EventConsumer.Name / __EventFilter.Name irgendwo in OBJECTS.DATA finden und die Bindings BVT und SCM Event Log als übliche Standards behandeln. MIT.
  • WMI Attacks, Defense and Forensics (DEF CON 23) — William Ballenthin, Matt Graeber, Claudiu Teodorescu (FireEye, 2015). Der Vortrag (und das begleitende White Paper), der das Repository-Format und WMI-Persistenz dokumentiert hat; Folien und Demos liegen im Repository flare-wmi.
  • [MS-WMIO]: WMI Encoding Version 1.0 Protocol — Microsoft. Die öffentliche Spezifikation der Objektkodierung in jedem Datensatz: Klassenteile, NdTable, Wertetabelle, Heap und kodierte Strings.

FAQ

Wird mein Repository irgendwohin hochgeladen?

Nein. Der Parser ist in Rust geschrieben, nach WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser. Es gibt keinen Upload-Endpunkt.

Reicht OBJECTS.DATA aus?

Ja, um Subscriptions zu finden: Der Carving-Modus durchsucht jedes Byte nach Datensätzen von Filtern, Consumern und Bindings, auch gelöschten. Mit INDEX.BTR und den MAPPING-Dateien erhalten Sie zusätzlich die Namespaces und eine verlässliche Einstufung als aktiv oder gelöscht.

Was bedeuten „Index“, „Gecarvter Datensatz“ und „String-Treffer“?

Sie geben an, wie ein Objekt gefunden wurde. Index: über INDEX.BTR und die aktuelle MAPPING-Datei, das Objekt ist also aktiv. Gecarvter Datensatz: Sein Datensatz-Header wurde beim Scan von OBJECTS.DATA gefunden; ist er nicht zusätzlich indiziert, liegt er in freigegebenem Speicher. String-Treffer: Nur der Text des Bindings ist erhalten, so wie PyWMIPersistenceFinder Bindings findet.

Sind SCM Event Log Consumer und BVTConsumer bösartig?

Nein, wenn sie der Windows-Installation entsprechen: Das Binding SCM Event Log ist ab Windows Vista enthalten, und das Binding BVT (cscript KernCap.vbs) ist ein harmloses Überbleibsel auf Images der Windows-7-Ära. Das Tool prüft auch den Inhalt und markiert einen Standardnamen mit abweichendem Inhalt.

Lässt sich feststellen, wann eine Subscription erstellt wurde?

Nicht zuverlässig. Das Repository speichert keinen dokumentierten Zeitstempel pro Objekt. Jeder Instanz-Header hat zwei FILETIMEs, die oft dem Schreibzeitpunkt der Instanz folgen; sie werden als Hinweise angezeigt. Korrelieren Sie mit Ereignis-ID 5861 in Microsoft-Windows-WMI-Activity/Operational, das neue permanente Consumer protokolliert.

Was ist die Ansicht Ausführungsnachweise (SCCM)?

Auf Rechnern mit dem Configuration-Manager-Client (SCCM / ConfigMgr) enthält das Repository auch CCM_RecentlyUsedApps in root\ccm\SoftwareMeteringAgent: einen Datensatz pro ausführbarer Datei und Benutzer mit LastUsedTime (letzter Start durch diesen Benutzer, ein CIM DATETIME mit eigenem UTC-Versatz), einer Startanzahl und den Versionsinformationen der Datei. Das Tool liest ihn aus derselben OBJECTS.DATA, carvt ältere Kopien aus freiem Speicher und bietet einen Zeitraum. Ohne ConfigMgr-Client gibt es diese Daten nicht.

CCM_RecentlyUsedApps aus dem WMI-Repository lesen: welche Programme jeder Benutzer wann zuletzt und wie oft startete, inklusive älterer Kopien aus OBJECTS.DATA.
Schritt-für-Schritt-Checkliste zu WMI-Persistenz: Live-Abfragen, Repository, Ereignis-IDs 5860 und 5861, Sysmon 19–21, Ausführungsspuren und Bereinigung.
Die zwei WMI-Subscriptions von Windows — SCM Event Log und BVTFilter/BVTConsumer: Inhalt, warum sie harmlos sind und wie Angreifer die Namen missbrauchen.