Урок 6. Клавиатурный ввод.

Уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm. Код касается клавиатурного ввода. Запускаем программу и нажимаем любую клавишу. Клавиша отобразиться в окне с учетом раскладки.            Кейлоггер The Rat! написан на ассемблере
Ассемблер Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки.

В код включен win32a.inc - чистый fasm.
Код:

format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'

section '.data' data readable writeable
     wHMain         dd   ?
     wHInstance     dd   ?

     wTitle         db   'Tutorial 6',0
     wClsName       db   'TUT06',0

     wMsg      MSG
     wCls      WNDCLASS

     ;exp = experiment
     expChar   dd   0x20
     expPs     PAINTSTRUCT
     expHdc    dd   ?

section '.code' code readable executable
     start:
          ; +------------------------------+
          ; | registering the window class |
          ; +------------------------------+
          invoke    GetModuleHandle,NULL
                    mov  [wHInstance],eax
                    mov  [wCls.hInstance],eax
                    mov  [wCls.style],CS_HREDRAW or CS_VREDRAW
                    mov  [wCls.lpfnWndProc],window_procedure
                    mov  [wCls.lpszClassName],wClsName
                    mov  [wCls.hbrBackground],COLOR_WINDOW+1
          invoke    LoadIcon,NULL,IDI_APPLICATION
                    mov  [wCls.hIcon],eax
          invoke    LoadCursor,NULL,IDC_ARROW
                    mov  [wCls.hCursor],eax
          invoke    RegisterClass,wCls

          ; +--------------------------+
          ; | creating the main window |
          ; +--------------------------+
          invoke    CreateWindowEx,\
                         0,\
                         wClsName,\
                         wTitle,\
                         WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         NULL,\
                         NULL,\
                         [wHInstance],\
                         NULL
                    mov  [wHMain],eax
          ; +---------------------------+
          ; | entering the message loop |
          ; +---------------------------+
          window_message_loop_start:
               invoke    GetMessage,wMsg,NULL,0,0
                         or   eax,eax
                         je   window_message_loop_end
               invoke    TranslateMessage,wMsg
               invoke    DispatchMessage,wMsg
                         jmp  window_message_loop_start

          window_message_loop_end:
               invoke    ExitProcess,0

          ; +----------------------+
          ; | the window procedure |
          ; +----------------------+
          proc window_procedure,hWnd,uMsg,wParam,lParam
               push ebx esi edi    ;eventhough the API would preserved, but play safe :p
               cmp  [uMsg],WM_CHAR
               je   wmCHAR
               cmp  [uMsg],WM_PAINT
               je   wmPAINT
               cmp  [uMsg],WM_DESTROY
               je   wmDESTROY

               wmDEFAULT:
                    invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
                              jmp  wmBYE
               wmCHAR:
                              push [wParam]
                              pop  [expChar]
                    invoke    InvalidateRect,[hWnd],NULL,TRUE
                              jmp  wmBYE
               wmPAINT:
                    invoke    BeginPaint,[hWnd],expPs
                              mov  [expHdc],eax
                    invoke    TextOut,[expHdc],0,0,expChar,1
                    invoke    EndPaint,[hWnd],expPs
                              jmp  wmBYE
               wmDESTROY:
                    invoke    PostQuitMessage,0

               wmBYE:
                    pop  edi esi ebx
                    ret
          endp

section '.idata' import data readable writeable
     library   KERNEL32, 'KERNEL32.DLL',\
               USER32,   'USER32.DLL',\
               GDI32,    'GDI32.DLL'

     import    KERNEL32,\
               GetModuleHandle,    'GetModuleHandleA',\
               ExitProcess,        'ExitProcess'

     import    USER32,\
               RegisterClass,      'RegisterClassA',\
               CreateWindowEx,     'CreateWindowExA',\
               DefWindowProc,      'DefWindowProcA',\
               ShowWindow,         'ShowWindow',\
               LoadCursor,         'LoadCursorA',\
               LoadIcon,           'LoadIconA',\
               BeginPaint,         'BeginPaint',\
               InvalidateRect,     'InvalidateRect',\
               EndPaint,           'EndPaint',\
               GetMessage,         'GetMessageA',\
               TranslateMessage,   'TranslateMessage',\
               DispatchMessage,    'DispatchMessageA',\
               PostQuitMessage,    'PostQuitMessage'

     import    GDI32,\
               TextOut,            'TextOutA'

Результат :

Кейлоггер The Rat! написан на masm32

Справка : Код работоспособен. Написан на ассемблере fasm. Для 32-битной операционной системы (x86 или если нравится - x32) Windows. Копируем и вставляем в свой проект.

Вы здесь: Главная Блог Кодинг x32 Fasm x32 Урок 6. Клавиатурный ввод.