Как извлечь стандартный тип значения реестра из допустимого неизвестного типа значения? - PullRequest
0 голосов
/ 20 мая 2018

Фон

Я заметил, что в HKEY_LOCAL_MACHINE Windows 10 есть много законных неизвестных типов значений. Это лишь несколько из них:

  • 0x100000 [HKEY_LOCAL_MACHINE\SYSTEM\DriverDatabase\DriverPackages\hidbthle.inf_amd64_55f7f576bf549669\Configurations\HidBthLE.NT\Device] "WUDF"
  • 0x200000 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{4d36e96c-e325-11ce-bfc1-08002be10318}\Configuration\Reset\Driver] "DevLoader"
  • 0x40007 [HKEY_LOCAL_MACHINE\SYSTEM\DriverDatabase\DriverPackages\cdrom.inf_amd64_21e18060f597c313\Configurations\cdrom_install\Services\cdrom] "AutoRunAlwaysDisable"
  • 0xffff0009 [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Interfaces{0176DBBA-3617-44FF-BA79-90375AAC4B6A}\Properties{a111f1f4-5923-47c0-9a68-d0bafb577901}\0004] "(Default)"
  • 0xffff000d [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Filters{171C5016-3D19-4CB2-9556-63E586EE5010}\Properties{a111f1f7-5923-47c0-9a68-d0bafb577901}\0002] "(Default)"
  • 0xffff100d [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Filters{E475CF9A-60CD-4439-A75F-0079CE0E18A1}\Properties{a111f1f0-5923-47c0-9a68-d0bafb577901}\0052] "(Default)"
  • 0xffff2012 [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Clients{54494F4E-5441-4B53-CCB9-061A6EC4BF6E}\Properties{a111f1f1-5923-47c0-9a68-d0bafb577901}\0002] "(Default)"

Интересно, что NirSoft RegScanner интерпретирует тип значения 0xffff0009 как REG_FULL_RESOURCE_DESCRIPTOR (0x09).

Поскольку предопределенные константы, определенные в "winnt.h" (см. Ниже), содержат не более одного байта, мой временный вывод заключается в том, что нам следует AND тип значения, сообщенный RegQueryValueEx () с 0x000000ff .Однако я не уверен в этом.

#define REG_NONE                    ( 0ul ) // No value type
#define REG_SZ                      ( 1ul ) // Unicode nul terminated string
#define REG_EXPAND_SZ               ( 2ul ) // Unicode nul terminated string
                                            // (with environment variable references)
#define REG_BINARY                  ( 3ul ) // Free form binary
#define REG_DWORD                   ( 4ul ) // 32-bit number
#define REG_DWORD_LITTLE_ENDIAN     ( 4ul ) // 32-bit number (same as REG_DWORD)
#define REG_DWORD_BIG_ENDIAN        ( 5ul ) // 32-bit number
#define REG_LINK                    ( 6ul ) // Symbolic Link (unicode)
#define REG_MULTI_SZ                ( 7ul ) // Multiple Unicode strings
#define REG_RESOURCE_LIST           ( 8ul ) // Resource list in the resource map
#define REG_FULL_RESOURCE_DESCRIPTOR ( 9ul ) // Resource list in the hardware description
#define REG_RESOURCE_REQUIREMENTS_LIST ( 10ul )
#define REG_QWORD                   ( 11ul ) // 64-bit number
#define REG_QWORD_LITTLE_ENDIAN     ( 11ul ) // 64-bit number (same as REG_QWORD)

Обновления

Я только что нашел некоторые обсуждения по этому поводу в Интернете:

Однако для некоторых типов значений, например, 0xffff100d , AND it with 0x000000ff ,Я получаю 0x0d .Проблема в том, что в заголовочных файлах Windows нет стандартных типов значений, которые определены как 0x0d .

Я все еще подозреваю, что есть способ сделать стандартный тип значения из легитимного неизвестный тип значения.

Обратите внимание, что я не пытаюсь понять, как следует интерпретировать данные.Я говорю о том, как извлечь стандартный тип значения реестра из допустимого неизвестного типа значения реестра.

Это влияет на то, как мы должны обрабатывать тип значения, возвращаемый RegQueryValueEx () в нашемкод.Возможно, урок не спешит заключить, что неизвестный тип значения действительно неизвестен;нам нужно дополнительно проверить тип значения с помощью битовой маски.

Вопрос

Как извлечь стандартный тип значения реестра из допустимого неизвестного типа значения?

1 Ответ

0 голосов
/ 20 мая 2018
Подсистема реестра

не интерпретирует (и не проверяет) значение ключа Type.он просто хранит или загружает как DWORD данные.В результате мы в принципе можем использовать любое значение для типа с любыми данными.скажем, например, мы можем сделать

HKEY hKey;
if (!RegOpenKeyExW(hRootKey, lpSubKey, 0, KEY_SET_VALUE, &hKey))
{
    RegSetValueExW(hKey, 0, 0, 0x87654321, (PBYTE)L"demo", sizeof(L"demo"));
    DWORD ticks = GetTickCount();
    RegSetValueExW(hKey, L"TickCount", 0, 0x12345678, (PBYTE)&ticks, sizeof(ticks));
    RegCloseKey(hKey);
}

другими словами, мы можем использовать типы 0x87654321 и 0x12345678 вместо REG_SZ и REG_DWORD, например.любое значение для типа является законным.Type - только подсказка для фактического типа данных.но мы, например, также можем хранить строку с типом REG_DWORD или DWORD с типом REG_SZ.мы можем сохранить 0 или не завершающую 0 строку

Как извлечь стандартный тип значения реестра из допустимого неизвестного типа значения?

допустимое здесь избыточное слово.в общем случае - никак.если не знаешь что здесь сохранилось и какой в ​​этом смысл.мы говорим, может отображать значение в виде REG_BINARY - переинтерпретированы байты.

для другого примера, в win10 я просматриваю под

HKEY_LOCAL_MACHINE
  SYSTEM
    Setup
      Upgrade
        NetworkDriverBackup
          Control
            NetworkSetup2
              Clients
                {54494F4E-5441-4B53-CCB9-061A6EC4BF6E}
                  Properties
                    {a111f1f0-5923-47c0-9a68-d0bafb577901}

несколько подразделов со значениями, тип которых 0xFFFF0012 и 0xFFFF0019 несмотря на то, что фактическое значение данных равно REG_SZ (легко увидеть, что это юникодные строки с нулем в конце), 0xFFFF0012 и 0xFFFF0019 - это дополнительная информация для тех, кто понимает смысл этих ключей.они знают (с жестким кодом), что фактические данные здесь - это широкая символьная строка с 0 терминами.и используйте Type в качестве дополнительной информации (флаги?).В любом случае - если ключ / значение неизвестно для вас - как вы можете использовать его значения, если вы не понимаете его смысла.даже если знаешь формат.для отображения в пользовательском интерфейсе - только опция необработанного шестнадцатеричного представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...