PowerShell中Base64编解码必须使用UTF-16LE编码,否则-EncodedCommand会失败;字符串编码用[System.Text.Encoding]::Unicode.GetBytes(),解码用GetString();文件编解码直接处理字节,无需考虑文本编码。PowerShell 本身不提供直接的 `base64 encode` 或 `decode` 命令,但可以通过 .NET 类库轻松实现——关键在于**编码必须用 UTF-16LE(即 Unicode)**,否则 `-EncodedCommand` 参数会失败(出现乱码或报错)。下面分场景说明常用操作。
对字符串做 base64 编码(用于 -enc 参数)
powershell 的 -encodedcommand 只接受 utf-16le 编码后的 base64 字符串,不能用普通 utf-8 编码网站生成的字符串。
- 正确做法:先将脚本内容转为 UTF-16LE 字节数组,再 Base64 编码
- 示例命令(一行即可):
PS> $cmd = 'Write-Host "Hello from encoded command"'; $bytes = [System.Text.Encoding]::Unicode.GetBytes($cmd); [Convert]::ToBase64String($bytes)
- 输出就是可直接用于
powershell -enc XXX的字符串 - 注意:
[System.Text.Encoding]::Unicode在 PowerShell 中等价于 UTF-16LE,不是 UTF-16BE
对 base64 字符串解码回 PowerShell 脚本
常用于分析可疑进程或日志中捕获的 encoded command。
- 把 Base64 字符串还原成原始命令(UTF-16LE 解码):
PS> $encoded = 'WwB3AHIAaQB0AGUAKAAnAEgAZQBsAGwAbwAgAGYAcgBvAG0AIABlAG4AYwBvAGQAZQBkACcAKQBdAA=='; $bytes = [System.Convert]::FromBase64String($encoded); [System.Text.Encoding]::Unicode.GetString($bytes)
- 结果是:
Write('Hello from encoded') - 如果解码后是乱码,大概率是用了 UTF-8 编码而非 UTF-16LE
对文件内容进行 base64 编码/解码
适用于传输二进制文件(如 exe、ps1)或还原 payload。
- 编码文件为 Base64 字符串(便于嵌入或传输):
PS> [Convert]::ToBase64String([IO.File]::ReadAllBytes('C:\tools\payload.ps1'))
- 解码 Base64 字符串并保存为文件:
PS> $data = [Convert]::FromBase64String('SUQgZm9yIGV4YW1wbGU='); [IO.File]::WriteAllBytes('C:\out.txt', $data)
- 这种编解码方式默认按原始字节处理,不涉及文本编码问题
- 适合任意文件类型(图片、exe、脚本等)
快速验证是否编码正确
执行前建议本地测试解码结果是否可读:
- 复制你生成的 Base64 字符串,用上面的解码命令反向还原
- 确认输出是合法 PowerShell 语法,无乱码、无截断
- 若含中文或特殊符号,尤其要检查是否用了 UTF-16LE(不是 UTF-8)
- Windows 自带的记事本保存为“Unicode”格式时,默认就是 UTF-16LE,可用作参考











