Skip to content

PowerShell -EncodedCommand und Obfuskation dekodieren

Wie -EncodedCommand und gängige PowerShell-Obfuskation funktionieren – base64/UTF-16LE, gzip/deflate, Zeichencodes, Verkettung, der Formatoperator und Backticks – und wie man sie gefahrlos dekodiert.

Veröffentlicht am 3 Min. Lesezeit

Kurzfassung. -EncodedCommand ist Base64 von UTF-16LE-Text. Darüber hinaus schichten Angreifer gzip/deflate, [char]-Codes, Verkettung von Zeichenketten, den -f-Formatoperator und Backtick-Escaping übereinander. All das lässt sich mit reinen Texttransformationen umkehren, die den Code nie ausführen. Der PowerShell Parser entpackt diese Schichten Ebene für Ebene und zeigt das Ergebnis als inerten Text an; fügen Sie beliebige Eingaben in seine Deobfuskations-Ansicht ein.

-EncodedCommand

powershell -EncodedCommand <base64> (auch -enc, -e) erwartet den Befehl als Base64 der UTF-16LE-Bytes des Texts (Microsoft: about_PowerShell.exe). Zum Dekodieren: Das Argument Base64-dekodieren und die Bytes anschließend als UTF-16LE interpretieren. Ein verräterisches Merkmal ist das abwechselnde A-Padding im Base64 (VwByAGkAdABlA...), das daher rührt, dass das höherwertige Byte jedes ASCII-Zeichens null ist.

Mehrschichtige Obfuskation

Echte Samples verschachteln Kodierungen. Die gängigsten, alle als Text umkehrbar:

  • Komprimierung: [Convert]::FromBase64String(...) wird an einen GzipStream oder DeflateStream übergeben, danach IEX. Dekodieren Sie das Base64 und entpacken Sie dann den gzip-/deflate-Stream.
  • Zeichencodes: [char]73+[char]69+[char]88 oder [char[]](73,69,88)-join'' – jede Zahl in ihr Zeichen umwandeln.
  • Verkettung: 'IE'+'X' – benachbarte Zeichenkettenliterale zusammenfügen.
  • Formatoperator: ("{1}{0}" -f 'X','IE') – anhand der numerischen Platzhalter neu anordnen.
  • Backticks: IEX – ein Backtick innerhalb eines Worts ist ein wirkungsloses Escape-Zeichen; entfernen Sie es.

Der Parser wendet jede dieser Umkehrungen an und zeigt jede Zwischenebene, sodass Sie genau sehen, wie ein Einzeiler aufgebaut wurde. Siehe kodierter Befehl, Download-Cradle und Invoke-Expression.

Sicher dekodieren, niemals ausführen

Dekodieren ist das Gegenteil von Ausführen: Es besteht aus Base64, UTF-16LE, Entpacken und Zeichenkettenbearbeitung – nichts davon ruft PowerShell auf. Deshalb kann ein Browser-Tool eine Payload gefahrlos offenlegen, die Sie niemals ausführen würden. Der Parser markiert im dekodierten Text Befunde wie AMSI-Umgehungen, Download-Cradles und Manipulationen der Protokollierung und extrahiert alle URLs und IPs als inerte Zeichenketten.

Wo Ihnen welche Form begegnet

Die Skriptblockprotokollierung (4104) speichert in der Regel den dekodierten Block, doch die Befehlszeile in den Ereignissen 400/800, der PSReadLine-Verlauf und die Transkripte behalten die kodierte Form – dekodieren Sie sie also dort. Analysieren Sie eine komplette Sammlung im Browser.

FAQ

Welche Kodierung verwendet -EncodedCommand?

Das Argument ist Base64 des Befehlstexts, kodiert als UTF-16LE (Little-Endian-Unicode). Dekodieren Sie das Base64 und lesen Sie die Bytes anschließend als UTF-16LE, um das Skript wiederherzustellen.

Ist es sicher, einen bösartigen Befehl zu dekodieren?

Dekodieren ist eine reine Texttransformation – Base64, UTF-16LE, Entpacken von gzip/deflate, Zeichenkettenmanipulation. Der Befehl wird dabei nie ausgeführt. Den dekodierten Text zu lesen ist sicher; ihn auszuführen nicht.

Zeigt die Skriptblockprotokollierung nicht ohnehin das dekodierte Skript?

Oft ja: 4104 protokolliert den Block nach der Deobfuskation. Die Befehlszeile in den Ereignissen 400/800, der PSReadLine-Verlauf und die Transkripte zeigen jedoch die kodierte Form, daher müssen Sie sie dort weiterhin dekodieren.

Verwandte Artikel

Schritt für Schritt: PowerShell-.evtx-Protokolle, PSReadLine-Verlauf und Transkripte in einem kostenlosen Browser-Viewer öffnen, Skriptblöcke zusammensetzen, kodierte Befehle dekodieren und als CSV oder JSON exportieren.
Wie PowerShell-Transkripte aufgebaut sind, was der Header aufzeichnet, wie Befehlszeitstempel mit -IncludeInvocationHeader funktionieren und wie man Transkripte untersucht.
Was die PSReadLine-Verlaufsdatei aufzeichnet, wo sie liegt, warum sie keine Zeitstempel hat und wie man sie – samt ihren Grenzen – in einer Untersuchung nutzt.