Задача - скрыть значение некоторых ключей в реестре. Переделал исходник MS-REMa (Перехват АПИ функций Часть 1) Перехватываю Function ZwQueryValueKey(KeyHandle:dword; ValueName: PUnicodeString; KeyValueInformationClassword; KeyValueInformation:Pointer; Lengthword; ResultLength:pointer): NTStatus; stdcall; external 'ntdll.dll'; (читал МСДН и разбирался со структурами). С этим все получилось, regedit видит "измененные" значения. Однако msconfig или другой менеджер атозапуска ключи видит. Посмотрел в отладочном лог-файле - они такую функцию то и не юзают, т.е. мой обработчик не вызввается. Там же прочел про функцию ZwEnumerateValueKey The ZwEnumerateValueKey routine gets information about the value entries of an open key. NTSTATUS ZwEnumerateValueKey( IN HANDLE KeyHandle, IN ULONG Index, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength ); Установил перехват и на нее. Перехватывает что-то, но не их опросы. Вопрос, какие еще функци нужно перехватывать чтобы сокрыть в реестре? (именно интересует вопрос изменения значения ключа, а не скрытие самого ключа) Спасибо. Книжки, ссылочки..
Klayd, я еще перепроверю тот факт, но перехват этой функции не отлавливал обращений Мсконфига и нескольких других утилит. Буду проверять еще.. Видать накасячил где..
судя по МСДМ, ZwEnumerateKey мне даст только имена разделов. http://msdn.microsoft.com/en-us/library/ms804365.aspx И даст мне KEY_INFORMATION_CLASS В описании структур (разных уровней) нет упоминания о значениях ключа. А мне именно его надо сокрыть.. ZwQueryValueKey и ZwEnumerateValueKey явно не хватает. Таким образом обманул только регедит виндоус..
Кажется ошибка нашлась. Помогите описать структуру. МСДН: KEY_VALUE_INFORMATION_CLASS : А именно эти две: typedef struct _KEY_VALUE_FULL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataOffset; ULONG DataLength; ULONG NameLength; WCHAR Name[1]; // Variable size } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; typedef struct _KEY_VALUE_PARTIAL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataLength; UCHAR Data[1]; // Variable size } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; ----------------------- В Делфу переписал таким образом: PKEY_VALUE_PARTIAL_INFORMATION = ^KEY_VALUE_PARTIAL_INFORMATION; KEY_VALUE_PARTIAL_INFORMATION = packed record TitleIndex: ULONG; Type1: ULONG; DataLength: ULONG; Data: array [0..0] of wideChar; //!!!! подозрение сюда!! что не windwchar end; PKEY_VALUE_FULL_INFORMATION = ^KEY_VALUE_FULL_INFORMATION; KEY_VALUE_FULL_INFORMATION = packed record TitleIndex: ULONG; Type1: ULONG; DataOffset: ULONG; DataLength: ULONG; NameLength: ULONG; Name: array [0..0] of WideChar; end; Вся загвоздка в том что я не знаю что сопоставить в делфе типуUchar Если именно таким образом описывать структуру, то проблем не возникает разве лишь с регедитом. Если написать программу на делфи которая проверяет этот ключ, то при запущенной библиотеке DLL возвращяет пустое значение. Если в обработчике отключить манипулации с данными, то получает истинные значения.
Rustem, ну хороший совет конечно же. Но из-за небольшой мелочи в данном случае я этого делать не буду. Уже все готово, за исключением вот этого вот касяка...
Итак, вопрос еще актуален. На данный момент прога перехватывает 2 функции в юзермоде. Первая - Function ZwQueryValueKey(KeyHandle:dword; ValueName: PUnicodeString; KeyValueInformationClassword; KeyValueInformation:Pointer; Lengthword; ResultLength:pointer): NTStatus; stdcall; external 'ntdll.dll'; В ней стоит обработчик что подменяет значения для определенных значений реестра. Работает если смотреть регедитом, или например апишной функцией такой: RegQueryValueEx То есть мой обработчик срабатывает, все меняется. Однако, запусти мсконфиг или другую утилиту - там показываются истинные значения. Я исследовал этот вопрос Regmon`ом. Вот что получилось: Когда лезу в реестр регедитом или своей прогой, использующие апи функцию RegQueryValueEx, то регмон пишет в колонке Request значение QueryValue А если другими утилитами, то уже запрос будет EmunerateValue. Ответ видимо здесь и кроется, что вызывается другая функция, для которой ZwQueryValueKey не является базовой. Но как узнать, что за базовая функция у меня во втором случае, что перехватывать? ZwEnumerateValueKey у меня не работает, не ловит их запросы, хотя сам по себе перехватчик иногда ловит какие-то запросы. МСДН уже перерыл, что перехватывать не знаю. А хотелось бы.
посмотри экспорт нтдлл - например NtQueryMultipleValueKey NtQueryKey А в тему про перехват NtEnumerateKey: перехват неэкспортируемой CmEnumerateKey поиском кода, т.е. без хуков в SST старый мой баян, но вдруг кому-то интересно http://b4.cih.ms/CmHideDrv.zip PS: привет Great!
test555 можешь выложить исходник что у тебя всетаки получилось? Мне не хватает описания некоторых структур да и вообще поглядеть хочется