Уровень перехвата клавиатуры

Discussion in 'WASM.NT.KERNEL' started by AlexCasual, Oct 3, 2011.

  1. AlexCasual

    AlexCasual New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2009
    Messages:
    120
    На какой уровень теоритически можно опуститься в стэке драверов,чтобы перехватывать сообщения о нажатых клавишах?Может кто-нибудь работал в этом направлении и знает способы отличные от присоединению к kbdclass?
     
  2. x64

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    Вот это, но оно не для USB-клавиатур.
     
  3. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    Ага. И поддерживает максимум один callback. Поэтому если позднее найдётся умник, который захочет зарегистрировать собственный callback, старый будет перезаписан.
     
  4. x64

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    Ну тогда вот такие ещё мысли. Сам по себе kbdclass.sys логически является классовым драйвером, но технически он выполнен в виде верхнего фильтра для класса "Keyboard", таким образом, если необходимо именно сесть ниже этого драйвера, то достаточно прописать себя как нижний фильтр для класса "Keyboard". Можно пойти дальше и вспомнить, что драйвер i8042prt.sys является драйвером порта, который реализует управление соответствующим контроллером, но сам контроллер приаттачен к определённой шине (в случае с i8042, если не ошибаюсь, это шина PCI). Таким образом, если сесть фильтром на драйвер этой шины, то мы опять же окажемся ниже любого из классовых фильтров. Такие дела.
     
  5. shchetinin

    shchetinin Member

    Blog Posts:
    0
    Joined:
    May 27, 2011
    Messages:
    715
    А такое отловит?
    Code (Text):
    1. BYTE keyScanCode = 0;
    2. __asm {
    3.           in    al, 0x64
    4.           test  al, 1
    5.           jz    key_not_present
    6.           in    al, 0x60
    7.           mov keyScanCode, al
    8. key_not_present:
    9. }
     
  6. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    x64
    Это было просто примечание.
    С какой это стати? К стандартной адресной шине и к шине данных он приаттачен. Общение с ним через его собственные фиксированные порты же, а не через PCI-транзакции.
    А что бы это дало? Прерывания приходят от контроллера, а не от шины.
     
  7. x64

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    l_inc
    Да, извиняюсь, попутал с устройствами хранения, там данные как раз по шине бегают, а здесь нет. Чисто программно стек девайсов клавиатуры выглядит так:

    Т.е. ниже i8042prt.sys только если acpi.sys. Я не знаю точно, как устроен i8042prt.sys внутри, но боюсь, что команды с клавиатуры он получает от контроллера через собственные прерывания, таким образом, даже если сесть нижним фильтром на его девайсы, это ничего не даст, также как ничего не даст и фильтрация acpi.sys. Другими словами, в данном случае никаких других вариантов нет, т.е. либо указанный выше хук, либо сесть нижним фильтром класса "Keyboard".
     
  8. AlexCasual

    AlexCasual New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2009
    Messages:
    120
    Получается,что ниже Kbdclass не сесть?...
    А если перехватывать процедуру обработки прерывания i8042prt?
     
  9. x64

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    Напрямую это не получится, т.к. патч IDT на 64-битных системах ни к чему хорошему не приводит (не, ну если сильно надо, то, конечно, можно). Также можно попробовать перехватить вызов IoConnectInterrupt() и подменить ISR там, но это опять же патч кода ядра, с которым имеются некоторые проблемы, и ещё неизвестно, использует ли её i8042prt.sys, или он патчит IDT вручную (маловероятно, т.к. в импорте этот вызов у него есть). Ну а во втором сообщении я указал способ, как сделать это легально, но у него есть недостатки, указанные в #3.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Я даже скажу какие конкретно, а именно - контроль целостности кода ядра - PatchGuard. Как он работает и как обойти эту штуку, можете погуглить (например тут). Конечно трюки которые описаны - потихоньку закрываются и исправляются обновлениями.
     
  11. steelfactor

    steelfactor New Member

    Blog Posts:
    0
    Joined:
    Apr 26, 2007
    Messages:
    501
    Как вариант, можно еще APIC распотрошить, но это, имхо, изврат, хоть и действенный