Кодировать / Декодировать.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 ответов
проблема была вызвана:
-
Get-Content
без-raw
разбивает файл на массив строк, тем самым уничтожая код -
Text.Encoding
интерпретирует двоичный код как текст, тем самым уничтожая код -
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