编码/解码.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)
的问题所致:
-
Get-Content
没有-raw
拆分网络勒入从而破坏码 -
Text.Encoding
线的阵列解释二进制代码作为从而文本破坏码 -
Out-File
为文本数据,而不是二进制码
正确的做法是使用IO。文件ReadAllBytes:
$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($FileName))
和WriteAllBytes解码:
[IO.File]::WriteAllBytes($FileName, [Convert]::FromBase64String($base64string))
谢谢,这是有道理的。我会在今天尝试,并会报告结果。 – schizoid04
为了澄清,在转换之后,我仍然可以在上面引用的$ base64String上使用out-File? – schizoid04
这工作像魔术。谢谢你,先生那种:) – schizoid04
我想补充一个替代的人希望做一个类似的任务:Windows自带certutil.exe
(一个工具来操作证书),它可以使用Base64编码和解码文件。
certutil -encode test.exe test.txt
certutil -decode test.txt test.exe
那么,我假设,对于编码,它是[要编码的文件],然后[生成base64的文件]? (就语法而言,该命令?) – schizoid04
你知道这是哪个版本吗? (所有?)是否有可能不包含此工具的工作站(非服务器操作系统)的最新版本(7及更高版本)?该解决方案将由运行在最终用户工作站上的ITSM工具执行。 – schizoid04
我认为所有目前使用的Windows版本都有这个。但是,如果你想确定你自己的研究。 – Swonkie
你有没有考虑与编码和解码功能,需要一个字节流,检查是否可以编码一些像“你好”来回编写测试用例?另外,也许在Get-Content上你想通过-Raw开关。在IDE或VSCode中测试会让你看到变量和调试。 –