hex.pp.ua

Скрытые ключи реестра

Как создать скрытый ключ реестра




Существенное отличие между Win32 API и Native API заключается в том, что в этих интерфейсах по-разному обрабатываются имена. В Win32 API строки интерпретируются как 8-битные (ANSI) или 16-битные (UNICODE) последовательности символов, с конечным нулевым символом. В Native API все строки являются UNICODE-строками, а длина хранится вместе со строкой. Обычно это различие никак не проявляется, но оно может вызвать интересную ситуацию: существует класс имён, к которым можно получить доступ, используя Native API, но нельзя, используя WinAPI.

В статье «Обход ограничений FAT32/NTFS» описано, как провернуть подобный трюк для создания недоступных файлов, а здесь рассматриваются ключи реестра.

Как же создать скрытый ключ реестра? Дело в том, что UNICODE-строки, использующиеся в Native API могут содержать внутри себя нулевой символ (0x0000, NULL). Например L"Key\0". Чтобы 0 считался частью строки надо задать её длину равной четырём символам. В такой ситуации, используя Win32 API не получится никаким образом получить доступ к объекту с таким именем, так как обработка строки в Win32 API заканчивается на первом встреченном нулевом символе. Один ноль на конце или два - для Win32 API это будут абсолютно одинаковые имена. Win32 API будет считать их одним именем «Key» (3 символа), потому что символ \0 означает конец строки.

Когда создаётся ключ (или другой именованный объект, например событие, семафор или мьютекс) с таким именем, любое приложение, использующее Win32 API будет неспособно открыть его по имени, даже если само имя будет отображаться.

Существует C++ класс CNtRegistry, который использует для манипуляций с реестром только Native API. Этот класс используется в приложении NtRegEdit — аналоге стандартного редактора реестра. Доступен исходный код приложения, там и можно посмотреть пример как программно создавать скрытые ключи.

Позже я приведу примеры кода на этой странице, когда сам разберусь с данной возможностью =).

Функции работы с реестром Win32 и Native API

В этой таблице показано, какие Native API функции для работы с реестром являются аналогами Win32 API функций, а также какие привилегии должно иметь приложение для использования той или иной функции.

Функции Native API
Связанные функции Win32 API
Необходимые привилегии
NtCreateKey
RegCreateKey, RegCreateKeyEx
N/A
NtOpenKey
RegOpenKey, RegOpenKeyEx
N/A
NtDeleteKey
RegDeleteKey
N/A
NtFlushKey
RegFlushKey
N/A
NtSetInformationKey
None
N/A
NtQueryKey
RegQueryInfoKey
N/A
NtEnumerateKey
RegEnumerateKey, RegEnumerateKeyEx
N/A
NtNotifyChangeKey
RegNotifyChangeKeyValue
N/A
NtDeleteValueKey
RegDeleteValue
N/A
NtSetValueKey
RegSetValue, RegSetValueEx
N/A
NtQueryValueKey
RegQueryValue, RegQueryValueEx
N/A
NtEnumerateValueKey
RegEnumValue
N/A
NtQueryMultipleValueKey
RegQueryMultipleValues
N/A
NtEnumerateKey
RegEnumKey, RegEnumKeyEx
N/A
NtSaveKey
RegSaveKey
SeBackupPrivilege
NtRestoreKey
RegRestoreKey
SeRestorePrivilege
NtLoadKey
RegLoadKey
SeRestorePrivilege
NtLoadKey2
None
SeRestorePrivilege
NtReplaceKey
RegReplaceKey
SeRestorePrivilege
NtUnloadKey
RegUnloadKey
SeRestorePrivilege
NtClose
CloseHandle
N/A


Дата: 24.02.2011


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт. По поводу рекламы обращайтесь на почту [email protected]