
Python-ctypes-Wrapper für Event Tracing for Windows (ETW), der Sitzungssteuerung, Ereigniserfassung und benutzerdefinierte Callbacks für Sicherheitsüberwachung und forensische Analyse ermöglicht.
ETW ist eine Tracing-Funktion, die es einem Benutzer ermöglicht, Ereignisse in einer Datei oder einem Puffer zu protokollieren. Eine Übersicht über ETW finden Sie hier. Die grundlegende Architektur umfasst einen Provider, einen Controller und einen Consumer. Der Controller definiert und steuert eine Erfassungssitzung. Dazu gehört, welche Provider in der Sitzung enthalten sind, sowie das Starten und Stoppen der Sitzung. Der Provider, der über eine GUID (Globally Unique Identifier) angegeben wird, protokolliert Ereignisse in einer Reihe von Puffern. Der Consumer empfängt Nachrichten entweder aus einem Puffer oder einer Datei und verarbeitet sie in chronologischer Reihenfolge.
Dieses Modul ist ein vollständig auf Python basierender ctypes-Wrapper um die Win32-APIs, die für die Steuerung von ETW-Sitzungen und die Verarbeitung von Nachrichtendaten erforderlich sind. Das Modul ist sehr flexibel und kann Filter vor oder nach der Erfassung festlegen.
Um dieses Modul zu verwenden, importieren Sie etw und erstellen Sie eine Instanz der ETW-Klasse, indem Sie eine Liste von ProviderInfo-Instanzen für den/die Provider übergeben, von denen Sie Daten erfassen möchten. Um die von ETW zurückgegebenen Daten zu verarbeiten, müssen Sie einen Callback angeben.
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')
Nachfolgend finden Sie ein Beispiel, das das Modul verwendet, um eine Erfassung mit einem benutzerdefinierten Callback durchzuführen.
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()
Das Erstellen von Unterklassen ist eine weitere praktische Möglichkeit, ETW-Erfassungsklassen zu definieren.
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()
Weitere Beispiele finden Sie unter examples.