
Python ctypesラッパー for Event Tracing for Windows (ETW) により、セッション制御、イベントキャプチャ、カスタムコールバックを実現し、セキュリティ監視およびフォレンジック分析を支援します。
ETW は、ユーザーがイベントをファイルまたはバッファに記録できるようにするトレース機能です。ETW の概要はこちらで確認できます。基本アーキテクチャには、プロバイダー、コントローラー、コンシューマーが含まれます。コントローラーはキャプチャセッションを定義および制御します。これには、セッションに含まれるプロバイダー、およびセッションの開始と停止が含まれます。GUID(グローバル一意識別子)を使用して指定されるプロバイダーは、一連のバッファにイベントを記録します。コンシューマーは、バッファまたはファイルからメッセージを受信し、時系列順に処理します。
このモジュールは、ETW セッションの制御とメッセージデータの処理に必要な Win32 API を完全に Python ベースの ctypes ラッパーで包んだものです。このモジュールは非常に柔軟で、キャプチャ前またはキャプチャ後のフィルターを設定できます。
このモジュールを使用するには、etw をインポートし、データをキャプチャしたいプロバイダーの ProviderInfo インスタンスのリストを渡して ETW クラスのインスタンスを作成します。ETW から返されたデータを処理するには、コールバックを指定する必要があります。
import etw
def some_func():
# define capture provider info
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
# create instance of ETW and start capture
with etw.ETW(providers=providers, event_callback=etw.on_event_callback):
# run capture
etw.run('etw')
以下は、カスタムコールバックを使用してキャプチャを実行するモジュールの使用例です。
import time
import etw
def some_func():
# define capture provider info
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
# create instance of ETW class
job = etw.ETW(providers=providers, event_callback=lambda x: print(x))
# start capture
job.start()
# wait some time
time.sleep(5)
# stop capture
job.stop()
サブクラス化も、ETW キャプチャクラスを定義するもう 1 つの便利な方法です。
import time
import etw
class MyETW(etw.ETW):
def __init__(self, event_callback):
# define capture provider info
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
super().__init__(providers=providers, event_callback=event_callback)
def start(self):
# do pre-capture setup
self.do_capture_setup()
super().start()
def stop(self):
super().stop()
# do post-capture teardown
self.do_capture_teardown()
def do_capture_setup(self):
# do whatever setup for capture here
pass
def do_capture_teardown(self):
# do whatever for capture teardown here
pass
def my_capture():
# instantiate class
capture = MyETW(lambda x: print(x))
# start capture
capture.start()
# wait some time to capture data
time.sleep(5)
# stop capture
capture.stop()
その他の例については、examples を参照してください。