Перехват реестра? Какие функции?

Тема в разделе "WASM.WIN32", создана пользователем test555, 20 сен 2008.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Задача - скрыть значение некоторых ключей в реестре.

    Переделал исходник MS-REMa (Перехват АПИ функций Часть 1)
    Перехватываю
    Function ZwQueryValueKey(KeyHandle:dword;
    ValueName: PUnicodeString;
    KeyValueInformationClass:lol: word;
    KeyValueInformation:Pointer;
    Length:lol: word;
    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
    );

    Установил перехват и на нее. Перехватывает что-то, но не их опросы.
    Вопрос, какие еще функци нужно перехватывать чтобы сокрыть в реестре?
    (именно интересует вопрос изменения значения ключа, а не скрытие самого ключа)

    Спасибо.
    Книжки, ссылочки..
     
  2. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    для скрытия ключей/записей надо перехватывать ZwEnumerateKey/ZwEnumerateValueKey
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Klayd, я еще перепроверю тот факт, но перехват этой функции не отлавливал обращений Мсконфига и нескольких других утилит. Буду проверять еще.. Видать накасячил где..
     
  4. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    судя по МСДМ, ZwEnumerateKey
    мне даст только имена разделов.

    http://msdn.microsoft.com/en-us/library/ms804365.aspx

    И даст мне KEY_INFORMATION_CLASS
    В описании структур (разных уровней) нет упоминания о значениях ключа. А мне именно его надо сокрыть..

    ZwQueryValueKey и ZwEnumerateValueKey явно не хватает. Таким образом обманул только регедит виндоус..
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Кажется ошибка нашлась.
    Помогите описать структуру. МСДН:

    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 возвращяет пустое значение. Если в обработчике отключить манипулации с данными, то получает истинные значения.
     
  6. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Забудь про дельфи. пиши на С
     
  7. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Rustem, ну хороший совет конечно же. Но из-за небольшой мелочи в данном случае я этого делать не буду. Уже все готово, за исключением вот этого вот касяка...
     
  8. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    UCHAR =>char или byte(1 байт), но никак не widechar(2 байта)
     
  9. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Итак, вопрос еще актуален.

    На данный момент прога перехватывает 2 функции в юзермоде.
    Первая -
    Function ZwQueryValueKey(KeyHandle:dword;
    ValueName: PUnicodeString;
    KeyValueInformationClass:lol: word;
    KeyValueInformation:Pointer;
    Length:lol: word;
    ResultLength:pointer): NTStatus;
    stdcall; external 'ntdll.dll';

    В ней стоит обработчик что подменяет значения для определенных значений реестра.
    Работает если смотреть регедитом, или например апишной функцией такой:
    RegQueryValueEx
    То есть мой обработчик срабатывает, все меняется.

    Однако, запусти мсконфиг или другую утилиту - там показываются истинные значения.

    Я исследовал этот вопрос Regmon`ом.
    Вот что получилось:
    Когда лезу в реестр регедитом или своей прогой, использующие апи функцию RegQueryValueEx, то регмон пишет в колонке Request значение QueryValue
    А если другими утилитами, то уже запрос будет EmunerateValue.

    Ответ видимо здесь и кроется, что вызывается другая функция, для которой ZwQueryValueKey не является базовой.
    Но как узнать, что за базовая функция у меня во втором случае, что перехватывать?
    ZwEnumerateValueKey у меня не работает, не ловит их запросы, хотя сам по себе перехватчик иногда ловит какие-то запросы.

    МСДН уже перерыл, что перехватывать не знаю. А хотелось бы.
     
  10. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    посмотри экспорт нтдлл - например
    NtQueryMultipleValueKey
    NtQueryKey

    А в тему про перехват NtEnumerateKey:
    перехват неэкспортируемой CmEnumerateKey поиском кода, т.е. без хуков в SST
    старый мой баян, но вдруг кому-то интересно
    http://b4.cih.ms/CmHideDrv.zip

    PS: привет Great! :)
     
  11. depler

    depler New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2007
    Сообщения:
    7
    test555 можешь выложить исходник что у тебя всетаки получилось? Мне не хватает описания некоторых структур да и вообще поглядеть хочется