背景
我注意到 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)
更新
我刚刚在互联网上发现了一些关于此问题的讨论:
- https://github.com/williballenthin/python-registry/issues/31
- https://github.com/williballenthin/python-registry/issues/62
但是,对于某些值类型,例如0xffff100d,AND与0x000000ff,我得到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);
}
换句话说,我们可以使用类型0x87654321
和0x12345678
来代替REG_SZ
和REG_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}
几个子项的值类型为0xFFFF0012
和0xFFFF0019
,尽管实际值数据是REG_SZ
(很容易看出这是以0结尾的unicode字符串)
0xFFFF0012
和 0xFFFF0019
- 这是为了解此按键含义的人提供的一些附加信息。他们知道(硬编码)这里的实际数据是以 0 结尾的宽字符字符串。并使用 Type
作为一些附加信息(标志?)。无论如何 - 如果你不知道键/值 - 如果你不理解它的意义,你如何使用它的值。即使知道格式。用于在 UI 中显示 - 仅选项原始十六进制 View
关于c - 如何从合法的未知值类型中提取标准注册表值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433998/