2016-07-15 3 views
0

я обнаружил, что команда некодированной плохо, но я не понимаю, что это неправильно:Команда закодированной в Powershell СБОЙ

Мой код:

$command = "(New-Object System.Net.WebClient).DownloadFile('http://localhost/update_program.exe','updater.exe'); Start-Process 'updater.exe'" 
$bytes = [Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
echo $encodedCommand 

Вернуться

KABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGU 
AbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcAA6AC8ALwBsAG8AYwBhAG 
wAaABvAHMAdAAvAHUAcABkAGEAdABlAF8AcAByAG8AZwByAGEAbQAuAGUAeABlACcALAAnAHUAcABkA 
GEAdABlAHIALgBlAHgAZQAnACkAOwAgAFMAdABhAHIAdAAtAFAAcgBvAGMAZQBzAHMAIAAnAHUAcABk 
AGEAdABlAHIALgBlAHgAZQAnAA== 

Я стараюсь:

powershell -encodedCommand KABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcAA6AC8ALwBsAG8AYwBhAGwAaABvAHMAdAAvAHUAcABkAGEAdABlAF8AcAByAG8AZwByAGEAbQAuAGUAeABlACcALAAnAHUAcABkAGEAdABlAHIALgBlAHgAZQAnACkAOwAgAFMAdABhAHIAdAAtAFAAcgBvAGMAZQBzAHMAIAAnAHUAcABkAGEAdABlAHIALgBlAHgAZQAnAA== 

возвращение:

Missing expression after unary operator '-'. 
In line: 1 Character: 2 
+ - < <<< encodeCommand KABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUA 
dAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQ 
AcAA6AC8ALwBsAG8AYwBhAGwAaABvAHMAdAAvAHUAcABkAGEAdABlAF8AcAByAG8AZwByAGEAbQAuAG 
UAeABlACcALAAnAHUAcABkAGEAdABlAHIALgBlAHgAZQAnACkAOwAgAFMAdABhAHIAdAAtAFAAcgBvA 
GMAZQBzAHMAIAAnAHUAcABkAGEAdABlAHIALgBlAHgAZQAnAA== 
    + CategoryInfo   : ParserError: (-:String) [], ParentContainsErrorR 
    ecordException 
    + FullyQualifiedErrorId : MissingExpressionAfterOperator 

Потому что моя команда закодирована с ошибкой?

+0

В вашем последнем утверждении есть избыточная двойная кавычка после Start-Process 'updater.exe'. –

+0

В чем проблема с запуском команды? 'powershell.exe -command" <# Ваша команда идет здесь #> "' – n01d

+0

Какова фактическая проблема, которую вы пытаетесь решить, т. е. для чего вам нужна кодировка base64? –

ответ

0

Извините, я сначала не понял ваш вопрос. Я думаю, вы пытались спросить, как остановить Powershell от выполнения строки, которую вы назначаете команде $. Если да, попробуйте ввести следующий код:

powershell -command { 
    $command = [string] $null; $command += '(New-Object System.Net.WebClient).DownloadFile('; 
    $command += "'http://localhost/update_program.exe','updater.exe') ; 
    Start-Process 'updater.exe'"; $bytes = [Text.Encoding]::Unicode.GetBytes($command); 
    $encodedCommand = [Convert]::ToBase64String($bytes); echo $encodedCommand 
} 

Microsoft хотела бы умную обработку переменных, чтобы обеспечить большую совместимость между переменными и функциями. Я думаю, что это смутило при анализе вашей команды. Я попытался разбить цепочку строк, чтобы Powershell не предполагал, что строка представляет собой набор инструкций. Один оператор выше вызывает Powershell, присваивает пустую строку команде $, дважды объединяет строки, которые Powershell не может смутить, а затем выводит $ encodedCommand в конце. Это то, чем вы были?

+0

Здравствуйте, я пытаюсь выполнить весь код начального сообщения в одной команде.Becouse Я не могу сделать CreateProcess(), чтобы сделать, поэтому я подумал, что если я сделаю все, что в команде может прочитать ответ powershell с закодированной командой –

+0

Извините, @MattOlsen, возможно, я неправильно понял. Вы хотите [а.) Кодировать $ Командной строки в Base64String и вывод пользователя] [б.) Выполните три оператора в строке $ команды в Powershell] или [с.) Что-то еще.] –

+0

Ваша команда возвращает меня: Отсутствует замыкающая скобка '}' в инструкции блока. –

0

Хорошо, новый ответ, поскольку вопрос сильно изменился.

Попробуйте

#Encode Command 
$command = "(New-Object System.Net.WebClient).DownloadFile('http://localhost/update_program.exe','updater.exe'); Start-Process 'updater.exe'" 
$bytes = [Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
echo $encodedCommand 

#Execute command 
powershell.exe -EncodedCommand $encodedcommand 

Это должно работать так долго, как заявления в $command являются правильными.

Смежные вопросы