Статьи Проверка ключей реестра на подверженность перенаправлению Wow6432 (redirected, shared, reflected)

Тема в разделе "Реестр Microsoft Windows", создана пользователем Dragokas, 8 май 2016.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.306
    Введение

    Привет!
    Для тех, кому все это в новинку поясню, что для 64-разрядных ОС некоторые ключи в реестре существуют в двух представлениях:
    - для х64 битных приложений.
    - для х32 битных приложений.

    Пример:

    1. Ключ HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID (и все его подразделы) - является 64-битным
    2. Ключ HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID (и все его подразделы) - 32-битным.

    Если вы попытаетесь в 64-битной ОС с помощью 32-разрядного приложения прочитать/записать/удалить и.т.п... ключ № 1, произойдет перенаправление, и действие выполнится с ключем № 2.

    Это пример обычного перенаправления (redirected).

    Виды перенаправлений

    В плане переадресации существуют такие виды ключей реестра:
    1. Перенаправляемые (redirected)
    2. Общие (shared)
    3. Отраженные (reflected)
    4. Также выделю отдельной группой симлинки (symlink), связанные с механизмом registry redirector.

    1. Перенаправляемые (redirected).

    Пример таких ключей описан выше (см. Введение).

    2. Общие (shared)

    Возьмем для примера такие ключи:
    а) HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies (32-битное представление)
    б) HKLM\Software\Microsoft\Windows\CurrentVersion\Policies (64-битное представление)

    В виду особой важности, некоторые ключи в обеих представлениях (64 и 32) физически ссылаются на один и тот же ключ. Это означает, что если Вы измените ключ под Wow6432Node (ключ а.), то изменения будут видны и в ключе б. И наоборот.

    3. Отраженные (reflected).

    Такие ключи использовались в ОС Windows Server 2008 / Vista / Server 2003 / XP.
    Начиная с Windows 7 они были заменены на Shared (общие ключи, см. выше).

    Отличием от Shared ключей является то, что физически - это 2 разных ключа. Но, как только программа завершает запись в любой из этих ключей, он автоматически копируется в другое представление. Таким образом, их состояние синхронизируется между собой.

    4. Симлинки, связанные с переадресацией под Wow64.

    Microsoft не рекомендует использовать для доступа к 32-разрядным ключам жестко закодированные строки, проходящие через имя Wow6432Node. Вместо этого есть цивилизованные способы.

    Однако, некоторые программисты все же используют такие пути. И это могло бы плохо закончится, потому что, начиная с Windows 7 (?) путь к Wow6432Node для некоторых ключей изменился, а для других было вообще отключено 32-битное представление.

    Тем не менее, MS позаботилась о таких ситуациях и ввела поправочные симлинки.
    Так, согласно офф. документации, известны такие симлинки, перенаправляющие запросы от одного ключа к другому (независимо от разрядности программы):
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node
    • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\AppId указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppId
    • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\PROTOCOLS указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PROTOCOLS
    • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\Typelib указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Typelib
    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node (для ОС Windows Server 2008 / Vista / Server 2003 / XP)
    Это не исключительный список и со времен Win 7 было добавлено еще многое, но в документации об этом ничего нет.
    Так что мы чуть-чуть умнее, и можем сами у себя посмотреть, какие еще есть симлинки, связанные с механизмом переадресации.

    Возьмем замечательную утилиту ListRegistryLinks от Helge Klein, и выполним в командной строке, например, такое для улья HKLM:
    Код (Text):
    ListRegistryLinks-x64.exe HKLM | find /i "Wow6432Node"
    "HKLM\SOFTWARE\Classes\Wow6432Node\AppID" -> "HKLM\SOFTWARE\Classes\AppID" (заметьте, что ключ больше не указывает на Wow6432Node, а значит в этой версии ОС просто отказались от 32-битного представления этого ключа и некоторых других (см. ниже аналогичные))
    "HKLM\SOFTWARE\Classes\Wow6432Node\PROTOCOLS" -> "HKLM\SOFTWARE\Classes\PROTOCOLS"
    "HKLM\SOFTWARE\Classes\Wow6432Node\TypeLib" -> "HKLM\SOFTWARE\Classes\TypeLib"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\Current" -> "HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Current"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\Readers" -> "HKLM\SOFTWARE\Microsoft\Cryptography\Calais\Readers"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Services" -> "HKLM\SOFTWARE\Microsoft\Cryptography\Services"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\CTF\SystemShared" -> "HKLM\SOFTWARE\Microsoft\CTF\SystemShared"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\CTF\TIP" -> "HKLM\SOFTWARE\Microsoft\CTF\TIP"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Notepad\DefaultFonts" -> "HKLM\SOFTWARE\Microsoft\Notepad\DefaultFonts"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Software\Microsoft\Shared Tools\Msinfo" -> "HKLM\SOFTWARE\Microsoft\Software\Microsoft\Shared Tools\Msinfo"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Control Panel\Cursors\Schemes" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cursors\Schemes"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\explorer\AutoplayHandlers" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\explorer\DriveIcons" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\explorer\KindMap" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\KindMap"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Telephony\Locations" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Locations"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Group Policy" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Policies" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\PreviewHandlers" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Setup" -> "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Console" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontDPI" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontLink" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontMapper" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Fonts" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontSubstitutes" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\GRE_Initialize" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\LanguagePack" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\NetworkCards" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Perflib" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Ports" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Print" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\ProfileList" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Time Zones" -> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\COM3" -> "HKLM\SOFTWARE\Microsoft\COM3"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\DFS" -> "HKLM\SOFTWARE\Microsoft\DFS"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Driver Signing" -> "HKLM\SOFTWARE\Microsoft\Driver Signing"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\EnterpriseCertificates" -> "HKLM\SOFTWARE\Microsoft\EnterpriseCertificates"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\EventSystem" -> "HKLM\SOFTWARE\Microsoft\EventSystem"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\MSMQ" -> "HKLM\SOFTWARE\Microsoft\MSMQ"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Non-Driver Signing" -> "HKLM\SOFTWARE\Microsoft\Non-Driver Signing"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Ole" -> "HKLM\SOFTWARE\Microsoft\Ole"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Ras" -> "HKLM\SOFTWARE\Microsoft\Ras"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Rpc" -> "HKLM\SOFTWARE\Microsoft\Rpc"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\SystemCertificates" -> "HKLM\SOFTWARE\Microsoft\SystemCertificates"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\TermServLicensing" -> "HKLM\SOFTWARE\Microsoft\TermServLicensing"
    "HKLM\SOFTWARE\Wow6432Node\Microsoft\Transaction Server" -> "HKLM\SOFTWARE\Microsoft\Transaction Server"
    "HKLM\SOFTWARE\Wow6432Node\Classes" -> "HKLM\SOFTWARE\Classes\Wow6432Node"
    "HKLM\SOFTWARE\Wow6432Node\Clients" -> "HKLM\SOFTWARE\Clients"
    "HKLM\SOFTWARE\Wow6432Node\Policies" -> "HKLM\SOFTWARE\Policies"
    "HKLM\SOFTWARE\Wow6432Node\RegisteredApplications" -> "HKLM\SOFTWARE\RegisteredApplications"


    Перечень ключей реестра, подверженных переадресации

    Такой перечень присутствует на сайте Microsoft, но он давно не обновлялся.
    Я написал скрипт (батник), который позволяет проверить индивидуальный (введенный вами) ключ на предмет его перенаправления таких видов:
    1) Shared
    2) Redirected

    Если ключ обычный - батник ничего не выведет.
    Рекомендуется пользоваться батником на виртуальной машине, т.к. он оставляет мусор в виде пустых ключей в 32-битном представлении. Они специально не удаляются в целях безопасности (чтобы ничего лишнего не наудалять).
    Также он не особо хорошо тестировался. Я на 100% не гарантирую, что он все правильно определит.
    Тем не менее, по моим ручным тестам (с подтверждением) уже нашлись расхождения даже с официальной информацией, например, на Windows 7 ключ
    является обычным, а не Shared.
    Код (DOS):

    @echo off
    SetLocal EnableExtensions

    echo Registry key redirection Tester by Dragokas
    echo.
    :: Random Data
    set "Param=Wow_Test_345165894610759061862530751907892615"
    set "Data=Dragokas-123"
    set "x32_Reg=%SystemRoot%\SysWow64\reg.exe"

    net session >NUL 2>NUL || (echo WARNING: Admin privileges required to test HKLM keys.& echo.)

    :begin
    set "key="
    set /p "key=Enter key: "
    echo.
    if "%key%"=="" exit /B
    echo "%key%" | find /i "\Wow6432Node" >NUL && (echo Wow6432Node is forbidden. &echo. & goto begin)
    echo "%key%" | find /i "\SOFTWARE\Classes" >NUL && (
      set "key32=%key:\SOFTWARE\Classes\=\SOFTWARE\Classes\Wow6432Node\%"
    ) || (
      set "key32=%key:\SOFTWARE\=\SOFTWARE\Wow6432Node\%"
    )
    :: delete x64 data
    reg delete "%key%" /v "%Param%" /f 2>NUL >&2
    :: add x32 data
    reg add "%key32%" /v "%Param%" /t REG_SZ /d %Data% /f >NUL
    :: Checking Shared mode
    reg query "%key%" /v "%Param%" 2>NUL >&2 && (
      echo Shared.
    ) || (
     rem Checking for redirection
      "%x32_Reg%" query "%key%" /v "%Param%" 2>NUL >&2 && echo Redirected.
    )
    :: Clean
    reg delete "%key32%" /v "%Param%" /f 2>NUL 1>&2
    echo.
    echo ---------------------------
    echo.
    goto begin

     
    Скрипт запускать правой кнопкой мыши "От имени администратора", если проверяете ключи HKLM.

    Спасибо за чтение.
    Надеюсь, Вам окажется полезной эта заметка.
     

    Вложения:

    Последнее редактирование: 28 май 2016
    DllPok, Kиpилл, VexMD и 2 другим нравится это.

Поделиться этой страницей