2017-03-04 262 views
6

我有,我想編碼爲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) 
+1

你有沒有考慮與編碼和解碼功能,需要一個字節流,檢查是否可以編碼一些像「你好」來回編寫測試用例?另外,也許在Get-Content上你想通過-Raw開關。在IDE或VSCode中測試會讓你看到變量和調試。 –

回答

14

的問題所致:

  1. Get-Content沒有-raw拆分網絡勒入從而破壞碼
  2. Text.Encoding線的陣列解釋二進制代碼作爲從而文本破壞碼
  3. Out-File爲文本數據,而不是二進制碼

正確的做法是使用IO。文件ReadAllBytes

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

WriteAllBytes解碼:

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

謝謝,這是有道理的。我會在今天嘗試,並會報告結果。 – schizoid04

+0

爲了澄清,在轉換之後,我仍然可以在上面引用的$ base64String上使用out-File? – schizoid04

+0

這工作像魔術。謝謝你,先生那種:) – schizoid04

7

我想補充一個替代的人希望做一個類似的任務:Windows自帶certutil.exe(一個工具來操作證書),它可以使用Base64編碼和解碼文件。

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

那麼,我假設,對於編碼,它是[要編碼的文件],然後[生成base64的文件]? (就語法而言,該命令?) – schizoid04

+0

你知道這是哪個版本嗎? (所有?)是否有可能不包含此工具的工作站(非服務器操作系統)的最新版本(7及更高版本)?該解決方案將由運行在最終用戶工作站上的ITSM工具執行。 – schizoid04

+0

我認爲所有目前使用的Windows版本都有這個。但是,如果你想確定你自己的研究。 – Swonkie