
Python ctypes-обёртка для Event Tracing for Windows (ETW), обеспечивающая управление сеансами, захват событий и пользовательские обратные вызовы для мониторинга безопасности и криминалистического анализа.
ETW — это механизм трассировки, позволяющий пользователю записывать события в файл или буфер. Обзор ETW можно найти здесь. Базовая архитектура включает поставщика (Provider), контроллер (Controller) и потребителя (Consumer). Контроллер определяет и управляет сеансом захвата. Это включает в себя то, какие поставщики входят в сеанс, а также запуск и остановку сеанса. Поставщик, задаваемый с помощью GUID (глобально уникального идентификатора), записывает события в серию буферов. Потребитель получает сообщения либо из буфера, либо из файла и обрабатывает их в хронологическом порядке.
Этот модуль представляет собой полностью Python-обёртку на основе ctypes вокруг Win32 API, необходимых для управления сеансами ETW и обработки данных сообщений. Модуль очень гибкий и позволяет задавать фильтры до или после захвата.
Чтобы использовать этот модуль, импортируйте etw и создайте экземпляр класса ETW, передав список экземпляров ProviderInfo для поставщика(ов), данные которых вы хотите захватывать. Для обработки данных, возвращаемых из ETW, вам потребуется указать функцию обратного вызова.
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')
Ниже приведён пример использования модуля для выполнения захвата с помощью пользовательской функции обратного вызова.
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()
Наследование классов — ещё один удобный способ определения классов захвата 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()
Дополнительные примеры см. в разделе examples.