セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

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を使用する手法がある。WindowsUnicodeなので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)