programing

인코딩 / 디코딩.EXE를 베이스64로

shortcode 2023. 9. 20. 21:08
반응형

인코딩 / 디코딩.EXE를 베이스64로

저는.NETexe 파일을 Base-64 문자열로 인코딩한 다음 나중에 Powershell을 사용하여 Base64 문자열에서 .exe 파일로 디코딩합니다.

지금까지 .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파일을 줄 배열로 분할하여 코드를 파괴합니다.
  2. Text.Encoding이진 코드를 텍스트로 해석하여 코드를 파괴합니다.
  3. Out-File이진 코드가 아닌 텍스트 데이터용입니다.

올바른 접근법은 IO를 사용하는 것입니다.파일 읽기모든 바이트:

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

해독할 모든 바이트 기록:

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

비슷한 일을 하고 싶어하는 사람들을 위해 대안을 추가하는 것입니다.윈도우는 다음과 함께 제공됩니다.certutil.exe(인증서를 조작하는 도구) 파일을 64로 인코딩하고 디코딩할 수 있습니다.

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

이것은 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를 특정 줄로 만든 경우 이 줄로 래핑됩니다.

------- 인증서 시작-------

-----------------------------

위의 PowerShell 명령은 이러한 라인을 제거한 후 디코딩합니다.Certutil은 이들을 무시하므로 자체 출력 또는 PowerShell 출력을 디코딩합니다.

언급URL : https://stackoverflow.com/questions/42592518/encode-decode-exe-into-base64

반응형