チョコ煮

チョコ煮

いろんな素材をチョコで煮ます

PowerShellスクリプトをBase64でエンコードしてバッチ化するスクリプトを作ってみた

長いタイトルですが、整理すると、

  1. PowerShellスクリプトBase64で難読化する
  2. 難読化したスクリプトにヘッダとフッタを付け、バッチファイルとする

という工程に分かれます。

何はともあれソースはこんな感じ。

$FileName = $Args[0]
$FilePath = (Split-Path $MyInvocation.MyCommand.Path -Parent) +"\"+  $FileName
$enc = [System.Text.Encoding]::GetEncoding("utf-16")

$PS += "@echo off`r`n"
$PS += "PowerShell -NoProfile -ExecutionPolicy Unrestricted -EncodedCommand "
$PS += [System.Convert]::ToBase64String($enc.GetBytes([System.IO.File]::ReadAllText($FilePath)))
$PS += "`r`n"
$PS += "pause"
$PS | Out-File -Encoding Default ($FileName + '.bat')
使用法
  1. 変換対象スクリプト(以下、hoge.ps1)はUnicode(UTF-16 LE)で保存しておく。
  2. 上記スクリプトを適当な名前(以下、"BatchMaker.ps1")で保存する。
  3. 変換対象スクリプトとBatchMaker.ps1を同じフォルダに置く。
  4. PowerShell(管理者権限)を開いてBatchMaker.ps1のあるフォルダまで移動する。
  5. 下記を入力。
> BatchMaker.ps1 hoge.ps1

スクリプトのあるフォルダにhoge.ps1.batが生成されます。

本当はShift-JISでやりたかったんですが、なんかうまくできなかった……(´・ω・`)

情報元はこちらとかこちらとか。

PowerShellスクリプトを読み込み不可能な形式に変換する [batch-file] | CODE Q&A [日本語]

PowerShell/PowerShellでBase64のエンコードとデコード - Windowsと暮らす

注意

情報元をご覧いただければわかりますが、Base64は容易にデコードできます。扱いにはくれぐれもご注意ください。自己責任でお願いいたします。

Windowsのバッチファイルは最大8191文字のため、変換できるスクリプトの長さもそれに準じた長さ(5000~6000文字程度)となります。あしからず。