
Wrapper Python ctypes pour Event Tracing for Windows (ETW) permettant le contrôle de sessions, la capture d'événements et des rappels personnalisés pour la surveillance de sécurité et l'analyse forensique.
ETW est un mécanisme de traçage qui permet à un utilisateur de journaliser des événements dans un fichier ou un tampon. Un aperçu d'ETW est disponible ici. L'architecture de base comprend un fournisseur (Provider), un contrôleur (Controller) et un consommateur (Consumer). Le contrôleur définit et contrôle une session de capture. Cela inclut les fournisseurs présents dans la session ainsi que le démarrage et l'arrêt de celle-ci. Le fournisseur, spécifié à l'aide d'un GUID (Globally Unique Identifier), journalise les événements dans une série de tampons. Le consommateur reçoit les messages soit depuis un tampon, soit depuis un fichier, et les traite dans l'ordre chronologique.
Ce module est un wrapper ctypes entièrement basé sur Python autour des API Win32 nécessaires pour contrôler les sessions ETW et traiter les données des messages. Le module est très flexible et peut définir des filtres de capture avant ou après la capture.
Pour utiliser ce module, importez etw et créez une instance de la classe ETW en passant une liste d'instances ProviderInfo pour le(s) fournisseur(s) dont vous souhaitez capturer les données. Pour traiter les données renvoyées par ETW, vous devrez spécifier un rappel (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')
Voici un exemple d'utilisation du module pour effectuer une capture à l'aide d'un rappel personnalisé.
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()
Le sous-classement est une autre méthode pratique pour définir des classes de capture 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()
Pour plus d'exemples, consultez examples.