Мониторинг реестра, включая доступ к реестру в режиме ядра?

Я помню, что для своего последнего университетского проекта я написал монитор реестра 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 имеет значительную долю багажа и не имеет достаточной документации в некоторых областях, но если вы заинтересованы, вы можете проверить следующее:

Чтобы поймать доступ к реестру режима ядра мне нужно написать на C++?

Нет, используя библиотеку TraceEvent, упомянутую выше, вы можете использовать C# для захвата и анализа обращений к реестру в режиме ядра и пользователя по всей системе.

Чтобы получить доступ к реестру в режиме ядра, вы должны написать драйвер на C++, другого способа сделать это не существует. Process Monitor - это драйвер, поэтому он может фиксировать как пользовательский, так и доступ к ядру.

Вы можете скачать старые версии Regmon и Filemon здесь:

http://www.decuslib.com/decus/vmslt00a/nt/filemon.htm

http://www.decuslib.com/decus/vmslt00a/nt/regmon.htm

Другие вопросы по тегам