本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(原題:Black Hat Python)」の学習メモとして、書籍ではPython2で書かれていますが、自分なりに解釈した上でPython3に書き直しをしています。
今回は、WMI(Windows Management Instrumentation)を用いた、プロセス監視ツールの作成について学んでいきます。
WMIとは
WMI(Windows Management Instrumentation)とは、Windows OS上で生成されている各プロセスの情報にアクセスできるAPI群で、プロセスのID(PID)、親PID、実行されたファイルとその引数、またプロセスが作成された時刻など様々な情報を取得することができます。
今回作成するスクリプトでは、新しく生成されたプロセス情報を取得し、コンソールへの出力とCSVファイルへの書き込みを行います。
取得するプロセス情報は以下となります。
- プロセスの作成時間
- 実行ファイル名
- 実行ファイルの引数
- プロセスID(PID)
- 親PID
- 権限(こちらは"N/A"とする)
Pythonでプロセス監視ツールを作成する
以下が今回作成するスクリプトとなります。
# process_monitor.py
import win32con
import win32api
import win32security
import wmi
import sys
import os
def log_to_file(message):
with open("process_monitor_log.csv", "ab") as f:
f.write(message.encode('utf-8') + b'\r\n')
return
log_to_file("Time, User, Executable, CommandLine, PID, Parent PID, Privileges")
c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for('creation')
while True:
try:
new_process = process_watcher()
proc_owner = new_process.GetOwner()
proc_owner = "{}\\{}".format(proc_owner[0], proc_owner[2])
create_date = new_process.CreationDate
executable = new_process.ExecutablePath
cmdline = new_process.CommandLine
pid = new_process.ProcessId
parent_pid = new_process.ParentProcessId
privileges = "N/A"
process_log_message = "{}, {}, {}, {}, {}, {}, {}\r\n".format(create_date,
proc_owner, executable, cmdline, pid, parent_pid, privileges)
print(process_log_message)
log_to_file(process_log_message)
except:
pass
動作確認
それでは、上記で作成したプロセスを実行してみます。
スクリプトを実行後、Windows標準の電卓を起動すると以下のプロセス情報が取得できました。
> python process_monitor.py 201902040000.100091+540, Local\user, C:\WINDOWS\system32\calc.exe, "C:\WINDOWS\system32\calc.exe" , 13412, 15180, N/A
最後に
今回はWMI APIを使用して、新しく生成されたプロセスを監視し、必要な情報を取得する方法について学びました。
どのプロセスが高い権限を持っていて、それがどのファイルにアクセスしているのかを把握することによって、そのプロセスの処理に割り込み、高い権限でコマンドプロンプトを起動させることが可能になります。