Jetbrains etw service что это
Prerequisites
Make sure that the Dynamic Program Analysis plugin is enabled on the Plugins page of JetBrains Rider settings Ctrl+Alt+S
DPA is based on Event Tracing for Windows (ETW). To receive ETW events, DPA uses the special 'JetBrains ETW Host Service' that must be installed in your system. Typically, you install this service along with JetBrains Rider installation. If the service is not installed, DPA will be inactive. In this case, follow the instructions below.
Использование tracerpt и xperf для работы с ETW
В этой главе я не буду рассматривать эти утилиты с теоретической точки зрения.
Команду Tracerpt можно использовать для анализа журналов трассировки событий, файлов журналов, созданных монитором производительности, и поставщиков трассировки событий в реальном времени. Он создает файлы дампа, файлы отчетов и схемы отчетов. У этой утилиты большое количество параметров, однако для начала работы подойдет следующий «минимум»
Контроллеры обладают еще несколькими ключевыми функциями. Они могут обновлять сессии и сбрасывать содержимое буферов на диск.
На этом пока все!
К сожалению, в данной статье я не затронул некоторое количество интересных вопросов (например, потребление событий в режиме реального времени или работу с сессиями специального назначения).
В предыдущих статьях про сниффер на PowerShell и сбор данных о загрузке с удаленного сервера я уже немного писал про возможности ETW (Event Tracing for Windows). Сегодня я хочу подробнее рассказать про эту технологию.
Часть системных провайдеров по умолчанию уже пишет в журнал событий Windows, а часть включается отдельно. Так что даже если вы не знаете про ETW, наверняка им пользуетесь. Познакомиться с журналами и включить часть из них при необходимости можно в стандартном просмотре событий в журналах приложений и служб. Немного о журнале и о работе с ним можно почитать в статье «Вертим логи как хотим ― анализ журналов в системах Windows».
Посмотреть список существующих провайдеров, которые только и рады поведать нам, что с ними происходит, можно командой logman query providers.
Посмотреть список провайдеров, которые подключены к определенному процессу Windows (а значит, и узнать что-то про него), можно при помощи команды logman query providers -pid .
Список провайдеров, подключенных к обычному блокноту.
Подписку на события определенного провайдера или на трассировку можно включить через PowerShell при помощи командлета New-NetEventSession. А можно и вовсе накликать мышкой по пути «Управление компьютером» — «Производительность» — «Группы сборщиков данных». Здесь в сеансах отслеживания событий видно, какие трассировки запущены, и при желании можно создать свой сборщик.
Просматривать результат можно при помощи утилит и наборов утилит типа Microsoft Message Analyzer, Windows Performance Toolkit или вовсе командлетом PowerShell Get-WinEvent.
С особенностями работы ETW я рекомендую ознакомиться в документации Microsoft, начать можно с раздела About Event Tracing. Также могу порекомендовать неплохой материал «Изучаем ETW и извлекаем профиты».
Предположим, что вы каким-то образом (например, через аудит запуска процессов) обнаружили, что на компьютере запускаются невнятные процессы и скрипты PowerShell. Одной из методик будет использование ETW для анализа их активности. Например, посмотрим на провайдера PowerShell. Включим трассировку командой:
Теперь подождем, пока непонятные скрипты отработают, остановим трассировку командой:
Теперь можно посмотреть трассировку, например, через Microsoft Message Analyzer.
Подозрительный clean.ps1 явно что-то ищет и удаляет.
Если выбрать нужную строку, то в нижней панели будет расширенная информация о событии.
А, это же скрипт для очистки кэша 1С!
В этот раз все оказалось банально. Но в более сложных случаях можно запустить трассировку и для проверки других активностей:
- сетевая активность;
- разрешение DNS;
- обращение к диску;
- работа с памятью;
- активность WMI;
- и многое другое.
Таким образом, ETW может помочь поймать зловреда и разобраться в работе приложений. Местами это информативнее, чем привычный Process Monitor. Но помимо дел добрых, у механизма есть и «темная» сторона.
Разумеется, и молотком можно убить, и ружьем спасти. Моральную оценку механизмов делать я, конечно же, не буду, но в любом случае возможности открываются интересные.
Приведу пару примеров в качестве Proof-of-Concept
Начнем с того, что включим журнал событий Wininet. Делается это так: открываем журнал событий, на вкладке «Вид» включаем отображение аналитических и отладочных журналов.
Добавляем отображение нужных журналов.
После этого включаем UsageLog в контекстном меню, и этого достаточно для получения нужной информации. Попользуемся IE и посмотрим лог:
Собственно, в журнале видны заголовки и непосредственный запрос в поисковую систему.
Помимо заголовков при помощи журнала можно вытащить и cookie, а заодно посмотреть POST-запросы — например, для вытаскивания учетных данных. Методика работает на любых приложениях, использующих wininet.dll для работы с интернетом. К примеру, браузер Edge.
То же самое запросто реализуется и на PowerShell, и даже на cmd. Приведу пример реализации последним.
Для начала создадим трассировку:
Теперь поработаем в браузере, проверим почту. Трассировку можно после этого остановить командой:
Простейший анализ можно провести при помощи командной утилиты wevtutil.exe. Например, для просмотра POST-запросов команда будет такой:
Можно даже наудачу попробовать поискать по слову password и получить результат.
Пароли открытым текстом. Очень напрягает.
Стоит отметить, что антивирус при этом молчал. Действительно, ведь это обычный процесс трассировки.
Разумеется, события WinInet можно использовать и для диагностики неполадок вроде «почему этот сайт не открывается и что вообще происходит». Но тем не менее, возможности довольно интересны. Перейду к еще более закрученному примеру.
В Windows есть два интересных провайдера ETW:
С их помощью можно получить данные HID, которые передает такое устройство USB, как клавиатура или мышь. Данные захватываются в сыром виде, но благодаря спецификации HID их вполне можно привести к читаемому виду.
Для начала трассировки достаточно выполнить следующие команды:
А данные можно получить командлетом PowerShell:
Приведу пример простого скрипта, который читает данные трассировки и преображает их в читаемые значения. Преобразование делается только для английских букв и исключительно в заглавные.
При запуске скрипт включает трассировку на 10 секунд, затем показывает результат.
Результат работы скрипта.
Конечно же, разобравшись с данными HID, можно доработать скрипт до полноценного кейлоггера, который записывал бы данные с клавиатуры и мыши. Стоит отметить и ограничения этого механизма:
- работает только с USB, а PS\2 (как порой встречается в ноутбуках) не поддерживается;
- поддержка USB 3.0 заявлена только в Windows 8 и выше;
- требуются права администратора (UAC).
Зато никаких драйверов и перехватчиков. Ну, и конечно, помимо зловредного использования такой кейлоггер может помочь в диагностике проблем с клавиатурой. Теоретически.
Даже встроенные механизмы в руках злодея могут натворить бед. Методы защиты остаются те же самые: блокировать исполняемые файлы не из системных каталогов, не работать под пользователем с правами администратора, а если и работать — то хотя бы не отключать UAC. И, конечно же, встроенные браузеры Windows по части безопасности вызывают вопросы.
Давненько у нас в бложеке не появлялось новых статей! Что ж, ETW, настало твое время!
Возможно, кто-то из вас и раньше сталкивался с этим сокращением - ETW. Что же это такое? Расшифровывается эта аббревиатура как Event Tracing for Windows. ETW - это системный компонент ОС Windows, который используется для диагностики, отладки и исследования производительности тех или иных частей ОС, а также приложений. Появился он где-то с Windows 2000, но полноценно его использовать стало возможным примерно с Windows Vista.
Тогда сначала быстренько рассмотрим архитектуру ETW, его плюсы и минусы. Вот что из себя представляет этот компонент:
- Позволяет единообразно потреблять события из сотен источников.
- Полноценно работает на Windows Vista (или даже Win 7) и новее.
- Не требует хуков, инжектов, драйверов. Все события можно получать в user mode.
- Требует привилегий администратора. Увы, не получится работать с объектами ядра (сессиями) от имени простого пользователя.
- Не будет работать на Windows XP. Также, не все провайдеры, которые доступны в более новых ОС, присутствуют в более старых.
- Созданные вами сессии будут палиться в Computer Management'е (описано далее), а также любое приложение сможет перечислить имеющиеся в системе сессии; их можно будет остановить и удалить извне. Разумеется, для этого тоже нужны будут права администратора.
В этой статье я буду рассматривать только создание потребителей событий ETW. Провайдеры - это отдельная большая тема, с которой при желании можно познакомиться, почитав соответствующие статьи в MSDN.
Само ETW API - не сахар. Оно неочевидное, не слишком хорошо документировано, многие вещи приходится додумывать или искать в Интернете примеры использования той или иной функции. Статей на эту тему написано не так много (некоторые дополнительные ссылки я приведу в конце статьи). Я постараюсь прояснить большинство вопросов, которые у нас возникнут по ходу разбора этого API.
Перед тем, как я перейду к коду, который позволяет создавать сессии и получать события, я опишу несколько штатных системных утилит Windows, которые помогут нам в работе с ETW. Вначале, конечно, неплохо было бы изучить список провайдеров, доступных на конкретной ОС. Для этого можно использовать следующую команду:
Теоретические основы службы трассировки Windows
Event Tracing for Windows (ETW) — это служба, которая позволяет получать события от одного или нескольких поставщиков событий в режиме реального времени или из файла *.etl за некоторый временной период. Не понятно? Сейчас разберемся!
Для того, чтобы понять принцип работы ETW, необходимо разобраться со структурой этой службы
Архитектура ETW включает в себя 4 элемента
- поставщики событий (providers)
- потребители событий (consumers)
- контроллеры ETW (controllers)
- сессии ETW (event tracing sessions)
А теперь рассмотрим каждый элемент рассмотренной выше архитектуры подробнее, чтобы окончательно разобраться с принципом работы!
Сессии ETW
Сеансы отслеживания событий (сессии ETW) записывают события от одного или нескольких провайдеров, которые разрешает контроллер. Сессия также отвечает за управление и очистку буферов.
Трассировка событий поддерживает до 64 сеансов трассировки событий, выполняющихся одновременно. Из этих сессий есть две сессии специального назначения. Остальные сеансы доступны для общего пользования. Две сессии специального назначения:
- Global Logger Session
- NT Kernel Logger Session
Итак, а теперь переходим к практике.
Get started with DPA
Actually, DPA doesn't require any additional steps from your side to start using it. Work as you usually do with some minor addition to your workflow:
Every time you finish running or debugging your project, pay attention to the DPA icon in the status bar. If it's red like this, , click it and choose View Issues .
Go through the list of issues. On this step, you can:
Double-click the issue to view its stack trace.
Navigate from an issue to the corresponding code in the editor (with F4 ).
And navigate back (with Alt+Enter and View memory allocation issues ).
If you think that the issue can be fixed, try fixing it using our tips.
After you fix the issue, run the project one more time and make sure it is no longer present in the DPA list.
If you think that the issue cannot be fixed, either suppress or exclude this issue. One more way to make the issue disappear from the list is increasing the memory allocation threshold.
Ideally, you should get the green DPA icon, which looks like this: .
Поставщики событий (providers)
Поставщики событий — это приложения, содержащие инструменты отслеживания событий. После того, как поставщик зарегистрировался, контроллер может включить или отключить отслеживание событий в поставщике. Поставщик определяет свою интерпретацию включения или выключения. Как правило, включенный поставщик генерирует события, а отключенный поставщик нет. Это позволяет добавлять отслеживание событий в наше приложение, не требуя, чтобы оно генерировало события все время.
Один поставщик может делиться своими событиями сразу с несколькими сессиями ETW.
Каждое событие состоит из двух элементов: заголовка и данных! Заголовок события включает информацию о событии: идентификатор провайдера, идентификатор события, временную метку и т.д. Остальные данные определяются конкретным провайдером: ETW принимает любые данные и записывает их в буфер, а их интерпретация возлагается на потребителей информации.
Существует четыре основных типа провайдеров:
поставщики MOF (классические)
провайдеры WPP
провайдеры на основе манифеста
провайдеры TraceLogging.
Поставщики событий различаются по типам полей, которые они хранят в полезных нагрузках событий.
С поставщиками событий вроде разобрались. Идем дальше!
Summary
The ETW Host Service is essential for DPA in both ReSharper and Rider, and it’s proven to be a popular feature amongst our users. Changing the installation process allows us to bring the ETW Host Service and its capabilities to determine potential memory issues to more scenarios. As we continue improving the ETW Host Service, we hope to bring those features to you faster and non-intrusive mechanisms.
If you have any further questions or concerns, please leave them in the comments below.
Dynamic Program Analysis (or DPA) is a process that runs in the background of JetBrains Rider and checks your application for various memory allocation issues. It currently checks for closures and allocations to large and small object heaps (LOH and SOH). DPA is started automatically each time you run your solution in JetBrains Rider. The allocation data is collected with almost zero overhead: we have tested DPA on a variety of real solutions getting the slowdown from 0 to 2 percent.
To ease the understanding of DPA, you can think of it as of profiling that is always turned on: You do not need to run a profiler, start a profiling session, and get snapshots. Just work as usual, and all data will be collected in the background when you run your solution.
New Installation Process
Like all JetBrains installers, The ETW Host Service installer is signed for security, and all updates downloaded directly by the service are PGP signed, and the integrity is checked using a SHA256 digest for a second level of security. As of now, the update process will require a manual confirmation to receive the next version.
Enable DPA during debugging
During debugging, system assemblies used by your application must provide additional data to the debugger. As a result, these assemblies allocate more memory comparing to regular application run. The problem is that currently, DPA cannot distinguish these additional allocations from "normal" allocations made by your program. This may result in false-positive issues detected by DPA .
Because of all of the above, DPA is disabled when you debug your solution. If you want to enable it in the debugging mode, you should turn on the Enable Dynamic Program Analysis during debugging option in Settings | Build, Execution, Deployment | Dynamic Program Analysis .
Note that this also applies to attaching the debugger to a running application with Attach to Process .
How DPA works
If during program execution the size of allocated memory exceeds the specified threshold, the method in which the allocations take place is considered an issue. DPA adds this method to the list of issues in the Dynamic Program Analysis window.
The exact line of code responsible for the allocation is highlighted in the editor.
All methods and lines on the call path are highlighted as well.
If you change the code of the method marked as issue, DPA will consider this as a try for fixing the issue.
If after the fix, memory allocation decreases to a value below the threshold, DPA will consider the issue fixed and will remove it from the list.
If after the fix, the allocation value is still above the threshold, DPA will update the issue in the list with this new value.
If you do not change the code of the method marked as issue, DPA will show you the new issue value and the highest issue value among all runs.
In more detail: For each issue, DPA stores two values - the maximum recorded value and the value from the last run. This prevents false-negatives: An issue could fall below the threshold and disappear from the issue list not because it had been fixed, but because the launch conditions had changed (the program ran for less time, the required functionality was not executed, and so on). The maximum value is shown only in case you haven't changed the code behind the issue between the runs.
DPA does not show muted and suppressed issues in the list and does not highlight the corresponding code in the editor.
Currently, it is not possible to view issue history.
As Debug and Release builds differ from each other, DPA tracks each solution build configuration separately. The Dynamic Program Analysis window shows issues for the currently selected build configuration.
ETW raises the memory allocation event only after the 100 KB allocation threshold is exceeded. Therefore, DPA's level of granularity is 100 KB.
Why The Change?
We’ve found several scenarios our users can benefit from the ETW Host Service outside of ReSharper and Rider DPA usage.
We believe the advantages of the change will greatly outweigh the inconvenience of having to manage the ETW Host Service manually. Ultimately, we’ve realized the ETW host service, while essential for ReSharper and Rider, can do more for you beyond the scope of your development machine.
Контроллеры
Контроллер — это приложение, которое отвечает за функционирование одной или нескольких сессий ETW. Именно контроллер определяет размер и местоположение файла журнала, запускает и останавливает сеансы трассировки событий (сессии ETW), позволяют поставщикам регистрировать события в сеансе. Как уже было сказано ранее, именно контроллер разрешает провайдеру делиться своими событиями!
Создание своей сессии ETW
Перед началом работы нам потребуется знание нескольких утилит, а именно:
список провайдеров, доступных на конкретной ОС
получить полную информацию о провайдере
список всех активный сессий ETW
Так же, для просмотра файлов, желательно иметь Notepad++.
Просмотрев список провайдеров на своем компьютере (а их более 1000 на Windows 10), выберем один из них для нашей сессии:
Я выбрал Microsoft-Windows-WinINet (эта служба записывает все наши действия при работе в браузере Microsoft Edge).
1. Win+R -> compmgmt.msc
2. «Performance» («Производительность»)
3. «Data Collector Sets» («Группы сборщиков данных»)
4. «Event Trace Sessions» («Сеансы отслеживания событий»)
5. «New» («Создать»)
6. «Data Collector Set» («Группа сборщиков данных)
7. Указываем имя сборщика данных
8. „Create manually (Advanced)“ (»Создать вручную (для опытных)")
9. Добавляем интересующие нас провайдеры в сессию
10. Указываем интересующие нас ключевые слова в поле «Keywords(Any)» («Ключевые слова(Любые)») — 0xFFFFFFFFFFFFFFFF
11. Указываем уровень логирования 0xFF
=
12. Выбираем путь, по которому будет сохраняться файл журнала сессии
13. Выбираем флажок «Start this data collector set now» («Запустить группу сборщиков данных сейчас»)
Теперь созданная нами сессия работает. Необходимо поработать некоторое время в Microsoft Edge, чтобы сессия собрала о нас информацию!
После того, как прошло некоторое время переходим в место, куда мы сохранили файл логирования. Там выполняем следующую команду.
После выполнения этой команды сформируется 4 файла.
Нас в данный момент будет интересовать dumpfile.xml. Открывать этот файл можно либо через notepad++, можно также сделать это в Excel.
Внимательно изучив этот файл, можно заметить, что данная сессия собрала почти всю информацию о нашем перемещении в сети интернет. Более подробно об этом можно почитать здесь Изучаем ETW и извлекаем профиты.
Ну что же, а мы движемся дальше. Только что мы создали сессию с единственным поставщиком событий. Получили данные сессии из файла логирования. Пришло время кодить!
Event Tracing For Windows (ETW) Host Service
Event Tracing for Windows, commonly referred to as ETW, is a foundation for the Windows Performance Toolkit. Using ETW, you can capture kernel and application-level events without restarting the system or current process. Capturing events is also meant to be non-invasive with minimal overhead to the process.
When installing our tools, you may have noticed the process asks you to install the JetBrains ETW Host Service. ETW powers Dynamic Program Analysis (DPA) in both ReSharper and Rider. DPA runs in the background while your application runs, gathering information about large and small object allocations. Without the service, our DPA feature would not work. Furthermore, users would lose real-time profiling features that can help diagnose potential garbage collection issues, problems that can significantly impact application performance.
Install 'JetBrains ETW Host Service' (only if it was not installed during Rider installation)
Open the Dynamic Program Analysis window by doing one of the following:
Use the menu View | Tool Windows | Dynamic Program Analysis .
Click the DPA icon in the Rider status bar and select View Issues .
Click the Install 'ETW Host Service' link at the top of the window.
In the Windows UAC window, allow Rider to make changes on your computer.
Service installation needs to be done only once. If you click the Run 'ETW Host Service' once link, JetBrains Rider will start the service without installation. In this case, the service will be working until the system reboot.
Supported OSs and frameworks
Потребители
Потребители — это приложения, которые получают и обрабатывают события от одного или нескольких сеансов трассировки одновременно. Потребители могут получать события, хранящиеся в файлах журналов или из сеансов, которые доставляют события в режиме реального времени. Как мы уже знаем, у одной сессии ETW может быть несколько поставщиков. Возникает вопрос: а не будет ли путаницы? Как события из различных сессий ETW будут располагаться друг относительно друга? События сортируются по времени их появления, т.е. система доставляет события в хронологическом порядке!
Настройка и запуск сеанса отслеживания событий
Для начала рассмотрим общую идею.
Чтобы запустить сеанс трассировки необходимо:
1) Задать структуру EVENT_TRACE_PROPERTIES
2) Запустить сеанс с помощью StartTrace
Далее необходимо включить поставщиков событий
3) Включаем поставщиков с помощью EnableTrace | EnableTraceEx | EnableTraceEx2
Чтобы остановить сеанс трассировки необходимо:
4) Перед остановкой сеанса трассировки необходимо отключить провайдеров с помощью EnableTrace | EnableTraceEx | EnableTraceEx2, передав EVENT_CONTROL_CODE_DISABLE_PROVIDER
5) Вызвать функцию ControlTrace и передать ей EVENT_TRACE_CONTROL_STOP
В приведенном ниже примере я создаю сессию с именем MyEventTraceSession. Файл журнала логирования находится в текущей директории и называется WriteThePuth.etl
Поставщиком событий является Microsoft-Windows-Kernel-Process. Его GUID Вы можете узнать с помощью
Разберем приведенную программу более подробно.
1) Задаем структуру EVENT_TRACE_PROPERTIES
Чтобы настроить сеанс трассировки событий, необходимо использовать структуру EVENT_TRACE_PROPERTIES, чтобы указать свойства сеанса. Память, которую вы выделяете для структуры EVENT_TRACE_PROPERTIES, должна быть достаточно большой, чтобы также содержать имена файлов сеансов и журналов, которые следуют за структурой в памяти.
2) Запускаем сеанс с помощью StartTrace
После того, как вы укажете свойства сеанса, вызовите функцию StartTrace, чтобы запустить сеанс. Если функция завершается успешно, параметр SessionHandle будет содержать дескриптор сеанса, а свойство LoggerNameOffset будет содержать смещение имени сеанса.
3) Включаем поставщиков с помощью EnableTrace | EnableTraceEx | EnableTraceEx2
Чтобы включить поставщиков, которым вы хотите разрешить записывать события в свой сеанс, вызовите функцию EnableTrace, чтобы включить классических поставщиков, и функцию EnableTraceEx, чтобы включить поставщиков на основе манифеста. В остальных случаях — EnableTraceEx2.
4) Перед остановкой сеанса трассировки необходимо отключить провайдеров с помощью EnableTrace | EnableTraceEx | EnableTraceEx2, передав EVENT_CONTROL_CODE_DISABLE_PROVIDER
Чтобы остановить сеанс трассировки после сбора событий, вызовите функцию ControlTrace и передайте EVENT_TRACE_CONTROL_STOP в качестве управляющего кода. Чтобы указать сеанс для остановки, вы можете передать дескриптор сеанса трассировки событий, полученный из более раннего вызова функции StartTrace, или имя ранее запущенного сеанса. Обязательно отключите всех провайдеров перед остановкой сеанса. Если вы остановите сеанс перед первым отключением провайдера, ETW отключит провайдера и попытается вызвать контрольную функцию обратного вызова провайдера. Если приложение, запустившее сеанс, завершается без отключения поставщика или вызова функции ControlTrace, поставщик остается включенным.
5) Чтобы остановить сеанс трассировки, вызываем функцию ControlTrace и передаем ей EVENT_TRACE_CONTROL_STOP
Как мы убедились на приведенном выше примере, использование Event Tracing API является не самым простым. В зависимости от того, чем вы занимаетесь, дальше можно заниматься либо написание поставщиков событий, либо написанием потребителей событий. Однако обе эти задачи довольно объемные и в этой статье рассматриваться не будут! Дополнительную сложность создают 4 вида поставщиков событий, и, соответственно, 4 варианта написания событий и 4 варианта их потребления. Очень подробно и хорошо работа с Event Tracing API описана на официальном сайте Microsoft Using Event Tracing
Проработав некоторое время с Event Tracing API у меня появился вопрос: а есть ли утилиты, которые упросят мне жизнь?
Downloads
Использование event tracing API для работы с ETW
В этой статье Вы найдете ответы на многие вопросы, которые у вас скорее всего возникнут при написании приложений!
Кодить будем на C++.
Начнем с самого простого.
Turn DPA off
If 'JetBrains ETW Host Service' is running in the system, DPA is turned on by default. To disable DPA, click the DPA icon ( or ) in the status bar and choose Disable Dynamic Program Analysis .
Добрый день. Недавно мне необходимо было разобраться со службой трассировки Windows. Эта служба появилась еще в Windows 2000, однако статей по этой службе в интернете оказалось крайне мало.Так появилась идея написания этой статьи. Итак, начнем!
Сегодня я попытаюсь рассказать про:
- Теоретические основы службы трассировки Windows
- Создание своей сессии ETW
- Использование event tracing API для работы с ETW
- Использование tracerpt и xperf для работы с ETW
Читайте также: