Хотя я рано обрадовался.При такой записи он блокирует обращение ко всем ветвям реестра по ключу "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" :-( Может кто знает , как именно NtCreateKey распознает в какую ветвь реестра идет обращение?
Вот выяснил (в том же ядре), что предворительно UNICODE_STRING надо передать в функцию RtlFormatCurrentUserKeyPath, но вот где взять библиотеку для ее использования не знаю, никто не подскажет?
Aspire а какой h файл нужно подключить?Я просто не знаю как ntdll.lib подключить к сорцу на WINDDK.Заранее благодарен.
hawk Эх, открываешь файл makefile.def, он в директории bin лежит, находишь там во это (по-моему) Код (Text): !ELSEIF "$(TARGETTYPE)" == "DRIVER" TARGETEXT=sys !if "$(DRIVERTYPE)" == "wdm" || "$(DRIVERTYPE)" == "WDM" TARGETLIB=$(DDK_LIB_PATH)\wdm.lib !ELSEIF "$(DRIVERTYPE)" == "VXD" TARGETEXT=vxd !ELSE TARGETLIB=$(DDK_LIB_PATH)\ntoskrnl.lib $(DDK_LIB_PATH)\hal.lib $(DDK_LIB_PATH)\wmilib.lib !ENDIF и в строку TARGETLIB добавляешь $(DDK_LIB_PATH)\ntdll.lib
Все сделал как Вы сказали-не помогло. Выдает: error C4013: 'RtlFormatCurrentUserKeyPath' undefined; assuming extern returning int Не зная в чем может быть дело. В Google ничего не нарыл.
hawk А у себя в дефайнах или в самом коде прототип RtlFormatCurrentUserKeyPath описывал? Обычно ошибка "error C4013: 'что-то там' undefined; assuming extern returning int" говорит о том, что компилятор просто не знает, что перед ним. Тем более что эта функция недокументирована. Попробуй в код добавить Код (Text): NTSYSAPI NTSTATUS NTAPI RtlFormatCurrentUserKeyPath( OUT PUNICODE_STRING RegistryPath );
Похоже, что перед передачей NtCreateKey происходит установка RootKey .У когонибудь есть мысли на этот счет?
Всё!Проблема решенна!Я вычислил!Ответ храниться перед sysenter. П.С.Кому интересно или не выходит пишите в личку.
hawk Может, еще денег за это попросишь? Так не делается. Если сам споткнулся на чем то - предупреди другого.
Aspire ну за деньги ты загнул. А вообще сори за тупость. Короче, я стал просматривать работу RegCreateKeyEx , которая в конечном счете передает параметры NtCreateKey. Перед переходом непосредственно к сервису, как известно в регистр eax помещается номер сервиса в таблице сервисов (в одной из), а в edx помещается указатель на передоваемые аргументы-т.е. указатель на конкретный адрес в стеке, после чего происходит sysentr. Так вот , я посмотрел , что именно передается NtCreateKey и проэкспереминтировал с разными HKEY.Сравнив результаты я пришел к выводу , что основная ветвь реестра передается в ObjectAttributes->RootDirectory; Я внес соответствующие изменения в драва, а именно. .......... HANDLE Root; ................ Root=ObjectAttributes->RootDirectory; if (wcslen(wcsFileName) > 0)RtlInitUnicodeString(&uniFileName, wcsFileName); if((ULONG)Root==0x1C){ if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) { status = STATUS_OBJECT_NAME_NOT_FOUND; goto done; } } done: ................. В этом примере я отлавливаю обращения к HKEY_LOCAL_MACHINE; для него значение RootDirectory=0x1C, а точнее не для него , а для подключа \MACHINE. На уровне Native API реестр выглядит совсем по-другому. Вместо нескольких корневых псевдоключей HKEY_XXX используется единственный ключ “\REGISTRY” с двумя подключами “\USER” и “\MACHINE”: \REGISTRY \USER \.DEFAULT \S-FOO \S-BAR \MACHINE \HARDWARE \SAM \SECURITY \SOFTWARE \SYSTEM Вот собственно и все. А основной трабл который я допустил изначально , это то что я не задался вопросом о роли InitializeObjektAttributes, которая и переводит передоваемую ей обычно строку вида "\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" в привычную строку вида SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run и помещает ее в ObjectAttributes->ObjectName,а в соответсвиис \\REGISTRY\\MACHINE\\ или \\REGISTRY\\USER\\ выставляет значение ObjectAttributes->RootDirectory. Для ключа \REGISTRY\\USER\\ значение ObjectAttributes->RootDirectory=0x034.