我正试图用C++/windows在注册表中隐藏一些值(如序列号)所以我一直在看这篇文章http://www.codeproject.com/KB/system/NtRegistry.aspx
上面写着:
这怎么可能?答案是一个被计算为Unicode字符串可以显式包含NULL字符(0)作为名称例如,"Key\0"。包括末尾的NULLUnicode字符串被指定为4。绝对没有办法具体说明该名称使用Win32 API,因为如果"密钥\0"作为名称传递,API将确定名称为"Key"(长度为3个字符),因为"\0"表示名称的末尾。
当键(或任何其他具有诸如命名事件、Semaphore等的名称,或Mutex)是用这样的名称创建的,使用Win32 API的任何应用程序将无法打开该名称,甚至尽管他们似乎看到了。
所以我试着做一些类似的事情:
HKEY keyHandle;
PHKEY key;
unsigned long status = 0;
wchar_t *wKeyName = new wchar_t[m_keyLength];
MultiByteToWideChar(CP_ACP, 0, m_keyName, m_keyLength, wKeyName, m_keyLength);
wKeyName[18] = ' ';
long result = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
wKeyName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&keyHandle,
&status);
其中m_keyName
是ASCII文本,wKeyName是宽字符文本,但在regedit
中,我看到它被一视同仁,键只是在我放"\0"的地方剪切。
它怎么了?
问题是您使用的是Win32 API,而不是NT Native API。在您引用的文章中,有一个关于1/2的表,其中包含Native API的列表。例如,您将使用NtCreateKey
或ZwCreateKey
而不是RegCreateKeyExW
。Win32 API假定所有字符串都以NUL字符结尾,而本机API对应方使用UNICODE_STRING
结构作为名称。
我会在黑暗中冒险,因为我从未尝试过这样做。
您似乎使用了错误的函数来创建注册表项。你应该使用NtCreateKey
方法,因为RegCreateKeyEx
[AW]会注意到你的' '
,并将其截断
为什么不使用示例中提供的类?它提供了一种称为CreateHiddenKey
的方法。要使用它,只需在它之前调用SetKey
。它会更干净。