Engineering Note

プログラミングなどの技術的なメモ

10.2 プロセス監視ツールの作成(WMIを使用したプロセス監視) (サイバーセキュリティプログラミング Pythonで学ぶハッカーの思考)

本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―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を使用して、新しく生成されたプロセスを監視し、必要な情報を取得する方法について学びました。

どのプロセスが高い権限を持っていて、それがどのファイルにアクセスしているのかを把握することによって、そのプロセスの処理に割り込み、高い権限でコマンドプロンプトを起動させることが可能になります。

 

参考書籍

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考