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

标签 c windows winapi

背景

我注意到 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]“(默认值) “
  • 0xffff000d [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Filters{171C5016-3D19-4CB2-9556-63E586EE5010}\Properties{a111f1f7-5923-47c0-9a68-d0bafb577901}\0002]“(D错误) “
  • 0xffff100d [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Filters{E475CF9A-60CD-4439-A75F-0079CE0E18A1}\Properties{a111f1f0-5923-47c0-9a68-d0bafb577901}\0052] "(Def奥特) “
  • 0xffff2012 [HKEY_LOCAL_MACHINE\SYSTEM\Setup\Upgrade\NetworkDriverBackup\Control\NetworkSetup2\Clients{54494F4E-5441-4B53-CCB9-061A6EC4BF6E}\Properties{a111f1f1-5923-47c0-9a68-d0bafb577901}\0002] "(Def奥特) “

有趣的是,NirSoft RegScanner将值类型 0xffff0009 解释为 REG_FULL_RESOURCE_DESCRIPTOR (0x09)。

由于“winnt.h”中定义的预定义常量(见下文)不超过一个字节,我的临时结论是我们应该ANDRegQueryValueEx()报告的值类型。与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)

更新

我刚刚在互联网上发现了一些关于此问题的讨论:

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

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

请注意,我并不是试图理解应该如何解释数据。我正在讨论如何从合法的未知注册表值类型中提取标准注册表值类型。

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

问题

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

最佳答案

注册表子系统不会解释(也不检查) key 的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 的任何值都是合法的。 Type 只是实际数据类型的提示。但我们也可以使用 REG_DWORD 类型或 DWORD 类型存储 REG_SZ 类型的字符串。我们可以保存 0 或不保存 0 结尾的字符串

How to extract the standard registry value type from a legitimate unknown value type?

这里多余的词是合法的。一般情况下-没办法。如果你不知道这里保存了什么以及这有什么意义。我们说可以将值显示为 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 结尾的宽字符字符串。并使用 Type 作为一些附加信息(标志?)。无论如何 - 如果你不知道键/值 - 如果你不理解它的意义,你如何使用它的值。即使知道格式。用于在 UI 中显示 - 仅选项原始十六进制 View

关于c - 如何从合法的未知值类型中提取标准注册表值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433998/

相关文章:

c - 如何使用 C 和 WinAPI 将包含特殊字符的文本复制到剪贴板?

c - arr 和 *arr 有什么区别?

windows - 有没有办法从 VB.NET 控制第三方 EXE 文件?

Python Ctypes 键盘事件

c - 简单的 Makefile : undefined reference to symbol 'cos@@GLIBC_2.2.5' 问题

c++ - 如何在不使用键盘的情况下按键盘上的键?

windows - 在 x64 中第二次 RichEdit 初始化后崩溃

c++ - 如何将函数指针作为 lpParameter 传递给 CreateThread?

Windows 搜索 - IFilter 搜索词突出显示

c - 创建后 Lua c API 更改库