Pull to refresh
127.27

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

Reading time3 min
Views9.9K
Начиная с 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 нет ни одной функции, позволяющей получить текущее значение битов доступа для какого-либо ключа реестра, что наталкивает на мысль об отладочном характере битов доступа.

Демонстрация


В качестве примера рассмотрим в шестнадцатеричном редакторе структуру реестра, описывающую ключ «\ControlSet001\Services\RServer3» (куст реестра «SYSTEM») непосредственно после установки программного обеспечения Radmin, до перезагрузки, и после перезагрузки операционной системы.

Структура ключа реестра (до перезагрузки)

Структура ключа реестра (после перезагрузки)

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

Выводы


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

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

Articles

Information

Website
bi.zone
Registered
Employees
501–1,000 employees
Location
Россия