Кодировать / Декодировать.Exe в формат base64

у меня есть exe-файл .NET, который я хотел бы закодировать в строку Base-64, а затем в более поздний момент декодировать в a .exe-файл из строки Base64 с помощью Powershell.

что у меня до сих пор производит a .exe файл, однако, файл не распознается windows как приложение, которое может работать, и всегда имеет другую длину, чем файл, который я передаю в сценарий кодирования.

Я думаю, что я могу использовать неправильную кодировку здесь, но я не конечно.

кодировать скрипт:

Function Get-FileName($initialDirectory)
{   
 [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "All files (*.*)| *.*"
$OpenFileDialog.ShowDialog() | Out-Null
$FileName = $OpenFileDialog.filename
$FileName

} #end function Get-FileName

$FileName = Get-FileName

$Data = get-content $FileName
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Data)
$EncodedData = [Convert]::ToBase64String($Bytes)

Раскодировать Скрипт:

$Data = get-content $FileName
$Bytes = [System.Text.Encoding]::UTF8.GetBytes($Data)
$EncodedData = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($Bytes))

$EncodedData | Out-File ( $FileName )

2 ответов


проблема была вызвана:

  1. Get-Content без -raw разбивает файл на массив строк, тем самым уничтожая код
  2. Text.Encoding интерпретирует двоичный код как текст, тем самым уничтожая код
  3. Out-File для текстовых данных, а не двоичный код

правильный подход заключается в использовании ИО.Файл ReadAllBytes:

$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))

и WriteAllBytes для декодирования:

[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))

просто добавить альтернативу для людей, которые хотят сделать аналогичную задачу: Windows поставляется с certutil.exe (инструмент для управления сертификатами), который может кодировать и декодировать файлы base64.

certutil -encode test.exe test.txt
certutil -decode test.txt test.exe