如何从合法的未知值类型中提取标准注册表值类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从合法的未知值类型中提取标准注册表值类型?相关的知识,希望对你有一定的参考价值。
Background
我注意到Windows 10的HKEY_LOCAL_MACHINE中有许多合法的未知值类型。这些只是其中的一小部分:
- 0x100000
[HKEY_LOCAL_MACHINESYSTEMDriverDatabaseDriverPackageshidbthle.inf_amd64_55f7f576bf549669ConfigurationsHidBthLE.NTDevice] "WUDF"
- 0x200000
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass{4d36e96c-e325-11ce-bfc1-08002be10318}ConfigurationResetDriver] "DevLoader"
- 0x40007
[HKEY_LOCAL_MACHINESYSTEMDriverDatabaseDriverPackagescdrom.inf_amd64_21e18060f597c313Configurationscdrom_installServicescdrom] "AutoRunAlwaysDisable"
- 0xffff0009
[HKEY_LOCAL_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Interfaces{0176DBBA-3617-44FF-BA79-90375AAC4B6A}Properties{a111f1f4-5923-47c0-9a68-d0bafb577901} 004] "(Default)"
- 0xffff000d
[HKEY_LOCAL_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Filters{171C5016-3D19-4CB2-9556-63E586EE5010}Properties{a111f1f7-5923-47c0-9a68-d0bafb577901} 002] "(Default)"
- 0xffff100d
[HKEY_LOCAL_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Filters{E475CF9A-60CD-4439-A75F-0079CE0E18A1}Properties{a111f1f0-5923-47c0-9a68-d0bafb577901} 052] "(Default)"
- 0xffff2012
[HKEY_LOCAL_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Clients{54494F4E-5441-4B53-CCB9-061A6EC4BF6E}Properties{a111f1f1-5923-47c0-9a68-d0bafb577901} 002] "(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
我刚刚在互联网上找到了一些关于此的讨论:
- https://github.com/williballenthin/python-registry/issues/31
- https://github.com/williballenthin/python-registry/issues/62
但是,对于某些值类型,例如0xffff100d,和0x000000ff,我得到0x0d。问题是没有标准值类型在Windows头文件中定义为0x0d。
我仍然怀疑有一种方法可以从合法的未知值类型中得出标准值类型。
请注意,我不是要了解如何解释数据。我在谈论如何从合法的未知注册表值类型中提取标准注册表值类型。
这会影响我们在代码中如何处理RegQueryValueEx()返回的值类型。或许,我们的教训是,不要急于得出一个未知值类型真的未知;我们需要使用位掩码进一步测试值类型。
Question
如何从合法的未知值类型中提取标准注册表值类型?
注册表子系统不解释(而不是检查)密钥的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或不终止字符串
如何从合法的未知值类型中提取标准注册表值类型?
在这里合法多余的词。一般情况下 - 没办法。如果你不知道这里保存了什么,这有什么意义。我们说可以显示值为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-termanated宽字符串。并使用Type
作为一些附加信息(标志?)。无论如何 - 如果您不知道键/值 - 如果您不理解它,您将如何使用它的值。即使知道格式。用于在UI中显示 - 仅选项原始十六进制视图
以上是关于如何从合法的未知值类型中提取标准注册表值类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中使用 RegQueryValueEx(..) 从注册表中读取 REG_MULTI_SZ 类型值