Как создать скрытый ключ реестра
Существенное отличие между 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 функций, а также какие привилегии должно иметь приложение для использования той или иной функции.
|
|
|
NtCreateKey |
RegCreateKey , RegCreateKeyEx
|
|
NtOpenKey |
RegOpenKey , RegOpenKeyEx
|
|
NtDeleteKey |
RegDeleteKey |
|
NtFlushKey |
RegFlushKey |
|
NtSetInformationKey |
|
|
NtQueryKey |
RegQueryInfoKey |
|
NtEnumerateKey |
RegEnumerateKey , RegEnumerateKeyEx
|
|
NtNotifyChangeKey |
RegNotifyChangeKeyValue |
|
NtDeleteValueKey |
RegDeleteValue |
|
NtSetValueKey |
RegSetValue , RegSetValueEx
|
|
NtQueryValueKey |
RegQueryValue , RegQueryValueEx
|
|
NtEnumerateValueKey |
RegEnumValue |
|
NtQueryMultipleValueKey |
RegQueryMultipleValues |
|
NtEnumerateKey |
RegEnumKey , RegEnumKeyEx
|
|
NtSaveKey |
RegSaveKey |
SeBackupPrivilege |
NtRestoreKey |
RegRestoreKey |
SeRestorePrivilege |
NtLoadKey |
RegLoadKey |
SeRestorePrivilege |
NtLoadKey2 |
|
SeRestorePrivilege |
NtReplaceKey |
RegReplaceKey |
SeRestorePrivilege |
NtUnloadKey |
RegUnloadKey |
SeRestorePrivilege |
NtClose |
CloseHandle |
|
Дата: 24.02.2011
Избранное
Остальное
По вопросам сотрудничества и другим вопросам по работе сайта пишите на cleogroup[собака]yandex.ru