
Wrapper de Python ctypes para Event Tracing for Windows (ETW) que permite el control de sesiones, la captura de eventos y callbacks personalizados para monitorización de seguridad y análisis forense.
ETW es una facilidad de rastreo que permite a un usuario registrar eventos en un archivo o búfer. Una descripción general de ETW se puede encontrar aquí. La arquitectura básica incluye un Proveedor, un Controlador y un Consumidor. El controlador define y controla una sesión de captura. Esto incluye qué proveedores están en la sesión, así como iniciar y detener la sesión. El proveedor, especificado mediante un GUID (Identificador Único Global), registra eventos en una serie de búferes. El Consumidor recibe mensajes ya sea de un búfer o de un archivo y los procesa en orden cronológico.
Este módulo es un envoltorio ctypes completamente basado en Python alrededor de las API de Win32 necesarias para controlar sesiones de ETW y procesar datos de mensajes. El módulo es muy flexible y puede establecer filtros de captura previos o posteriores.
Para usar este módulo, importa etw y crea una instancia de la clase ETW pasando una lista de instancias de ProviderInfo para el/los proveedor(es) de los cuales deseas capturar datos. Para procesar los datos devueltos por ETW, necesitarás especificar una devolución de llamada.
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')
A continuación se muestra un ejemplo que usa el módulo para realizar una captura con una devolución de llamada personalizada.
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 subclasificación es otra forma práctica de definir clases 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 más ejemplos, consulta ejemplos.