Encodage / Décodage .EXE en Base64
J'ai un .NET fichier exe que j'aimerais coder en Base-64 string, et puis à un moment plus tard décoder en un .exe fichier à partir de la Base64 de la chaîne, à l'aide de Powershell.
Ce que j'ai jusqu'à présent produit une .exe fichier, cependant, le fichier n'est pas reconnaissable par windows comme une application qui peut fonctionner, et est toujours une longueur différente que le fichier que je suis de passage dans l'encodage du script.
Je pense que j'ai peut-être l'aide d'un mauvais encodage, mais je ne suis pas sûr.
Coder un script:
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 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 )
Avez-vous envisagé d'écrire un scénario de test avec un de coder et de décoder fonction qui prend un flux d'octets pour vérifier si vous pouvez coder quelque chose comme "bonjour" d'avant en arrière? Aussi, peut-être sur Get-Content que vous souhaitez passer Brute de l'interrupteur. Les essais dans l'IDE ou VSCode vous permettra de voir les variables et de débogage.
OriginalL'auteur schizoid04 | 2017-03-04
Vous devez vous connecter pour publier un commentaire.
Le problème a été causé par:
Get-Content
sans-raw
divise le fichier dans un tableau de lignes détruisant ainsi le codeText.Encoding
interprète le code binaire en tant que texte détruisant ainsi le codeOut-File
est des données de texte, pas de code binaireL'approche correcte consiste à utiliser IO.Fichier ReadAllBytes:
et WriteAllBytes à décoder:
Juste pour clarifier, puis-je toujours utiliser le Fichier sur le $base64String que vous l'avez mentionné ci-dessus, après avoir été converti?
Cela a fonctionné comme par magie. Merci, gentil monsieur 🙂
ouais, $base64String est un format de texte ASCII, donc vous pouvez utiliser le texte standard-commandes.
Note rapide si vous essayez de l'utiliser comme une pratique one-liner. J'ai essayé d'utiliser le nom de fichier relatif (j'étais déjà cd avais sur mon bureau) mais la sous-commande
ReadAllBytes(.\file.png)
m'attendais à de fichier".png" %userprofile%.OriginalL'auteur wOxxOm
Il suffit d'ajouter une alternative pour les personnes qui cherchent à faire une tâche similaire: Windows est livré avec
certutil.exe
(un outil pour manipuler les certificats) qui peut base64 de coder et de décoder des fichiers.Connaissez-vous les versions, ce qui vient avec? (Tous?) Existe-il des versions récentes (7 et plus) pour les postes de travail (non-système d'exploitation serveur) qui ne contiennent pas de cet outil? La solution sera exécutée par un outil ITSM exécuter sur la fin des usagers de la station de travail.
Je pense que tous actuellement utilisé les versions de Windows. Mais faire vos propres recherches si vous voulez être sûr.
OriginalL'auteur Swonkie