web-dev-qa-db-fra.com

Encoder / Décoder .EXE en Base64

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 )
17
schizoid04

Le problème a été causé par:

  1. Get-Content sans pour autant -raw divise le fichier en un tableau de lignes détruisant ainsi le code
  2. Text.Encoding interprète le code binaire comme du texte, détruisant ainsi le code
  3. Out-File est pour les données texte, pas pour le code binaire

L'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))
34
wOxxOm

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
17
Swonkie