Комментарии 6
Новый режим анализа решает описанную проблему. В нём PVS-Studio перехватывает все запуски компилятора. Быстро компилируется код или нет – неважно.Не, ну зачем так велосипедить, внедряя свою DLL в каждый процесс системы, на вирус похоже )))
Когда в Windows уже 15 лет как есть прекрасные встроенные средства трассировки (ETW), только подписывайся на создание процессов и получай удовольствие — система сама всё буферизует, не надо следить за переполнениями логов или синхронизацией записи в журнал. Легко использовать как из C++ так и из .NET
Не, ну зачем так велосипедить, внедряя свою DLL в каждый процесс системы, на вирус похоже )))
Оно не так работает. Хотя на мой взгляд это было бы лучшим решением. Только внедряясь не в каждый процесс системы, а исключительно в процесс сборки.
Сейчас пишется статья, которая подробно описывает работу новой реализации перехвата процессов
спойлер
через Image File Execution Options
и зачем вообще такие танцы с бубном. И почему ETW не подходит.
Было бы очень интересно почитать, почему ETW не подходит. На первый взгляд, всё есть — PID, Parent PID, Image Name, Command Line. И события не теряются.
Command Line
Вот найти кто пишет аргументы командной строки, не получилось. Не подскажете в каком оно провайдере есть? Microsoft-Windows-Kernel-Process не подошёл. А еще желательно собрать все переменные окружения.
При работе чрез систему событий есть и другая проблема. Компилятор может работать не только через аргументы командной строки, но и через временные respose-файлы. В этом случае можно также не успеть прочитать файл, чтобы извлечь из него параметры запуска.
Когда есть возможность перехватить запуск процесса, получится успеть сделать все что потребуется.
Вот такой провайдер (ProcessGuid = 3d6fa8d0-fe05-11d0-9dda-00c04fd7ba7c) даёт события запуска процессов с командными строками. docs.microsoft.com/en-us/windows/win32/etw/nt-kernel-logger-constants
Этот провайдер даёт бинарные данные. XML-провайдеры я не рассматривал, т.к. не хотел терять производительность на конвертацию в XML и обратно.
Разбор бинарника события ProcessStart где-то я встречал в open-source софте, там формат
0x08: PID
0x0C: ParentPID
0x24: SID (владелец процесса, структура переменной длины)
0x24+SidSize: image name
0x24+SidSize+imagenamesize: command line
как считать SidSize, есть тут: github.com/microsoft/perfview/issues/1004
Этот провайдер даёт бинарные данные. XML-провайдеры я не рассматривал, т.к. не хотел терять производительность на конвертацию в XML и обратно.
Разбор бинарника события ProcessStart где-то я встречал в open-source софте, там формат
0x08: PID
0x0C: ParentPID
0x24: SID (владелец процесса, структура переменной длины)
0x24+SidSize: image name
0x24+SidSize+imagenamesize: command line
как считать SidSize, есть тут: github.com/microsoft/perfview/issues/1004
Понятно, что если надо успеть прочитать временный файлик, то трассировка не подойдёт (разве что перехватывать события чтения файлов из интересующего нас процесса).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
PVS-Studio 7.18: обновления и улучшения