1

エンコードされたプログラムが含まれるWindowsbatchスクリプトを作成したいと考えています。base64含まれているということは、エンコードされたプログラムが「ハードコード」されるということです。ファイルを1行ずつ書き込む「関数」(またはコードブロック)が必要です。

(Linuxに関連するこの質問のようにBashバイナリ実行可能ファイルを含むBashスクリプト

次の点に当てはまる場合、このようなことを行うための最良の方法は何ですか?

  • Windows にバンドルされているツールのみを使用したい (追加のライブラリ、実行可能ファイルなどは使用しない)
  • ファイルは単一である必要があります-base64エンコードされた文字列を任意の方法で含めることができます
  • 可能な限り高いパフォーマンスを実現したい

base64エンコードされた各行をエコー呼び出しに変換しようとしましたが、これは非常に遅いです。6000行のエコーには約10秒かかります(この方法で約10,000行のファイルを生成したい)。

これを行うためのより良い方法はありますか?おそらく、Windows に「ファイル スプリッター」があり、このバッチ スクリプトを分割して、何らかの行を「抽出」し (100 ~ 10100 行を抽出するなど)、それらを別のファイルに保存できますか?

現在使用されているファイル生成の一部は次のとおりです。

:getbin_Windows_x86
[...]
echo f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAsCVAAAAAAABAAAAAAAAAAEiGBQAAAAAAAAAAAEAAOAAK>>%INSTALLER_BASE_TMP%
echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>>%INSTALLER_BASE_TMP%
echo AAAMAAAAAAAAAFAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>>%INSTALLER_BASE_TMP%
[...]
GOTO:EOF

バッチファイルを使用してやりたいのですが、Power Shellより良い結果が得られる場合は、それに移動します。

4

3 に答える 3

2

.Net には便利な Convert クラスが含まれているため、バイナリ ファイルを Base64 に変換するのは簡単です。そのようです、

# Set up paths
$binSrcPath = "C:\Program Files (x86)\Notepad++\notepad++.exe"
$b64DstPath = "C:\temp\notepad++.exe.b64"

# Read the source binary as byte array
$binData = Get-Content -Path $binSrcPath -Encoding Byte

# Convert the bytes into a base64 encoded form
$base64 = [System.Convert]::ToBase64String($binData)

# Save the encoded data
set-content $b64DstPath $base64

エンコードされたバイナリが保存されたので、もう一度バイナリに変換しましょう。そのようです、

# Paths first
$b64DstPath = "C:\temp\notepad++.exe.b64"
$binDstPath = "C:\temp\notepad++.exe"

# Read the encoded data
$dataToBase64 = get-content $b64DstPath

# Decode the base64 encoding
$decodedData =  [System.Convert]::FromBase64String($base64)

# Save the decoded data as a byte, not text
set-content -Path $binDstPath -Value $decodedData -Encoding Byte

ファイルを cmd の fc.exe と比較すると、何も変わっていないことがわかります。

C:\>fc /b "C:\Program Files (x86)\Notepad++\notepad++.exe" "C:\temp\notepad++.exe"
Comparing files C:\PROGRAM FILES (X86)\NOTEPAD++\notepad++.exe and C:\TEMP\NOTEPAD++.EXE
FC: no differences encountered

Powershell スクリプトに base64 文字列を埋め込むには、データを別のファイルに保存することをお勧めします。これは、base64 データがかなりのスペースを必要とし、スクリプト ファイル自体が少し扱いに​​くくなるためです。埋め込みは、次のようにかなり簡単です。

# Declare a function that contains a bases64 string
function getB64Data {
    return "TVqAA..."
}

$binDstPath = "C:\temp\notepad++.exe"
# Read the base64 string into a variable
$dataToBase64 = getB64Data

# Decode the base64 encoding
$decodedData =  [System.Convert]::FromBase64String($base64)

# Save the decoded data as a byte, not text
set-content -Path $binDstPath -Value $decodedData -Encoding Byte
于 2013-08-24T07:39:44.943 に答える