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

Discussion in 'WASM.NT.KERNEL' started by k00mber, Nov 17, 2006.

  1. k00mber

    k00mber New Member

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

    gilg New Member

    Blog Posts:
    0
    Joined:
    May 19, 2005
    Messages:
    527
    Статьи Ms Rem на wasm.ru
     
  3. gilg

    gilg New Member

    Blog Posts:
    0
    Joined:
    May 19, 2005
    Messages:
    527
    Достойное обоснование планируется?
     
  4. fr0b-p

    fr0b-p New Member

    Blog Posts:
    0
    Joined:
    Oct 1, 2006
    Messages:
    118
    >> WRITE_REGISTER_ULONG - надо перехватить!

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

    bers New Member

    Blog Posts:
    0
    Joined:
    Sep 16, 2005
    Messages:
    139
    Location:
    Russia
    fr0b-p
    ну вообще-то там вот так:
    #define WRITE_REGISTER_ULONG(x, y) { \
    *(volatile ULONG * const)(x) = y; \
    KeFlushWriteBuffer(); \
    }
     
  6. Nouzui

    Nouzui New Member

    Blog Posts:
    0
    Joined:
    Nov 17, 2006
    Messages:
    856
    не очень понял, но звучит как бред \
     
  7. Nouzui

    Nouzui New Member

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

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

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

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

    Nouzui New Member

    Blog Posts:
    0
    Joined:
    Nov 17, 2006
    Messages:
    856
    вот ведь.. %(
    а к функции вообще применимо понятие IRQL? IRQL есть у потока...
    и как можно запретить прерывания? (кроме cli, конечно)
     
  9. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    Именно так.
     
  10. Nouzui

    Nouzui New Member

    Blog Posts:
    0
    Joined:
    Nov 17, 2006
    Messages:
    856
    а NMI... а еще какие-нибудь (у APIC вроде еще что-то есть..)
     
  11. gilg

    gilg New Member

    Blog Posts:
    0
    Joined:
    May 19, 2005
    Messages:
    527
    fluderast
    Вот видишь, сам же сказал, что есть почти безопасный способ сплайсинга. Хукинг SDT безопасен по определению.

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

    DeeoniS New Member

    Blog Posts:
    0
    Joined:
    Aug 6, 2004
    Messages:
    132
    а от чего зависит с каким приоритетом выполняются эти функции?
     
  13. cembo

    cembo New Member

    Blog Posts:
    0
    Joined:
    Nov 17, 2006
    Messages:
    17
    http://ext2fsd.sourceforge.net/documents/irql.htm
     
  14. sl0n

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

    Blog Posts:
    0
    Joined:
    Sep 26, 2003
    Messages:
    701
    Самы безопасный сплайсинг это когда патчишь call ;)
     
  15. gilg

    gilg New Member

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