Недокументированные возможности Windows: регистрация событий доступа к ключам реестра

в 10:13, , рубрики: bizone, Блог компании BI.ZONE, реверс-инжиниринг, реестр windows

Начиная с 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, до перезагрузки, и после перезагрузки операционной системы.

Недокументированные возможности Windows: регистрация событий доступа к ключам реестра - 1Структура ключа реестра (до перезагрузки)

Недокументированные возможности Windows: регистрация событий доступа к ключам реестра - 2Структура ключа реестра (после перезагрузки)

На иллюстрациях выше красным подчеркнут байт поля «Access bits», который изменился при перезагрузке операционной системы (значение 3 указывает на то, что установлены битовые маски 0x1 и 0x2).

Выводы

Биты доступа — это небольшая недокументированная функциональность Windows, созданная, скорее всего, для целей отладки, которая может быть использована для отслеживания неиспользуемых ключей реестра и для отслеживания ключей реестра, открываемых на этапах до и после завершения запуска сервисов операционной системы во время ее загрузки.

К сожалению, в настоящее время большинство программ для просмотра неактивного реестра не поддерживают обработку и визуализацию значений битов доступа.

Автор: msuhanov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js