Page fault handling in Windows x64

Тема в разделе "WASM.NT.KERNEL", создана пользователем retmas, 1 окт 2009.

  1. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Господа,

    существует ли в природе способ осуществить

    перехват обработчика ошибок страниц в Windows x64?
     
  2. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    А что, писАть в IDT религия не позволяет? ;) Геморно, но надежно...
     
  3. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    retmas
    Вопрос связан с PatchGuard?
     
  4. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Medstrax

    PatchGuard!!!

    o14189

    вопрос связан с поиском легального (относительно) способа решения
    задачи под x64!
     
  5. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    :), ну-ну...
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну IDT отпадает, остаются внутренние/недокументированные структуры ядра, правда, боюсь, что в современных версиях PG это всё тоже контролируется. Ну если тебе нужен этот гемор, вперёд, реверси, исходники ковыряй... Clerk'у привет.
     
  7. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Зря, не самый легкий, зато самый надежный способ.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    KiDebugRoutine тоже контролируется.
    Обраотчики прерываний аналогично.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну КК помнится писал что IDT/GDT проверяются по crc, тогда мы можем изменить crc на оригинальный добавив один эелемент в IDT.
     
  10. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    retmas
    нужно смотреть в сторону IoConnectInterrupt и то с каким механизмом она связана, об этом уже писали и много раз (искать как обычно в гугле)
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    И что ты предлагаешь? Патчить KINTERRUPT? Они, скорее всего, контролируются. А переподключать свой обработчик прерывания к уже занятому, - в любом случае недокументировано, и я вообще не уверен, что это возможно средствами ядра.
     
  12. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    IoConnectInterrupt -> STATUS_INVALID_PARAMETER для PF, т.к. занят
     
  13. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Это обходится, в том числе и брекпойнт на чтение/запись дескриптора int1
     
  14. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    ETW:MmPageFaultNotifyRoutine
     
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    А ещё есть MmSetPageFaultNotifyRoutine(), которая этот указатель устанавливает, но не экспортируется, к сожалению. Впрочем, её адрес можно найти. Почему я упоминаю это функцию, потому что если уж ставить те или иные колбеки, то лучше делать это специально предназначенными для этого средствами ядра, например, ибо они автоматически и корректно пересчитывают хеши PatchGuard'а, а в случае подмены адреса руками вам придётся сделать это самостоятельно. А вообще, сам я этот хак не использовал, но попробуйте кто-нибудь найти её и поставить свою, потом отпишитесь. Вообще, не думаю, что эти все способы могут иметь какую-либо коммерческую ценность, но тем не менее всё имеет право на существование... Добавлю только, что на Windows Server 2003 SP2 x64 функция MmSetPageFaultNotifyRoutine() никакие хэши не пересчитывает и с PG вообще не контактирует, соответственно, получается, что никто этот указатель не палит. Но для Vista x64 и выше советую всё же убедиться в этом самостоятельно.
     
  16. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    x64 Боюсь, адрес MmSetPageFaultNotifyRoutine найти не получится.
     
  17. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я не был бы так категоричен на твоём месте.
     
  18. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Кстати, MmSetPageFaultNotifyRoutine точно не решение!!!
    Ее просто нет больше не в 6.0 (vista_sp2, srv_08_sp2) не в 6.1 (7, srv_08_r2)
     
  19. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В любом случае, стоит посмотреть в сторону других exception-related колбеков, пусть и недокументированных/неэкспортируемых.