
Wrapper Python ctypes per Event Tracing for Windows (ETW) che abilita il controllo delle sessioni, la cattura degli eventi e callback personalizzati per il monitoraggio della sicurezza e l'analisi forense.
ETW è una funzionalità di tracciamento che consente a un utente di registrare eventi in un file o in un buffer. Una panoramica di ETW è disponibile qui. L'architettura di base include un Provider, un Controller e un Consumer. Il controller definisce e controlla una sessione di acquisizione. Ciò include quali provider sono presenti nella sessione, oltre all'avvio e all'arresto della stessa. Il provider, specificato tramite un GUID (Globally Unique Identifier), registra gli eventi in una serie di buffer. Il Consumer riceve i messaggi da un buffer o da un file e li elabora in ordine cronologico.
Questo modulo è un wrapper ctypes interamente basato su Python attorno alle API Win32 necessarie per controllare le sessioni ETW ed elaborare i dati dei messaggi. Il modulo è molto flessibile e può impostare filtri pre o post acquisizione.
Per utilizzare questo modulo, importa etw e crea un'istanza della classe ETW passando un elenco di istanze ProviderInfo per il/i provider da cui desideri acquisire dati. Per elaborare i dati restituiti da ETW, dovrai specificare un callback.
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')
Di seguito è riportato un esempio di utilizzo del modulo per eseguire un'acquisizione con un callback personalizzato.
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()
La sottoclasse è un altro modo pratico per definire classi di acquisizione ETW.
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()
Per ulteriori esempi, consulta examples.