Начиная с Windows 8 пользователи операционной системы могут заметить в журнале системных событий такое сообщение: «The access history in hive […] was cleared updating [...] keys and creating [...] modified pages». Что же скрывается за этим сообщением?
Если кто-нибудь следил за обновлением структур реестра в отладочных символах, то он мог заметить, что в Windows 8 в структуре, отвечающей за хранение ключа реестра, появилось числовое поле «Access bits» («Биты доступа», если по-русски); соответствующая область памяти была зарезервирована начиная с Windows NT 3.5 и ранее использовалась в Windows NT 3.1 для хранения числового значения «Title index». В описании структуры ниже зарезервированное поле, под именем «Spare», находится по смещению +0x00c, его новое название в Windows 8 — «AccessBits».
+0x000 Signature : Uint2B
+0x002 Flags : Uint2B
+0x004 LastWriteTime : _LARGE_INTEGER
+0x00c Spare : Uint4B
+0x010 Parent : Uint4B
+0x014 SubKeyCounts : [2] Uint4B
+0x01c SubKeyLists : [2] Uint4B
+0x024 ValueList : _CHILD_LIST
+0x01c ChildHiveReference : _CM_KEY_REFERENCE
+0x02c Security : Uint4B
+0x030 Class : Uint4B
+0x034 MaxNameLen : Pos 0, 16 Bits
+0x034 UserFlags : Pos 16, 4 Bits
+0x034 VirtControlFlags : Pos 20, 4 Bits
+0x034 Debug : Pos 24, 8 Bits
+0x038 MaxClassLen : Uint4B
+0x03c MaxValueNameLen : Uint4B
+0x040 MaxValueDataLen : Uint4B
+0x044 WorkVar : Uint4B
+0x048 NameLength : Uint2B
+0x04a ClassLength : Uint2B
+0x04c Name : [1] Wchar
Структура nt!_CM_KEY_NODE в Windows 7 (в Windows 8 поле «Spare» стало полем «AccessBits»)
В результате изучения ядра Windows было установлено, что данное поле обновляется при каждом открытии или изменении ключа реестра в большинстве кустов реестра, а процитированное в начале статьи сообщение из журнала свидетельствует об очистке указанного поля у всех ключей реестра в определенном кусте путем записи нулевого значения. Очистка битов доступа происходит при подключении куста реестра, если с момента предыдущей очистки битов доступа у данного куста прошли семь суток.
Поле «Access bits» обновляется путем записи в него значения в соответствии со следующими битовыми масками:
Битовая маска | Описание |
---|---|
0x1 | Доступ к ключу реестра происходил до инициализации реестра вызовом функции NtInitializeRegistry() во время загрузки |
0x2 | Доступ к ключу реестра происходил после инициализации реестра вызовом функции NtInitializeRegistry() во время загрузки |
Поддерживаемые битовые маски
Вызов функции NtInitializeRegistry(), производящий смену текущей битовой маски (с 0x1 на 0x2), записываемой в ключи реестра при их открытии или изменении, происходит после того, как операционная система посчитает процесс загрузки успешным. Таким образом, ключи реестра, например, открытые сервисами в процессе их запуска во время загрузки операционной системы, будут иметь биты доступа с установленной битовой маской 0x1. Кроме того, если ключ реестра ничем не открывался с момента очистки битов доступа, то этот ключ будет иметь нулевое значение в данном поле.
Эта информация может быть использована для выборки ключей реестра, которые могли открываться вредоносной программой (или любой другой), работающей как сервис, или открывались вообще в недавнее время, а равно для отсеивания неиспользуемых ключей реестра.
Следует отметить, что в ядре Windows нет ни одной функции, позволяющей получить текущее значение битов доступа для какого-либо ключа реестра, что наталкивает на мысль об отладочном характере битов доступа.
Демонстрация
В качестве примера рассмотрим в шестнадцатеричном редакторе структуру реестра, описывающую ключ «ControlSet001ServicesRServer3» (куст реестра «SYSTEM») непосредственно после установки программного обеспечения Radmin, до перезагрузки, и после перезагрузки операционной системы.
Структура ключа реестра (до перезагрузки)
Структура ключа реестра (после перезагрузки)
На иллюстрациях выше красным подчеркнут байт поля «Access bits», который изменился при перезагрузке операционной системы (значение 3 указывает на то, что установлены битовые маски 0x1 и 0x2).
Выводы
Биты доступа — это небольшая недокументированная функциональность Windows, созданная, скорее всего, для целей отладки, которая может быть использована для отслеживания неиспользуемых ключей реестра и для отслеживания ключей реестра, открываемых на этапах до и после завершения запуска сервисов операционной системы во время ее загрузки.
К сожалению, в настоящее время большинство программ для просмотра неактивного реестра не поддерживают обработку и визуализацию значений битов доступа.
Автор: msuhanov