Допустим есть простейший кейлоггер инсталируемый через SetWindowsHookEx(WH_KEYBOARD_LL, ...). Как можно сделать так, чтоб каждая нажатая клавиша трансформировалась в другой символ, то есть, например, пользователь нажимает 'A' а вместо этого на активное окно получает, скажем, 'X' ? Первое, что пришло на ум не работает: Код (Text): PKBDLLHOOKSTRUCT kbd = (PKBDLLHOOKSTRUCT)lparam; kbd->vkCode = ...; kbd->scanCode = ...;
katrus - сделай бешеный опрос GetAsyncKeyState, и меняй.... - делай так чтоб твой хук всегда был первый
mAgoja Это что, шутка такая? Да? У меня пока единственная идея - не вызывать следующую функций из моего хука и генерировать синтетические сообщения клавиатуры из отдельного потока используя kbdevent. Но уж как то это брутально.
katrus Не совсем тя понял ??? это она GetAsyncKeyState? если нет я думаю что нет ничего плохого если ты буш фильтровать все клавиши а потом вызывать SetKeyboardState
mAgoja Все оказалось довольно просто - вместо вызова CallNextHookEx() делаю keybd_event, плюс добавил код который отбрасывает "синтетические" сообщения в хуке клавиатуры (иначе - бесконечная рекурсия).
можно взять из DDK фильтр клавы kbfiltr.sys и подправить его, например: Код (Text): VOID KbFilter_ServiceCallback( IN PDEVICE_OBJECT DeviceObject, IN PKEYBOARD_INPUT_DATA InputDataStart, IN PKEYBOARD_INPUT_DATA InputDataEnd, IN OUT PULONG InputDataConsumed ) { PDEVICE_EXTENSION devExt; PKEYBOARD_INPUT_DATA packets; for(packets = InputDataStart; packets < InputDataEnd; packets++ ) { if((packets->Flags & KEY_MAKE) == KEY_MAKE) //нажатие клавиши { switch(packets->MakeCode) { case 0x001D://Ctrl if(((packets->Flags & KEY_E0) != KEY_E0) && ((packets->Flags & KEY_E1) != KEY_E1)) {packets->MakeCode = 0x00;} break; ........ }