将.EXE编码/解码为Base64

时间:2017-03-04 05:33:33

标签: powershell base64 encode binaryfiles

我有一个.NET exe文件,我想将其编码为Base-64字符串,然后在稍后使用Powershell从Base64字符串解码为.exe文件。

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

我想我可能在这里使用了错误的编码,但我不确定。

编码脚本:

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 )

3 个答案:

答案 0 :(得分:29)

问题是由以下原因造成的:

    没有Get-Content
  1. -raw将文件拆分为行数组,从而破坏代码
  2. Text.Encoding将二进制代码解释为文本,从而破坏代码
  3. Out-File用于文本数据,而不是二进制代码
  4. 正确的方法是使用IO.File ReadAllBytes

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

    WriteAllBytes解码:

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

答案 1 :(得分:15)

只是为那些希望执行类似任务的人添加一个替代方案:Windows附带certutil.exe(一种操纵证书的工具),可以对文件进行base64编码和解码。

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

答案 2 :(得分:3)

这是Swonkie答案的纯PowerShell版本,尽管您可以访问该实用程序,但效果很好,但不是PowerShell答案-这正是我所需要的。

$SourceFile    = "C:\Src\OriginalBinaryFile.dll"
$B64File       = "C:\Src\DllAsB64.txt"
$Reconstituted = "C:\Src\ReConstituted.dll"

[IO.File]::WriteAllBytes($B64File,[char[]][Convert]::ToBase64String([IO.File]::ReadAllBytes($SourceFile)))

[IO.File]::WriteAllBytes($Reconstituted, [Convert]::FromBase64String([char[]][IO.File]::ReadAllBytes($B64File)))

作为旁注。如果DllAsB64.txt是由certutil创建的,则将被这些行包装。

----- BEGIN证书-----

-----结束证书-----

删除这些行后,上面的PowerShell命令将对其进行解码。 Certutil会忽略它们,因此它将解码自己的输出或PowerShell输出。