Скрытие записи (или «поиск в реестре» - PullRequest
1 голос
/ 04 июня 2011

Я пытаюсь скрыть некоторые значения в реестре (например, серийные номера) с помощью C ++ / windows, поэтому я просматривал эту статью http://www.codeproject.com/KB/system/NtRegistry.aspx
, в которой говорится:

Как это возможно?Ответ заключается в том, что имя, которое считается как строка в Юникоде, может явно включать символы NULL (0) в качестве части имени.Например, «Ключ \ 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 ]

1 голос
/ 04 июня 2011

Я сделаю удар в темноте, поскольку я никогда не пытался это сделать.

Похоже, что вы используете неправильную функцию для создания раздела реестра.Вам следует использовать метод NtCreateKey, потому что RegCreateKeyEx [AW] заметит ваш '\0' и отрубит его.

Почему бы не использовать класс, представленный в примере?Он предоставляет метод с именем CreateHiddenKey.Чтобы использовать это, просто позвоните SetKey перед этим.Было бы намного чище.

1 голос
/ 04 июня 2011

Проблема в том, что вы используете Win32 API, а не NT Native API. Существует примерно половина страницы статьи, на которую вы ссылались , которая содержит список собственных API. Например, вместо RegCreateKeyExW вы должны использовать NtCreateKey или ZwCreateKey. Win32 API предполагает, что все строки завершаются символом NUL, тогда как аналоги Native API используют структуру UNICODE_STRING для имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...