Запуск самостоятельно расшифровывающего сценария powershelll base64 с помощью powershell -file / path / to / ps1 - PullRequest
1 голос
/ 06 октября 2019

Я хочу сохранить свои сценарии powershell на локальном сервере в base64, но при запуске из schtasks или локально с использованием powershell -file / path / to / ps1 они самостоятельно декодируются. Возможно ли это?

Я пытался:

Функция Decode {$ data = 'base 64 script'

[System.Text.Encoding] :: ASCII.GetString ([System.Convert] :: FromBase64String ($ data))}

Декодировать

Это не работает. Есть идеи?

1 Ответ

2 голосов
/ 06 октября 2019

Я вижу как минимум два варианта этой ситуации. Одним из вариантов является отправка команды в кодировке base64 в Powershell.exe с использованием параметра -EncodedCommand. Второй вариант заключается в создании сценария декодирования для приема другого сценария, который содержит закодированную команду base64 в качестве значения параметра.


Опция 1: передача закодированной команды

Это предполагает, что ваша закодированная команда base64 является строковой версией ваших команд PowerShell, отформатированных с использованием кодировки символов UTF-16LE (Unicode). Предположим также, что у вас есть скрипт с именем Encoded.ps1, который содержит вашу закодированную команду base64. С выполнением предварительных условий вы можете сделать следующее:

Powershell.exe -EncodedCommand (Get-Content Encoded.ps1)

Вариант 2: Запуск сценария декодирования против закодированного сценария

Требование Unicode делаетне имеет значения в этом случае (вы можете использовать ANSI, если хотите). Вам просто нужно знать исходную кодировку командной строки, чтобы вы могли правильно ее декодировать. Мы примем набор символов ASCII. Также предположим, что Encoded.ps1 содержит вашу команду в кодировке base64.

Во-первых, давайте создадим скрипт декодирования с именем Decode.ps1.

# Decode.ps1
param([string]$FilePath)

$64EncodedData = Get-Content $FilePath  
$DecodedData = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($64EncodedData))

& ([scriptblock]::Create($DecodedData))

Во-вторых, давайте запустим команду Powershell.exe, чтобы декодировать Encoded.ps1 и выполнить команду декодирования.

Powershell.exe -File Decoded.ps1 -FilePath Encoded.ps1

Приведенный выше код предназначен не для отображения содержимого декодированных команд, а для выполнения декодированных команд. $FilePath - это путь к вашему Encoded.ps1 файлу, который содержит строку в кодировке base64 из набора символов в кодировке ASCII. Вы можете выбрать любую кодировку, применимую к вашей ситуации, в файле Decode.ps1. $DecodedData содержит исходные строки команд. Наконец, создается блок сценария, содержащий $DecodedData, а затем вызывается с оператором вызова &.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...