Мониторинг реестра, включая доступ к реестру в режиме ядра?
Я помню, что для своего последнего университетского проекта я написал монитор реестра C#, однако, когда я сравнил его с приложением Microsoft ProcessMonitor (я не могу вспомнить его точное имя, но компания была куплена MSoft), я не захватывал столько обращений к реестру,
Было ли это потому, что я использовал оболочку C# и, как таковой, он только ловил доступ к реестру в пользовательском режиме?
Я использовал эту обертку: http://www.codeproject.com/KB/DLL/EasyHook64.aspx
Чтобы поймать доступ к реестру режима ядра мне нужно написать на C++?
2 ответа
Process Monitor использует драйвер ядра или ETW (см. Ниже) для записи событий реестра. Я знаю, что Process Monitor использует ETW для некоторых своих данных (например, информацию о сети).
Механизм перехвата или обхода API, такой как EasyHook, обычно работает на уровне Win32 API (например, RegSetValue
или же RegCreateKeyEx
в ADVAPI32.dll). Из-за этого у него есть ограничение, которое вы упомянули: регистрируются только обращения к реестру в пользовательском режиме. Кроме того, перехват API обычно выполняется отдельно для каждого процесса, поэтому вы должны внедрить себя в каждый процесс, для которого вы хотите собирать данные. Вам также придется следить за созданием процесса, если вы действительно хотите зафиксировать все обращения в системе.
Отслеживание событий для Windows (ETW) было бы простым способом (условно говоря) для захвата всех обращений к реестру. Основная идея ETW заключается в том, что разработчики ОС, среды выполнения, библиотек и даже повседневных приложений могут добавлять в свой код специальные инструменты для регистрации данных об интересных событиях и сценариях. Эта трассировка не требует больших затрат и может быть легко собрана. ETW существует уже некоторое время, но он действительно завоевал популярность во всем ядре, начиная с Vista. Почти все основные подсистемы ядра теперь оснащены ETW. Это также теперь основа для журнала событий Windows.
ETW имеет значительную долю багажа и не имеет достаточной документации в некоторых областях, но если вы заинтересованы, вы можете проверить следующее:
- Документация ETW MSDN
- ETW и журнал событий
- Xperf (часть Windows Performance Toolkit), используемый для сбора и анализа трасс
- logman.exe и tracerpt.exe для сбора и анализа следов
- TraceEvent, библиотека.NET для сбора и анализа событий ETW
- Использование NT Kernel Logger из собственного кода
Чтобы поймать доступ к реестру режима ядра мне нужно написать на C++?
Нет, используя библиотеку TraceEvent, упомянутую выше, вы можете использовать C# для захвата и анализа обращений к реестру в режиме ядра и пользователя по всей системе.
Чтобы получить доступ к реестру в режиме ядра, вы должны написать драйвер на C++, другого способа сделать это не существует. Process Monitor - это драйвер, поэтому он может фиксировать как пользовательский, так и доступ к ядру.
Вы можете скачать старые версии Regmon и Filemon здесь: