隐藏条目(或“注册表”

时间:2011-06-04 16:50:30

标签: winapi registry

我试图用C ++ / windows隐藏注册表中的一些值(例如序列号) 所以我一直在看这篇文章http://www.codeproject.com/KB/system/NtRegistry.aspx
其中说:

  

这怎么可能?答案是   这个名字被算作一个   Unicode字符串可以明确包含   NULL字符(0)作为的一部分   名称。例如,“Key \ 0”。包括   最后的NULL,长度   Unicode字符串指定为4。   绝对没有办法指定   此名称使用Win32 API,因为如果   “Key \ 0”作为名称API传递   将确定名称是“密钥”   (长度为3个字符)因为   “\ 0”表示名称的结尾。

     

当一个键(或任何其他具有一个对象的对象)   诸如命名事件,信号量之类的名称,   或者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] = '\0';
long result = RegCreateKeyExW(HKEY_LOCAL_MACHINE, 
                              wKeyName,
                              0,
                              NULL,
                              0,
                              KEY_ALL_ACCESS,
                              NULL,
                              &keyHandle,
                              &status);

其中m_keyName是ASCII文本而wKeyName是宽字符文本,但在regedit中我看到它被视为相同而且键只是在我把'\ 0'放在哪里。

它出了什么问题?

2 个答案:

答案 0 :(得分:1)

问题是您使用的是Win32 API而不是NT Native API。有一个关于1/2 the article that you referenced的表格,其中包含Native API列表。例如,您可以使用NtCreateKeyZwCreateKey代替RegCreateKeyExW。 Win32 API假定所有字符串都由NUL字符终止,而Native API对应物使用UNICODE_STRING结构作为名称。

答案 1 :(得分:1)

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

您似乎使用了错误的功能来创建注册表项。您应该使用NtCreateKey方法,因为RegCreateKeyEx [AW]会注意到您的'\0'并切断它。

为什么不使用示例中提供的类?它提供了一个名为CreateHiddenKey的方法。要使用它,只需在它之前调用SetKey即可。它会更清洁。