Фильтр клавиатуры, как "поменять" символ

Тема в разделе "WASM.WIN32", создана пользователем katrus, 22 авг 2007.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Допустим есть простейший кейлоггер инсталируемый через SetWindowsHookEx(WH_KEYBOARD_LL, ...). Как можно сделать так, чтоб каждая нажатая клавиша трансформировалась в другой символ, то есть, например, пользователь нажимает 'A' а вместо этого на активное окно получает, скажем, 'X' ?

    Первое, что пришло на ум не работает:
    Код (Text):
    1. PKBDLLHOOKSTRUCT kbd = (PKBDLLHOOKSTRUCT)lparam;
    2. kbd->vkCode = ...;
    3. kbd->scanCode = ...;
     
  2. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    katrus
    - сделай бешеный опрос GetAsyncKeyState, и меняй....
    - делай так чтоб твой хук всегда был первый ;)
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    mAgoja
    Это что, шутка такая? Да?

    У меня пока единственная идея - не вызывать следующую функций из моего хука и генерировать синтетические сообщения клавиатуры из отдельного потока используя kbdevent. Но уж как то это брутально.
     
  4. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    katrus
    Не совсем тя понял
    ??? это она GetAsyncKeyState?
    если нет я думаю что нет ничего плохого если ты буш фильтровать все клавиши а потом вызывать SetKeyboardState
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    mAgoja
    Все оказалось довольно просто - вместо вызова CallNextHookEx() делаю keybd_event, плюс добавил код который отбрасывает "синтетические" сообщения в хуке клавиатуры (иначе - бесконечная рекурсия).
     
  6. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    можно взять из DDK фильтр клавы kbfiltr.sys и подправить его, например:
    Код (Text):
    1. VOID
    2. KbFilter_ServiceCallback(
    3.     IN PDEVICE_OBJECT DeviceObject,
    4.     IN PKEYBOARD_INPUT_DATA InputDataStart,
    5.     IN PKEYBOARD_INPUT_DATA InputDataEnd,
    6.     IN OUT PULONG InputDataConsumed
    7.     )
    8. {
    9.     PDEVICE_EXTENSION   devExt;
    10.  
    11.     PKEYBOARD_INPUT_DATA packets;
    12.  
    13.     for(packets = InputDataStart; packets < InputDataEnd; packets++ )
    14.     {
    15.  
    16.         if((packets->Flags & KEY_MAKE) == KEY_MAKE) //нажатие клавиши
    17.         {
    18.             switch(packets->MakeCode)
    19.             {
    20.             case 0x001D://Ctrl
    21.                 if(((packets->Flags & KEY_E0) != KEY_E0) && ((packets->Flags & KEY_E1) != KEY_E1))
    22.                     {packets->MakeCode = 0x00;}
    23.                 break;
    24. ........
    25. }