EmocheckのログをPowerShellで確認する
感染の拡大や縮小を繰り返しながら長期間活動しているEmotetというマルウェアがあります。
JPCERT/CCはこのEmotetに感染しているかどうかを確認するための簡易ツールであるEmocheckを公開しています。
以前、Active Directoryのグループポリシーを使ってEmocheckを自動実行してログの結果を出力する方法について記事を作成しましたが、今回はその延長としてログの結果をPowerShellで簡単に確認できるようにしてみます。
Emocheckの出力するログ(JSON形式)

Emocheckは/jsonオプションをつけることでJSON形式でログを出力します。JSON形式で出力された大量のログファイルの中に”is_infectedがnoではないログがあるかどうか”を出力するPowerShellスクリプトを作成します。

今回はEmocheck V2.4、Windows 11 Pro 22H2の環境にて検証しました。
PowerShellでログの結果を確認するコード
$logs = Get-ChildItem -Path "\\fileserver\emocheck\logs" -Filter *.json #使用する際は環境に合わせてパスを変更してください。
$isInfect = $false
$count = 0
foreach ($log in $logs) {
$content = Get-Content $log.FullName | ConvertFrom-Json
if ($content.is_infected -ne "no") {
Write-Host "$($log.Name) is infected."
Write-Host "hostname:$($content.hostname)"
Write-Host "process_name:$($content.emotet_processes.process_name)"
$isInfect = $true
}
$count += 1
}
if($isInfect){
Write-Host "Detect infect."
}else{
Write-Host "No infected log"
}
Write-Host "$($count) json log files checked."
コードの解説
Get-ChildItemで特定フォルダのJSONファイルのみを$logsオブジェクトに格納します。そのため、同じフォルダにはEmocheckのログ以外のJSONファイルを置かないように気を付けてください。
子フォルダまで検索の範囲を広げる場合は-Recurseオプションを追加してください。
foreachの中で$logsに格納されたオブジェクトを1つずつJSONからPowerShellオブジェクトに変換して$contentに格納します。
あとはis_infected属性が”no”かどうかを評価して、noではないなら$isInfectのBool値がtrueに置き換わります。
同時にログに記録されているhostnameやprocess_nameも画面に出力します。
最後に$isInfectのbool値を評価して結果の出力とチェックしたログの件数を出力します。
上記のスクリプトをps1ファイルとして保存することで、いつでも簡単にEmocheckのログを調査することができます。
※ps1ファイルの実行は事前にPowerShellスクリプト実行ポリシーをRemoteSignedにしておくか、バッチファイルからps1ファイルを実行する必要があるためご注意。