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

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


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

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

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

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

    Выводы


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

    К сожалению, в настоящее время большинство программ для просмотра неактивного реестра не поддерживают обработку и визуализацию значений битов доступа.
    • +16
    • 7,7k
    • 3
    BI.ZONE
    61,00
    Компания
    Поделиться публикацией

    Похожие публикации

    Комментарии 3

      –3


      Про не документированые возможности тут не плохо парни сказали
        0
        Вы чего? Функция RegNotifyChangeKeyValue из advapi32.dll была ещё в Win 98. И есть поле LastWriteTime, которое содержит дату изменения ключа, начиная с Win 2000, ЕМНИП. Оно извлекается с помощью RegQueryInfoKey. Если у вас есть просто файл реестра, допустим, с другой машины, то он монтируется в реестр с помощью RegLoadKey.
          0
          Статья не об этом.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое