Понадобилось закодировать скрипт, но не ради обмана антивируса, а из-за нежелания возиться с экранированием символов при создании скрипта из батника. В итоге родилось вот такое чудо:
param ($CreateBatch=$False)
$CurrentDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location -Path $CurrentDir
if ($CreateBatch -eq $true) {
$ps_file_name=(Get-Item $PSCommandPath).Name
$cmd_file_name=((Get-Item $PSCommandPath).Basename+".bat")
$encoded_script=[Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes( $(Get-Content $ps_file_name -Raw)))
$content=("@echo off`r`n"+
"cd %~dp0`r`n"+
"powershell -Command [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('$encoded_script'))>$ps_file_name`r`n"+
"powershell -NoProfile -ExecutionPolicy Bypass -File $ps_file_name`r`n"+
"pause")
out-file -FilePath $CurrentDir\$cmd_file_name -InputObject $content -Encoding ASCII
exit
}
Данная заготовка добавляет параметр (добавьте его, если блок с параметрами уже есть) и проверяет его, если он истин, то выполняется создание батника с закодированным скриптом. Батник будет иметь такое же имя с расширением bat и лежать в этой же директории.
Именно Get-Content -Raw позволяет закодировать и раскодировать потом скрипт со всеми переносами строк. Если в скрипте нет обращений к файлам с неизвестным расположением, то можно выполнить скрипт без разворачивания в отдельный файл командой powershell -enc "закодированная строка".
Комментариев нет:
Отправить комментарий