
PowerShellスクリプトのソースコード難読化と仮想化を、Python用の柔軟なWeb API(pipパッケージ)で自動化します。
PowerShell Pro Obfuscator は、プロプライエタリな .ps1 スクリプトを、リネーム、ポリモーフィックな文字列・整数暗号化、制御フロー平坦化、有限状態オートマトン(FSA)、VMエンジン、自己防御型の整合性チェック、保護リンカー、アンチデバッグプローブで保護します。
ポリモーフィックな文字列暗号化、VMエンジン、有限状態オートマトン変換、自己整合性・アンチデバッグチェックにより、PowerShell .ps1 スクリプトを難読化・仮想化・保護します — GUI、CLI、オンラインツール、またはAPI経由で利用可能です。
詳細な技術情報、ダウンロード、ドキュメントは以下で入手できます:
https://www.pelock.com/products/powershell-pro-obfuscator

Windows と Linux で利用可能です:
複数のプログラミングAPIが利用可能です:
オンライン難読化インターフェース:
スクリプトは通常、プレーンな .ps1 ファイルとして配布されるか、モジュールに埋め込まれます。その利便性の一方で、ファイルにアクセスできる人は誰でも完全なロジックを読み、文字列から認証情報やAPIキーを探し出し、意図を隠すための追加の対策を講じない限り、アルゴリズムを盗むことができます。
PowerShell は、.NET 上に構築されたクロスプラットフォームのシェルおよびスクリプト言語です。Windows と Linux での自動化、構成管理、DevOpsパイプライン、エンドポイント管理に広く使用されています。
PowerShell Pro Obfuscator には、多くの高度な難読化・仮想化・保護戦略が搭載されています。保護とサイズ・パフォーマンスのバランスを簡単に調整できます。

