隐藏条目(或"fin 注册表"



我正试图用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的列表。例如,您将使用NtCreateKeyZwCreateKey而不是RegCreateKeyExW。Win32 API假定所有字符串都以NUL字符结尾,而本机API对应方使用UNICODE_STRING结构作为名称。

我会在黑暗中冒险,因为我从未尝试过这样做。

您似乎使用了错误的函数来创建注册表项。你应该使用NtCreateKey方法,因为RegCreateKeyEx[AW]会注意到你的'',并将其截断

为什么不使用示例中提供的类?它提供了一种称为CreateHiddenKey的方法。要使用它,只需在它之前调用SetKey。它会更干净。

最新更新