PowerShell難読化をだた試しながら読む(3) Binary Pulsarさんの記事
//
元記事はこちらなので皆さんはぜひこちらを読んでください。
PowerShell難読化の基礎 (3) – Binary Pulsar
コメントアウト挿入による難読化
前々回のものにコメントを挿入して難読化を計る
(((102, 111, 114, 101, 97, 99, 104, 40, 36, 105, 32, 105, 110, 32, 40, 49, 46, 46, 53, 41, 41, 123, 32, 87, 114, 105, 116, 101, 45, 72, 111, 115, 116, 32, 36, 105, 125) | %{ ([Int]$_ -as [char]) }) -Join '') | &($env:comspec[4,15,25] -Join '')
(((102, 111, <# #>114, 101, 97, <# ;abcsda #>99, 104, 40, 36, <#coffee#>105, <# caf3tr#D #>32, 105, 110, 32, 40, 49, 46, 46,<# hellorc #> 53, 41, 41, 123, 32, 87, 114, 105, 116, 101, 45, 72, <# 35u89ucad3j0n0 #>111, 115, 116, 32, 36, 105, 125) | %{ ([Int]$_ -as [char]) }) -Join<# TGc #> '') | &($env:comspec<# nuE349999999fasdfa53 #>[4,15,25] -Join '')
当然、意味のある文字列間にコメントを挟むことはできないのであくまで数字と数字の間など、語句の区切りに入れていく感じで。
Base64エンコードによる難読化
JSやPHPと同様にBase64を使用する手法がある。WindowsはUnicodeなのでUnicodeのバイト列に変換する必要がある。ここでASCIIのバイト列に直したりすると、実行時にエラーになる
PS > $com = "Get-Date -Format G" PS > $uniBytes = [System.Text.Encoding]::Unicode.GetBytes($com) PS > [System.Convert]::ToBase64String($uniBytes) RwBlAHQALQBEAGEAdABlACAALQBGAG8AcgBtAGEAdAAgAEcA PS > powershell.exe -enc RwBlAHQALQBEAGEAdABlACAALQBGAG8AcgBtAGEAdAAgAEcA 9/18/2018 23:06:20
スクリプトのBase64エンコードでの難読化
.ps1拡張子はpowershellのコマンドが詰まったスクリプトの拡張子らしい。test.ps1を作成して、これを難読化する。基本の流れは変わらない
PS C:\> Get-Content .\test.ps1 $namelist = @("John", "Alex", "Mike") ForEach($name in $namelist) { Write-Host ("Hello, " + $name + "!") } PS C:\> .\test.ps1 Hello, John! Hello, Alex! Hello, Mike! PS C:\> $filepath = "C:\test.ps1" PS C:\> $srctext = [System.IO.File]::ReadAllText($filepath) PS C:\> PS C:\> $uniBytes = [System.Text.Encoding]::Unicode.GetBytes($srctext) PS C:\> [System.Convert]::ToBase64String($uniBytes) JABuAGEAbQBlAGwAaQBzAHQAIAA9ACAAQAAoACIASgBvAGgAbgAiACwAIAAiAEEAbABlAHgAIgAsACAAIgBNAGkAawBlACIAKQANAAoAIAANAAoARgBvAHIARQBhAGMAaAAoACQAbgBhAG0AZQAgAGkAbgAgACQAbgBhAG0AZQBsAGkAcwB0ACkADQAKAHsADQAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACgAIgBIAGUAbABsAG8ALAAgACIAIAArACAAJABuAGEAbQBlACAAKwAgACIAIQAiACkADQAKAH0A PS C:\> powershell.exe -enc JABuAGEAbQBlAGwAaQBzAHQAIAA9ACAAQAAoACIASgBvAGgAbgAiACwAIAAiAEEAbABlAHgAIgAsACAAIgBNAGkAawBlACIAKQANAAoAIAANAAoARgBvAHIARQBhAGMAaAAoACQAbgBhAG0AZQAgAGkAbgAgACQAbgBhAG0AZQBsAGkAcwB0ACkADQAKAHsADQAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACgAIgBIAGUAbABsAG8ALAAgACIAIAArACAAJABuAGEAbQBlACAAKwAgACIAIQAiACkADQAKAH0A Hello, John! Hello, Alex! Hello, Mike!
windows10は初期設定でスクリプトが実行できないようになっているので、以下のコマンド→Yで解除できる。
Set-ExcutionPolicy RemoteSigned
上の逆の手順を踏むことで、エンコードされたスクリプトをデコードできる。メソッドの名前を見れば、逆のことをしているのがよくわかる。
PS C:\> $uniBytes = [System.Convert]::FromBase64String("エンコードされた文字") PS C:\> [System.Text.Encoding]::Unicode.GetString($uniBytes)