2011-06-04 28 views
1

我試圖隱藏在註冊表中與C++/Windows的一些值(如序列號) ,所以我一直在看這篇文章http://www.codeproject.com/KB/system/NtRegistry.aspx
其中說:隱藏條目(或「鰭註冊表

這怎麼可能呢?答案是 那這是一個算作一個 Unicode字符串的名稱可以明確地包括 NULL字符(0)作爲 名稱的一部分。比如,「關鍵\ 0 「要在末尾包含 NULL,則 Unicode字符串的長度爲s規定爲4. 絕對沒有辦法指定 此名稱使用Win32 API,因爲如果 「Key \ 0」作爲名稱傳遞,API 將確定名稱爲「Key」 (3個字符在長度),因爲 「\ 0」表示名稱的結尾。

當一個鍵(或具有 名稱的任何其他對象,例如一個指定的事件,信號量, 或互斥)與這樣的名稱創建, 使用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'的位置。

它有什麼問題嗎?

回答

1

問題是您使用的是Win32 API而不是NT Native API。有一個表格,其中包含原生API列表,其中有一個包含原生API列表的1/2到the article that you referenced。例如,您將使用NtCreateKeyZwCreateKey而不是RegCreateKeyExW。 Win32 API假定所有字符串都以NUL字符結尾,而Native API對應的名稱使用UNICODE_STRING結構。

1

我會在黑暗中刺傷,因爲我從來沒有試過這樣做。

看來您正在使用錯誤的函數來創建您的註冊表項。您應該使用NtCreateKey方法,因爲RegCreateKeyEx [AW]會注意到您的'\0'並切斷它。

爲什麼不使用示例中提供的類?它提供了一種稱爲CreateHiddenKey的方法。要使用它,只需在它之前撥打SetKey即可。它會更乾淨。