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 とは、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

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.