Перехват сервисов ядра Windows

Тема в разделе "WASM.NT.KERNEL", создана пользователем k00mber, 17 ноя 2006.

  1. k00mber

    k00mber New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    10
    Господа!
    Подскажите, где можно почитать о технике перехвата функций ядра (если нет hot patching).
    Требуется перехватить очень часто вызываемую функцию на многопроцессорной машине.
    Какие вообще существуют красивые и безопасные техники перехвата ядерных сервисов.
    Пример: WRITE_REGISTER_ULONG - надо перехватить!
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Статьи Ms Rem на wasm.ru
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Достойное обоснование планируется?
     
  4. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> WRITE_REGISTER_ULONG - надо перехватить!

    #define WRITE_REGISTER_ULONG(Register, Value) (*(volatile ULONG *)(Register) = (Value))
     
  5. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    fr0b-p
    ну вообще-то там вот так:
    #define WRITE_REGISTER_ULONG(x, y) { \
    *(volatile ULONG * const)(x) = y; \
    KeFlushWriteBuffer(); \
    }
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не очень понял, но звучит как бред \
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Во-перыых, что вообще такое сплайсинг? Если я правильно догадался - либо замена адреса функции в KiServiceTable, либо подмена кода в начале самой функции.
    Если я близок к истине... тогда продолжим:

    какая разница, с каким приоритом может исполняться перехватываемая функция? Прервется код или нет зависит только от IRQL того кода, который выполняет перехват

    что значит "код на DISPATCH_LEVEL гарантировано не может исполняться"?
    в смысле, цикл в DPC не может прерваться потоком с таким же и меньшим приоритетом? когда в третий раз прочитал, понял...
    кстати, а как быть с прерываниями? рассчитывать, что их обработчики не станут вызывать перехватываемые функции?

    так все таки - перехват на PASSIVE_LEVEL, или перехват функций, работающих на PASSIVE_LEVEL?
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот ведь.. %(
    а к функции вообще применимо понятие IRQL? IRQL есть у потока...
    и как можно запретить прерывания? (кроме cli, конечно)
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Именно так.
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а NMI... а еще какие-нибудь (у APIC вроде еще что-то есть..)
     
  11. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    fluderast
    Вот видишь, сам же сказал, что есть почти безопасный способ сплайсинга. Хукинг SDT безопасен по определению.

    Nouzui
    NMI обрабатываются на высших IRQL. Нативные же функции работают в основном на passive level, реже - dispatch, к ним обращений оттуда быть не может. Единственный потенциальный косяк - если другой поток был прерван в той области, в которую производится сплайсинг. Вероятность этого чрезвычайно мала, но если так случится - то бсод.
     
  12. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    а от чего зависит с каким приоритетом выполняются эти функции?
     
  13. cembo

    cembo New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    17
    http://ext2fsd.sourceforge.net/documents/irql.htm
     
  14. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    Самы безопасный сплайсинг это когда патчишь call ;)
     
  15. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Менеджер памяти и шедулер работают на IRQL DISPATCH_LEVEL. Отсюда вывод, что функции, которые используют подкачиваемую память или каким-то образом затрагивают шедулер (например, функции ожидания KeWaitForXXXObject при ненулевом таймауте) могут работать на IRQL строго меньше DISPATCH_LEVEL.