将 .EXE 编码/解码为 Base64
Posted
技术标签:
【中文标题】将 .EXE 编码/解码为 Base64【英文标题】:Encode / Decode .EXE into Base64 【发布时间】:2017-07-24 08:50:50 【问题描述】:我有一个 .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 )
【问题讨论】:
【参考方案1】:问题是由以下原因引起的:
Get-Content
没有 -raw
会将文件拆分为行数组,从而破坏代码
Text.Encoding
将二进制代码解释为文本,从而破坏代码
Out-File
是文本数据,不是二进制代码
正确的做法是使用 IO.File ReadAllBytes:
$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))
和WriteAllBytes 解码:
[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))
【讨论】:
谢谢,这是有道理的。我今天会试试这个,然后报告结果。 澄清一下,在转换后,我还可以在上面引用的 $base64String 上使用 out-File 吗? @schizoid04,是的,$base64String 是纯 ASCII 文本,因此您可以使用标准的基于文本的命令。 如果您想将其用作方便的单线,请快速注意。我试图使用相对文件名(我已经 cd'd 到我的桌面),但子命令ReadAllBytes(.\file.png)
期望“file.png”在 %userprofile% 中。
我知道我有偏见,使用 C#,但这不应该不工作吗?我认为加载、转换然后将其保存为exe
会再次破坏它......?还是这是其他方法?【参考方案2】:
只是为希望执行类似任务的人添加一个替代方案:Windows 附带 certutil.exe
(一种操作证书的工具),它可以对文件进行 base64 编码和解码。
certutil -encode test.exe test.txt
certutil -decode test.txt test.exe
【讨论】:
那么,我假设,对于编码,它是 [要编码的文件],然后是 [生成 base64 的文件]? (就该命令的语法而言?) 你知道它有哪些版本吗? (全部?)工作站(非服务器操作系统)是否有任何可能不包含此工具的最新版本(7 及更高版本)?该解决方案将由在最终用户工作站上运行的 ITSM 工具执行。 我认为所有当前使用的 Windows 版本都有这个。但如果您想确定,请自行研究。 我相信certutil.exe
可以追溯到 Windows 2000,尽管从那时起它经历了一些变化。【参考方案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 创建的,它将被这些行包裹。
-----开始证书-----
-----结束证书-----
删除这些行后,上面的 PowerShell 命令将对其进行解码。 Certutil 会忽略它们,因此它将解码自己的输出或 PowerShell 输出。
【讨论】:
这与接受的答案(由 wOxxOm 提供)有何不同? 人们会被问题标题而不是OP的问题所吸引。 wOxxOm 的回答对 OP 有帮助,但没有提供一个完整的工作解决方案,由于标题而来到这里,可以简单地抓取和运行。有人可能会争辩说 CertUtil 答案甚至不属于这里,但它是对标题问题的一个很好的答案,尽管忽略了 OP 的潜在问题。对于那些对 OP 代码中的问题细节不感兴趣的人,我想要一个基于 PowerShell 的答案,它与 certutil 答案一样清晰简洁。以上是关于将 .EXE 编码/解码为 Base64的主要内容,如果未能解决你的问题,请参考以下文章
使用 base 64 编码的 javax.mail.Authenticator