将.EXE编码/解码为Base64

sch*_*d04 19 powershell base64 encode binaryfiles

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

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

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

编码脚本:

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)
Run Code Online (Sandbox Code Playgroud)

解码脚本:

$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 )
Run Code Online (Sandbox Code Playgroud)

wOx*_*xOm 36

问题是由以下原因引起的:

  1. Get-Content-raw将文件拆分成行数组,从而破坏代码
  2. Text.Encoding 将二进制代码解释为文本,从而破坏代码
  3. Out-File 用于文本数据,而不是二进制代码

正确的方法是使用IO.File ReadAllBytes:

$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))
Run Code Online (Sandbox Code Playgroud)

WriteAllBytes解码:

[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))
Run Code Online (Sandbox Code Playgroud)


Swo*_*kie 18

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

certutil -encode test.exe test.txt
certutil -decode test.txt test.exe
Run Code Online (Sandbox Code Playgroud)

  • 我认为所有目前使用的Windows版本都有这个.但如果你想确定,请做自己的研究. (2认同)

bie*_*ski 8

这是 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)))
Run Code Online (Sandbox Code Playgroud)

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

-----开始认证-----

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

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

  • 人们会被问题标题而不是OP的问题所吸引。wOxxOm 的答案对OP有帮助,但没有提供一个完整的工作解决方案,因为标题而来到这里,可以简单地抓住并运行。有人可能会说 CertUtil 的答案甚至不属于这里,但它是对标题问题的一个很好的答案,尽管忽略了 OP 存在的根本问题。对于那些对 OP 代码中的问题细节不感兴趣的人来说,我想要一个基于 PowerShell 的答案,该答案与 certutil 答案一样清晰和简洁。 (4认同)
  • 这与接受的答案(wOxxOm)有什么不同? (2认同)