如何从合法的未知值类型中提取标准注册表值类型?

问题描述 投票:0回答:1

Background

我注意到Windows 10的HKEY_LOCAL_MACHINE中有许多合法的未知值类型。这些只是其中的一小部分:

  • 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”(见下文)中定义的预定义常量不超过一个字节,我的临时结论是我们应该将RegQueryValueEx()报告的值类型与0x000000ff进行AND运算。但是,我不确定这一点。

#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)

Updates

我刚刚在互联网上找到了一些关于此的讨论:

但是,对于某些值类型,例如0xffff100d,和0x000000ff,我得到0x0d。问题是没有标准值类型在Windows头文件中定义为0x0d。

我仍然怀疑有一种方法可以从合法的未知值类型中得出标准值类型。

请注意,我不是要了解如何解释数据。我在谈论如何从合法的未知注册表值类型中提取标准注册表值类型。

这会影响我们在代码中如何处理RegQueryValueEx()返回的值类型。或许,我们的教训是,不要急于得出一个未知值类型真的未知;我们需要使用位掩码进一步测试值类型。

Question

如何从合法的未知值类型中提取标准注册表值类型?

c windows winapi
1个回答
3
投票

注册表子系统不解释(而不是检查)密钥的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);
}

换句话说,我们可以使用0x876543210x12345678来代替REG_SZREG_DWORD。类型的任何值都是合法的。 Type仅提示实际数据类型。但是我们也可以用REG_DWORD类型存储字符串,或者用DWORD类型存储REG_SZ。我们可以保存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}

尽管有实际值数据,但值为0xFFFF00120xFFFF0019的几个子键是REG_SZ(很容易看出这是0终止的unicode字符串)0xFFFF00120xFFFF0019 - 对于那些理解这个键感的人来说,这是一些额外的信息。他们知道(硬编码)这​​里的实际数据是0-termanated宽字符串。并使用Type作为一些附加信息(标志?)。无论如何 - 如果您不知道键/值 - 如果您不理解它,您将如何使用它的值。即使知道格式。用于在UI中显示 - 仅选项原始十六进制视图

© www.soinside.com 2019 - 2024. All rights reserved.