Пожелтевшие страницы kernel32

Тема в разделе "WASM.WIN32", создана пользователем Abnormal, 12 май 2005.

  1. Abnormal

    Abnormal New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    9
    Адрес:
    Russia
    Решил я на досуге парочку АПИ перехватить с целью сокрытия некоторых файлов.

    Поскольку алгоритм обработчика такого перехвата довольно прост, то оптимальным решением, на мой взгляд, было размещение этого обработчика в межсекционном пространстве той библиотеки, функцию которой перехватываем - kernel32. Поскульку система была W2k \ Wxp, то первым делом я написал K_Mode-драйвер с целью открытия (и закрытия) доступа к определенным страницам Ke32, дабы записать туда тело обработчика и осуществить подмену первых байт исполняемого кода перехватываемой функции (Сплайсинг, кажется).

    Родной GPF появился когда произошло обращение к перехваченной функции из другого процесса (перехват велся из контекста Explorer.exe путем создания в нем удаленного потока, который и осуществлял все действия по установке перехвата - просто немного извращенства).

    Причина GPF была в том, что страница памяти с обработчиком перехвата имела другое содержание, и, ни какого обработчика там, естественно, не было. Эту разницу между w9х и wNT я уяснил быстро, НО измененная страница с оригинальным кодом перехватываемой функции проецировалась на все процессы ОДИНАКОВО. Собственно это и было причиной GPF. Эмпирическим путем я выяснил, что кроме страниц Ke32 с кодом, в другие процессы проецируется одна и та же страница - с заголовком библиотеки. Возможно есть еще какие-то страницы Ke32, имеющие одинаковый физический адрес во всех процессах.



    Но понять я не могу другое:

    когда я просматривал из нулевого цикла дескрипторы ПОСЛЕДНИХ ДВУХ страниц секции code, imports, exports (все в одной секции)- библиотеки Ke32, то все биты дескрипторов в таблице страниц были нулевыми, даже бит присутствия! НО при этом в страницу было чего-то убористо понаписано. (использование 4 mb страниц исключается, т.к. размер некоторых областей зарезервированной памяти меньше 4 mb, да и по документации Windows расширенные страницы использует только для размещения ядра по адресу 80000000h - 0А0000000h).



    Вопрос: куда указывают эти страницы (т.е. какой физический адрес информации в них) и как процессор адресуется к этой информации, если дескриптор страницы в таблице страниц полностью нулевой, а бит присутствия опущен. (Использование только каталога страниц исключается, т.к. страницы не расширенные).

    Использовалась совмещенная таблица страниц по VA = 0c0000000h.
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Abnormal

    Хм, этот метод весьма хорош для 9х систем, поскольку там этот kernel32.dll находится в шаред памяти и один по всем процессам, к тому же в этих системах нет такого поняти как copyonwrite. Что касается NT систем, то для этого там NativeAPI придумали :)