使ってみる
「Public API」でできるいくつかの機能を確認してみます。
プログラムの基本的な流れは、以下の通りです。
- APIキー使ってVirusTotalに接続
- ファイル、URL、ドメインといった調査対象となるオブジェクトの作成と結果取得
- 結果を表示
「vt-py」の簡単な使い方は、「クイックスタート」に載っていますが、凝った使い方をする場合は「APIのドキュメント」読んだり、ソースコード調べたりする必要がありそうです。
「vt-py」は事前にpipでインストールします。
> pip install vt-py
ファイル情報をVTから取得する
ファイルのハッシュ値(MD5, SHA-1, SHA-256)を基にVTから情報が取得できます。
取得できる情報はAPIのドキュメント「Files」に記載があります。
プログラム
EICARファイルの直近のスキャン時間とスキャン結果を取得してみます。
※「3395856ce81f2b7382dee72602f798b642f14140」はEICARファイルのSHA-1です。
import vt
apikey = "<apikey>"
filehash = "3395856ce81f2b7382dee72602f798b642f14140"
client = vt.Client(apikey)
file = client.get_object("/files/{}", filehash)
client.close()
print(file.get("last_analysis_date"))
print(file.get("last_analysis_stats"))
fileオブジェクトの情報は「vars(file)」や「dir(file)」で見ることができます。
実行結果
>>> print(file.get("last_analysis_date"))
1622838165
>>> print(file.get("last_analysis_stats"))
{'harmless': 0, 'type-unsupported': 9, 'suspicious': 0, 'confirmed-timeout': 0, 'timeout': 0, 'failure': 0, 'malicious': 61, 'undetected': 5}
ファイルをスキャンする
ファイルを送信してスキャンします。
取得できる情報はAPIのドキュメント「Analyses」に記載があります。
プログラム
試しにWindows10の計算機(calc.exe)を送信してみます。
import vt
apikey = "<apikey>"
filepath = "C:\Windows\System32\calc.exe"
client = vt.Client(apikey)
with open(filepath, "rb") as f:
analysis = client.scan_file(f)
while True:
analysis = client.get_object("/analyses/{}", analysis.id)
print(analysis.status)
if analysis.status == "completed":
break
time.sleep(30)
client.close()
print(analysis.get("_id"))
print(analysis.get("date"))
print(analysis.get("stats"))
実行結果
>>> print(analysis.get("_id"))
Zjg4Y2MwNTEzNGM1NTVkNGUxY2QxZGVmNzgxNjJhOWE6MTYyMjkwNzAzMg==
>>> print(analysis.get("date"))
1622907032
>>> print(analysis.get("stats"))
{'harmless': 0, 'type-unsupported': 5, 'suspicious': 0, 'confirmed-timeout': 0, 'timeout': 0, 'failure': 0, 'malicious': 0, 'undetected': 69}
URL情報をVTから取得する
import vt
apikey = "<api key>"
url = "https://google.co.jp"
client = vt.Client(apikey)
url_id = vt.url_id(url)
url = client.get_object("/urls/{}", url_id)
client.close()
print(url.get("categories"))
print(url.get("last_analysis_date"))
print(url.get("last_analysis_stats"))
URL をスキャンする
プログラム
import vt
apikey = "<apikey>"
url = "https://google.co.jp"
client = vt.Client(apikey)
analysis = client.scan_url(url)
while True:
analysis = client.get_object("/analyses/{}", analysis.id)
print(analysis.status)
if analysis.status == "completed":
break
time.sleep(30)
client.close()
print(analysis.get("_id"))
print(analysis.get("date"))
print(analysis.get("stats"))
実行結果
>>> print(analysis.get("_id"))
u-7f7c5306ba7987cb80bedf158c4c092aa5c2d21599ec0fcda2c382289623408b-1622924400
>>> print(analysis.get("date"))
1622924400
>>> print(analysis.get("stats"))
{'harmless': 80, 'malicious': 0, 'suspicious': 0, 'undetected': 8, 'timeout': 0}
ドメイン情報をVTから取得
ドメインに関する情報をVTから取得できます。
取得できる情報はAPIのドキュメントに記載があります。
プログラム
「yahoo.co.jp」について取得してみます。
import vt
apikey = "<apikey>"
domain = "yahoo.co.jp"
client = vt.Client(apikey)
file = client.get_object("/domains/{}", domain)
client.close()
print(file.get("categories"))
print(file.get("last_analysis_stats"))
print(file.get("whois"))
実行結果
>>> print(file.get("categories"))
{'Forcepoint ThreatSeeker': 'search engines and portals', 'sophos': 'portal sites', 'BitDefender': 'news', 'Comodo Valkyrie Verdict': 'mobile communications', 'alphaMountain.ai': 'Search Engines/Portals'}
>>> print(file.get("last_analysis_stats"))
{'harmless': 77, 'malicious': 0, 'suspicious': 0, 'undetected': 8, 'timeout': 0}
>>> print(file.get("whois"))
g. [Organization] Yahoo Japan Corporation
l. [Organization Type] Corporation
p. [ネームサーバ] ns01.yahoo.co.jp
p. [ネームサーバ] ns02.yahoo.co.jp
p. [ネームサーバ] ns11.yahoo.co.jp
p. [ネームサーバ] ns12.yahoo.co.jp