PowerShell 反混淆

貼上一段混淆的 PowerShell 命令或指令碼。它會在瀏覽器裡逐層解碼——不上傳、不執行——結果以惰性文字顯示,可疑模式則作為待核查的線索列出。

PowerShell 混淆把指令碼的真實行為藏在一層層編碼後面:Base64 編碼的 -EncodedCommand、gzip 壓縮、字元碼、字串串接、-f 格式化運算子與反引號跳脫——逐層剝開,直到剩下可讀文字,或者到達靜態還原的終點。這個工具一次剝一層,並展示每一步,讓你不用執行指令碼就能看清它在說什麼。如果指令碼來自 Windows 事件記錄,EVTX 檢視器可以讀取 .evtx 檔案並標示 4104 事件;其他文字記錄則用記錄解析器找出關鍵行。配套文章如何反混淆 PowerShell 指令碼用文字說明了這些層次與安全的工作流程。

最後更新:

最大 200 KB(.txt 或 .ps1)。檔案只在瀏覽器裡讀取,絕不離開你的裝置。絕不執行。

🔒 你的指令碼只在瀏覽器裡還原,絕不離開你的裝置。不需要帳號、不上傳、不呼叫伺服器——而且這裡的任何東西都不會被執行。

你貼上的指令碼會如何處理

什麼都不會離開你的瀏覽器。指令碼由本頁的 JavaScript 在本機還原:不上傳、不呼叫伺服器、不儲存、不需要帳號。這很重要,因為可疑指令碼絕不應該貼到聊天視窗裡——聊天視窗可能執行它、引用它或儲存它——也不應該為了看它做什麼而執行它。關閉頁面即丟棄。

乾淨的結果不能證明什麼

結果乾淨不等於安全。它只表示沒有已知的層次適用、沒有指標命中——動態建立的字串、加密的承載或只在執行時存在的值,靜態還原是解不開的;沒有任何指標的指令碼仍然可能是惡意的。

命中指標不等於惡意。下載搖籃、IEX 與編碼命令在管理與部署中都有合法用途;每一次命中都是結合脈絡核查的線索,不是結論。

永遠不要為了搞清一個未知指令碼在做什麼而執行它。先惰性解碼,把結果交給你的 EDR 或沙箱,並對解碼後的文字保持與編碼形式同樣的懷疑——它是證據,不是安全證明。

還原是怎麼運作的

這個工具按順序嘗試八個層次,一步一層,並不斷重複,直到沒有層次適用或已剝開十層:-EncodedCommand 擷取(Base64 轉 UTF-16LE,失敗則轉 UTF-8);裸 Base64 密文;gzip 或 deflate 解壓縮(輸入可以先包一層 Base64);[char] 與 [char[]] 字元碼序列;跨混合引號與多行的字串串接;-f 格式化運算子;反引號跳脫去除;以及 ${...} 與 $變數預留位置的清單——預留位置永遠不會被解析,因為它們的值只在執行時存在。每一步都會展示還原前後的文字與字元數。

這個工具不做什麼:它絕不執行任何東西——結果是惰性文字,頁面即使意外也無法執行它。它解不開動態建立的字串、加密承載或只在執行時存在的值,也不判斷指令碼是否安全:指標只是模式比對;一個讓所有層次都失效的指令碼會被報告為「無法繼續還原」,絕不會被說成乾淨。

指令碼區塊記錄(事件 4104)記錄了 PowerShell 實際執行的指令碼內容,但長指令碼會被拆成約 4 KB 的片段,每個片段帶有 ScriptBlockId、MessageNumber 與 MessageTotal。重組分頁按 ScriptBlockId 分組、按 MessageNumber 排序、拼接,並標示缺失的部分——一個 3 段中缺第 2 段的分組就是不完整的,缺失的文字無法猜測。重組後的文字會送入同一個反混淆器。

常見問題

為什麼結果顯示為惰性文字,而不是可執行的指令碼?

因為反混淆的目的是讀懂可疑指令碼,而不是執行它。解碼後的文字仍可能下載並執行承載——以惰性文字加複製按鈕的形式展示,你可以檢查它、把它交給 EDR 或沙箱,而永遠不用冒連點兩下的風險。

工具停在「無法繼續還原」,接下來怎麼辦?

剩下的文字用了這個工具不認識的層次、在執行時建立字串,或是加密的——靜態還原已經到頭了。不要為了搞清楚而執行它:把編碼形式與部分解碼結果交給 EDR 或沙箱,並把未知的層次視為懷疑的理由,而不是乾淨的結果。

這些指標該怎麼用?

把每一個都當作問題,而不是答案。下載搖籃要問 URL 指向哪裡、那個主機是否在預期之中;AMSI 繞過模式要問指令碼為什麼想讓掃描器失明;編碼命令要問編碼藏起了什麼。在 EDR、記錄與指令碼來源的那台機器上結合脈絡逐一核查,確認之後再下結論。