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

时间:2018-05-20 10:43:19

标签: 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] "(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 0x000000ff ,我得 0x0d 。问题是在Windows头文件中没有定义为 0x0d 的标准值类型。

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

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

这会影响我们在代码中处理RegQueryValueEx()返回的值类型的方式。或许,从匆忙中得出的结论是,未知的价值类型确实是未知的;我们需要使用位掩码进一步测试值类型。

问题

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

1 个答案:

答案 0 :(得分:3)

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

换句话说,我们可以使用0x12345678REG_SZ类型代替REG_DWORDType。类型的任何值都是合法的。 REG_DWORD仅提示实际数据类型。但我们也可以存储DWORD类型的字符串或REG_SZ类型的REG_BINARY字符串。我们可以保存0或不终止字符串

  

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

这里合法多余的词。一般情况下 - 没办法。如果你不知道这里保存了什么,这有什么意义。我们说可以将值显示为HKEY_LOCAL_MACHINE SYSTEM Setup Upgrade NetworkDriverBackup Control NetworkSetup2 Clients {54494F4E-5441-4B53-CCB9-061A6EC4BF6E} Properties {a111f1f0-5923-47c0-9a68-d0bafb577901} - 重新解释的字节。

另一个例子,在win10中我在

下查看
0xFFFF0012

尽管实际值数据为0xFFFF0019,但是值为REG_SZ0xFFFF0012的几个子键是0xFFFF0019(很容易看到这是0终止的unicode字符串) Typelet navbar = document.querySelector("nav"); let offset = navbar.offsetTop; // Makes the menu sticky function stick() { if (window.pageYOffset >= offset) { navbar.classList.add("sticky") } else { navbar.classList.remove("sticky"); } } // Makes the menu responsive function collapse() { if (navbar.className === "responsive") { navbar.classList.remove("responsive"); } else { navbar.classList.add("responsive") } } - 对于理解这种键感的人来说,这是一些额外的信息。他们知道(硬编码)这​​里的实际数据是0-termanated宽字符串。并使用SintaxError:invalid o unexpeted toked 作为一些附加信息(标志?)。无论如何 - 如果您不知道键/值 - 如果您不理解它,您将如何使用它的值。即使知道格式。用于在UI中显示 - 仅选项原始十六进制视图