PowerShellスクリプトをBase64でエンコードしてバッチ化するスクリプトを作ってみた
長いタイトルですが、整理すると、
- PowerShellスクリプトをBase64で難読化する
- 難読化したスクリプトにヘッダとフッタを付け、バッチファイルとする
という工程に分かれます。
何はともあれソースはこんな感じ。
$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')
使用法
- 変換対象スクリプト(以下、hoge.ps1)はUnicode(UTF-16 LE)で保存しておく。
- 上記スクリプトを適当な名前(以下、"BatchMaker.ps1")で保存する。
- 変換対象スクリプトとBatchMaker.ps1を同じフォルダに置く。
- PowerShell(管理者権限)を開いてBatchMaker.ps1のあるフォルダまで移動する。
- 下記を入力。
> BatchMaker.ps1 hoge.ps1
スクリプトのあるフォルダにhoge.ps1.batが生成されます。
本当はShift-JISでやりたかったんですが、なんかうまくできなかった……(´・ω・`)
情報元はこちらとかこちらとか。
PowerShellスクリプトを読み込み不可能な形式に変換する [batch-file] | CODE Q&A [日本語]
PowerShell/PowerShellでBase64のエンコードとデコード - Windowsと暮らす
注意
情報元をご覧いただければわかりますが、Base64は容易にデコードできます。扱いにはくれぐれもご注意ください。自己責任でお願いいたします。
Windowsのバッチファイルは最大8191文字のため、変換できるスクリプトの長さもそれに準じた長さ(5000~6000文字程度)となります。あしからず。