強力な難読化PowerShell Pro Obfuscator は、ポリモーフィックな文字列暗号化、整数・浮動小数点数の暗号化、デコイノイズなどの最先端の難読化戦略を使用します。その結果、テスト済みの実行時動作を維持しながら、リテラルと構造を隠蔽します。
コード仮想化選択されたステートメントは、シャッフルされたスイッチケース、デコイオペコード、難読化されたディスパッチャループを備えた、ランダムに生成されたVMエンジンのオペコードにリフトされます。解析者はプレーンなPowerShellを読む代わりに、仮想マシンを解釈する必要があります。
有限状態オートマトン(FSA)有限状態オートマトン(FSA)難読化は、線形のPowerShellステートメントブロックを、不透明なスケジューラとシャッフルされたディスパッチハンドラを備えた二重状態オートマトンに書き換えます。解析者はコードを上から下へ読む代わりに、数値状態、遷移テーブル、デコイパスを追跡して元の順序を再構築する必要があります。
アンチデバッグアンチデバッグ保護は、接続されたデバッガ、PowerShellブレークポイント、デバッグ設定とトレースモード、および関連するホストシグナルを検出するポリモーフィックなプローブを挿入します。チェックが発動すると、難読化されたスクリプトは、対話的な解析下で保護されたロジックを明かす代わりに、静かに終了します。
自己整合性チェックブートストラッププローブは、ディスク上のスクリプト形状(関数数と整合性トークン)を検証し、ファイルが難読化されたビルドと一致しなくなったときに改ざんキーを設定します。文字列復号器はそのキーを消費するため、パッチ適用されたスクリプトは平文の代わりにガベージを返します。この自己防御層は、カジュアルな逆難読化とファイル編集のコストを引き上げます。
保護リンカー後期パスでは、ハニーポットリゾルバ、ランダムな引数を持つ偽のヘルパー呼び出し、ブートストラップ完了前のみアクティブな浅いスタックのトリップワイヤを配線します。抽出されたスニペットは、静的レビューで本物に見えるノイズの多い呼び出しサーフェスを維持します。整合性チェック成功後の通常の実行は変更されません。
この例を見てください — 同じスクリプトが難読化後は一目で読みにくくなります。
function Get-Greeting {
param([string]$Name)
Write-Host "Hello World from $Name!"
}
Get-Greeting "PowerShell Pro Obfuscator"
$script:_HnJTskg = 0
$jwNTQ = 297 * 400 + 36
$x4e8bfda = [Math]::Abs($jwNTQ - 8074)
$_EvKocNn = [Math]::Max($jwNTQ, $x4e8bfda) - [Math]::Min($jwNTQ, $x4e8bfda)
[void]$_EvKocNn
$script:_jUoXkBYh = 0
function gnJjzMCN3V8P {
param([int]$slot, [int]$salt, [int]$guard)
if (-not ((Get-Variable -Name _HnJTskg -Scope Script -ErrorAction SilentlyContinue).Value)) { return '' }
@('JFE', 'm0ao', 'R8Ysw') | ForEach-Object { $_.ToUpper() } | Out-Null
if ((((($slot * 31) + $salt) -band 65535) -ne $guard)) { return '' }
$tk = (Get-Variable -Name _jUoXkBYh -Scope Script -ErrorAction SilentlyContinue).Value
$IEm39CSpDOEFp = @{ 'Ouj1' = 455; 'vjzO' = 170; 'IQNV' = 291 }
$IEm39CSpDOEFp['R5LrM'] = $IEm39CSpDOEFp['Ouj1'] + $IEm39CSpDOEFp['vjzO']
$YWxSO = ($IEm39CSpDOEFp.Values | Measure-Object -Sum).Sum
[void]$YWxSO
if ($null -eq $tk) { [long]$tk = 0 }
$v93a130f2e4 = 508
switch ($v93a130f2e4) {
524 { $_GYF7IA14Go = 'H1Vph' }
561 { $_GYF7IA14Go = 'HAWoB' }
default { $_GYF7IA14Go = $v93a130f2e4 * 2 }
}
[void]$_GYF7IA14Go
$dk = (Get-Variable -Name vb6a18ffee4 -Scope Script -ErrorAction SilentlyContinue).Value
try { $xgLN5KZyEusFo7 = [Math]::Sqrt(850) } finally { [void]$xgLN5KZyEusFo7 }
if ($null -eq $dk) { [long]$dk = 0 }
$d = @(46866, 46865)
if ((((-not 113))-and(([int](272 -ne 272) -eq 21)))-and(([Math]::Sign(-12) -eq 4))) { $w4iTzi2hooy1GW = @(711, 562, 665); $w4iTzi2hooy1GW = ($w4iTzi2hooy1GW | Measure-Object -Sum).Sum }
$r = ''
for ($s9qOSpiZzufQlVyV = 0; $s9qOSpiZzufQlVyV -lt $d.Length; $s9qOSpiZzufQlVyV++) {
[long]$v = [long]$d[$s9qOSpiZzufQlVyV]
for ($jL9gL7PEtQeIS = 2; $jL9gL7PEtQeIS -ge 0; $jL9gL7PEtQeIS--) {
for ($PsbomDHxAy = 2; $PsbomDHxAy -ge 0; $PsbomDHxAy--) {
[long]$v = [long]$v + ([long](https://github.com/pelock/powershell-pro-obfuscator-python/blob/main/230))
}
}
for ($zhH33vzxjIzegl9 = 0; $zhH33vzxjIzegl9 -ge 0; $zhH33vzxjIzegl9--) {
[long]$v = [long]$v + ([long]([int]((((((236 + (-3 * $s9qOSpiZzufQlVyV) + (3 * $zhH33vzxjIzegl9))) % 256) + 256) % 256))))
[long]$v = [long]$v -bxor ([long](https://github.com/pelock/powershell-pro-obfuscator-python/blob/main/53766))
}
[long]$v = [long]$v - ([long]($salt + $slot + $tk + $dk + 0))
if ([long]$v -ge 0 -and [long]$v -le 0xFFFF) { $r += [char][int][long]$v }
elseif ([long]$v -ge 0x10000 -and [long]$v -le 0x10FFFF) { $r += [System.Char]::ConvertFromUtf32([int][long]$v) }
}
return $r
}
and more...
難読化されたテキストだけを見て、元のスクリプトのコピーがなければ、元の意図を認識できるでしょうか?

エンジンはPowerShellソースをASTツリーに解析し、選択可能な変換を適用します:識別子のリネーム、制御フロー平坦化、有限状態オートマトン(FSA)、VM仮想化、ポリモーフィックな文字列・整数暗号化、ノイズとデコイの挿入、自己防御型の整合性プローブ、保護リンカー、アンチデバッグチェック。多くの技術はこの製品に固有のものであり、一部のアイデアは当社の他の保護ツールと共有されています。

すべてのパスが完了すると、エンジンは新しい .ps1 を出力します。PowerShellの文法とホスティング環境のエッジケースがあるため、ターゲットの実行環境で出力を常にテストする必要があります。
リスクを冒さず、PowerShell Pro Obfuscator を使用してPowerShellスクリプトとアルゴリズムを難読化・仮想化・保護してください。
当社は難読化技術とコード難読化ツールの長い歴史を持っています(x86 Assembly、AutoIt、Java 難読化ツールを参照)。