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
问题是由以下原因引起的:
Get-Content不-raw将文件拆分成行数组,从而破坏代码Text.Encoding 将二进制代码解释为文本,从而破坏代码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)
这是 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 输出。
| 归档时间: |
|
| 查看次数: |
29099 次 |
| 最近记录: |