
Wrapper em Python ctypes para Event Tracing for Windows (ETW), permitindo controle de sessão, captura de eventos e callbacks personalizados para monitoramento de segurança e análise forense.
O ETW é um recurso de rastreamento que permite a um usuário registrar eventos em um arquivo ou buffer. Uma visão geral do ETW pode ser encontrada aqui. A arquitetura básica inclui um Provider, um Controller e um Consumer. O controller define e controla uma sessão de captura. Isso inclui quais providers estão na sessão, bem como iniciar e parar a sessão. O provider, especificado usando um GUID (Globally Unique Identifier), registra eventos em uma série de buffers. O Consumer recebe mensagens de um buffer ou de um arquivo e as processa em ordem cronológica.
Este módulo é um wrapper ctypes inteiramente baseado em Python em torno das APIs Win32 necessárias para controlar sessões de ETW e processar dados de mensagens. O módulo é muito flexível e pode definir filtros de captura pré ou pós-captura.
Para usar este módulo, importe etw e crie uma instância da classe ETW passando uma lista de instâncias de ProviderInfo para o(s) provider(s) dos quais você deseja capturar dados. Para processar os dados retornados do ETW, você precisará especificar um 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')
Abaixo está um exemplo de uso do módulo para realizar uma captura usando um callback personalizado.
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()
A subclasse é outra maneira prática de definir classes de captura de 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()
Para mais exemplos, veja examples.