J'ai un fichier exe .NET que j'aimerais encoder dans une chaîne Base-64, puis décoder ultérieurement dans un fichier .exe à partir de la chaîne Base64, en utilisant Powershell.
Ce que j'ai jusqu'à présent produit un fichier .exe, cependant, le fichier n'est pas reconnaissable par Windows comme une application qui peut s'exécuter, et est toujours d'une longueur différente de celle du fichier dans lequel je passe le script d'encodage.
Je pense que j'utilise peut-être le mauvais encodage ici, mais je ne suis pas sûr.
Script d'encodage:
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)
Décoder le script:
$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 )
Le problème a été causé par:
Get-Content
sans pour autant -raw
divise le fichier en un tableau de lignes détruisant ainsi le codeText.Encoding
interprète le code binaire comme du texte, détruisant ainsi le codeOut-File
est pour les données texte, pas pour le code binaireL'approche correcte consiste à utiliser IO.File ReadAllBytes :
$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))
et WriteAllBytes pour décoder:
[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))
Juste pour ajouter une alternative aux personnes souhaitant effectuer une tâche similaire: Windows est fourni avec certutil.exe
(un outil pour manipuler les certificats) qui peut encoder et décoder des fichiers en base64.
certutil -encode test.exe test.txt
certutil -decode test.txt test.exe