Home >
Windows にまつわる e.t.c.
PowerShell で VirusTotal の Web API を使ったファイルの安全性を確認する
GUI ベースの確認方法は以前書きましたが、この方法だと複数ファイルの確認をするのがなかなか手間です。
ファイルがウイルスか確認する
http://www.vwnet.jp/Windows/PowerShell/2016071501/CheckVirusFile.htm
こいつを VirusTotal の Web API を使って、より簡単にファイルの安全性を確認する方法を紹介します。
Web API についての簡単な説明は Web API ってなに? を見てください。
ファイルの安全性の確認は、ファイルのハッシュ値(SHA256)を VirusTotal の Web API
に投げて確認します。
VirusTotal の Web API を使う場合は、API Key が必要ですので、前準備として API Key
を取得します。
API Key は VirusTotal のコミュニティへ参加すれば取得できます。
このキーは Public API Key なので、問い合わせは
4回/分に限定されていますが、通常の利用では問題ないので、この API Key を使います。
PowerShell で Web API を叩く
PowerShell で Web API を叩く場合は、Invoke-RestMethod コマンドレットを使います。
# SHA256 ファイルハッシュ値
$hash = "File Hash"
# 取得した API Key
$ApiKey = "Your API Key"
# Web API の URL
$url = "https://www.virustotal.com/vtapi/v2/file/report"
# Invoke-RestMethod に渡す Web API の引数を連想配列にする
$body = @{
resource = $hash
apikey = $ApiKey
}
# API を叩く
$Report = Invoke-RestMethod -Method Post -Uri $url -Body $body
echo $Report
|
これを実行すると、チェック結果がオブジェクトして $Report に格納されます。
関数にする
一連の定型処理なので、関数にしちゃいましょう。
############################################################
# ファイルのフルパスを渡してファイルの安全性を確認する
############################################################
function GetVirustotal($FileName){
# ファイルの有無確認
if( -not (Test-Path $FileName)){
echo "$FileName not found."
exit
}
# 取得した VirusTotal API Key
$ApiKey = "Your API Key"
# Web API 引数
$hash = (Get-FileHash -Algorithm SHA256 $FileName).Hash
$url = "https://www.virustotal.com/vtapi/v2/file/report"
# 引数を連想配列にする
$body = @{ resource = $hash; apikey = $ApiKey }
# Web API を叩く
$Report = Invoke-RestMethod -Method Post -Uri $url -Body $body
# DB に存在するかの確認
if( $Report.response_code -eq 0 ){
echo "This file is not found in DB."
}
else{
# DB に存在していたので、エンジンごとの検出状態を確認
$Scans = $Report.scans
$Engines = $Report.scans | Get-Member -type NoteProperty
$FoundStatsus = @()
$NotFoundStatus = @()
foreach( $Engine in $Engines ){
if($Engine.Definition -match "detected=(?<detected>.*?); version=(?<version>.*?); result=(?<result>.*?)"){
# ヒットしたエンジン
if($Matches.detected -eq "True") {
$FoundStatsus += "{0}({1}) - {2}" -f $Engine.Name, $Matches.version, $Matches.result
}
# ヒットしなかったエンジン
else{
$NotFoundStatus += "{0} not hit." -f $Engine.Name
}
}
}
echo $FoundStatsus
echo $NotFoundStatus
echo ""
$EngineTotal = $Report.total
$HitEngine = $Report.positives
echo "Hit engine : $HitEngine/$EngineTotal"
$SHA256 = $Report.sha256
echo "sha256 : $SHA256"
$Permalink = $Report.permalink
echo "Permalink :"
echo "$Permalink"
}
}
|
これでファイルのフルパスを関数に渡すだけで VirusTotal の確認ができます。
Web API とは、Web サイトが提供しているアプリケーション インターフェイスです。
API 引数は、URL の末尾に ?キー=値&キー=値... を指定します。
Web API の使用例
http://www.hogehoge.com/webapi?key=abcde&id=abc0123&data=zzzzz
こんな感じの URL でリクエストすると、結果が JSON 形式で帰ってきます
GET メソッドが使える Web API であれば Web ブラウザでも動作確認できるので、一度 Web ブラウザで試してみると感覚がつかめると思います。
戻り値の JSON
形式は人がパッと見て内容を理解するのには向きませんが、様々なプラットフォームでパースがサポートされており、PowerShell
でもパース出来るので都合が良い形式です。
JSON の仕様を知りたい場合は、こちらを参考にしてください。
JSON
http://www.json.org/json-ja.html
関連情報
関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm
Copyright © MURA
All rights reserved.