编码/解码.EXE为Base64编码

问题描述:

我有,我想编码为Base64字符串,然后在以后解码到从Base64编码字符串中的.exe文件.NET程序exe文件,使用PowerShell 。编码/解码.EXE为Base64编码

我到目前为止的内容会生成一个.exe文件,但是,该文件作为可运行的应用程序无法识别,并且与我传入的文件长度不同编码脚本。

我想我可以在这里使用了错误的编码,但我不知道。

编码脚本:

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) 
+1

你有没有考虑与编码和解码功能,需要一个字节流,检查是否可以编码一些像“你好”来回编写测试用例?另外,也许在Get-Content上你想通过-Raw开关。在IDE或VSCode中测试会让你看到变量和调试。 –

的问题所致:

  1. Get-Content没有-raw拆分网络勒入从而破坏码
  2. Text.Encoding线的阵列解释二进制代码作为从而文本破坏码
  3. Out-File为文本数据,而不是二进制码

正确的做法是使用IO。文件ReadAllBytes

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

WriteAllBytes解码:

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

谢谢,这是有道理的。我会在今天尝试,并会报告结果。 – schizoid04

+0

为了澄清,在转换之后,我仍然可以在上面引用的$ base64String上使用out-File? – schizoid04

+0

这工作像魔术。谢谢你,先生那种:) – schizoid04

我想补充一个替代的人希望做一个类似的任务:Windows自带certutil.exe(一个工具来操作证书),它可以使用Base64编码和解码文件。

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

那么,我假设,对于编码,它是[要编码的文件],然后[生成base64的文件]? (就语法而言,该命令?) – schizoid04

+0

你知道这是哪个版本吗? (所有?)是否有可能不包含此工具的工作站(非服务器操作系统)的最新版本(7及更高版本)?该解决方案将由运行在最终用户工作站上的ITSM工具执行。 – schizoid04

+0

我认为所有目前使用的Windows版本都有这个。但是,如果你想确定你自己的研究。 – Swonkie