Урок 7. Обрабатываем сообщения мышки.

Уроки программирования на ассемблере - 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 7',0
     wClsName       db   'TUT07',0

     wMsg      MSG
     wCls      WNDCLASS

     ;exp = experiment
     expTxt    db   '    FASM knows you just clicked here!',0
     expClick  db   0
     expHdc    dd   ?

     expHPoint POINT
     expPs     PAINTSTRUCT


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_LBUTTONDOWN
               je   wmLBUTTONDOWN
               cmp  [uMsg],WM_PAINT
               je   wmPAINT
               cmp  [uMsg],WM_DESTROY
               je   wmDESTROY

               wmDEFAULT:
                    invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
                              jmp  wmBYE
               wmLBUTTONDOWN:
                              ;low order lParam  = x
                              ;high order lParam = y
                              mov  eax,[lParam]
                              and  eax,0xFFFF
                              mov  [expHPoint.x],eax
                              mov  eax,[lParam]
                              shr  eax,16
                              mov  [expHPoint.y],eax
                              mov  [expClick],TRUE
                    invoke    InvalidateRect,[hWnd],NULL,TRUE
                              jmp  wmBYE
               wmPAINT:
                    invoke    BeginPaint,[hWnd],expPs
                              mov  [expHdc],eax
                              cmp  [expClick],TRUE
                              jne  wmPAINT_END
                    invoke    lstrlen,expTxt
                    invoke    TextOut,[expHdc],[expHPoint.x],[expHPoint.y],expTxt,eax

                    wmPAINT_END:
                         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',\
               lstrlen,            'lstrlenA',\
               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 Урок 7. Обрабатываем сообщения мышки.