Урок 8. Меню.

Уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm. Код касается подключения меню к приложению и  обработка сообщений меню. Обратите внимание, меню в виде ресурса (section '.rsrc' resource data readable) содержится в одном файле со строками исходного кода.            Кейлоггер The Rat! написан на ассемблере
Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки. В случае, если Вы пользуетесь нашей сборкой, проделайте следующее. В среде разработки RadAsm (главное меню программы): File->New Project (Assembler - fasm, Project Type - Win32 App, назваение проектаи поле project - какое угодно)->Кнопка Далее-> None (вид проекта).

Далее копируем код в файла проекта, который создасться автоматически с именем *ваше название*.asm, ассемблируем и запускаем. В последующем инструкции по пользованию RadAsm выложим в на сайте (Блог->Кодинг->Общие вопросы).
Теория:
Меню - это pазновидность pесуpсов. Есть несколько видов pесуpсов, таких как диалоговые окна, стpоковые таблицы, иконки, битмапы, меню и т.д. Ресуpсы описываются в отдельном файле, называющемся файлом pесуpсов, котоpый, как пpавило, имеет pасшиpение .rc. Вы можете соединять pесуpсы с исходным кодом во вpемя стадии линковки. Окончательный пpодукт - это исполняемый файл, котоpый содеpжит как инстpукции, так и pесуpсы.
Вы можете писать файлы pесуpсов, используя любой текстовый pедактоp. Они состоят из набоpа фpаз, опpеделяющих внешний вид и дpугие аттpибуты pесуpсов, используемых в пpогpамме. Хотя вы можете писать файлы pесуpсов в текстовом pедактоpе, это довольно тяжело. Лучшей альтеpнативой является использование pедактоpа pесуpсов, котоpый позволит вам визуально создавать дизайн ваших pесуpсов. Редактоpы pесуpсов обычно входят в пакет с компилятоpоми или средами разработки (RadAsm). Для fasm мы используем GoRC Resource Compiler. Подробную информацию можно найти в Интернете, а также в папке FASM64\fasm\Bin\ архива наших преднастроенных программ.
Код:

format PE GUI 4.0 ;fasm x32 tutorial - http://mykeylogger.biz
entry start

include '%fasminc%\win32a.inc'

section '.data' data readable writeable ;fasm assembler tutorial
     wHMain         dd   ?
     wHInstance     dd   ?

     wTitle         db   'Tutorial 8',0 ;fasm x32 assembler tutorial
     wClsName       db   'TUT08',0 ;fasm x32 assembler tutorial

     wMsg      MSG
     wCls      WNDCLASS

     expBoxTitle    db   'Menu Action Description',0
     expBoxDesc11   db   'MenuBar A -> MenuItem A',0
     expBoxDesc12   db   'MenuBar A -> MenuItem B',0
     expBoxDesc13   db   'MenuBar A -> MenuItem C',0
     expBoxDesc21   db   'MenuBar B -> MenuItem A',0
     expBoxDesc30   db   'MenuBar C (Without Item)',0

section '.code' code readable executable ;fasm x32 assembler tutorial
     start:
          ; +------------------------------+
          ; | registering the window class |
          ; +------------------------------+
          invoke    GetModuleHandle,NULL
                    mov  [wHInstance],eax
                    mov  [wCls.hInstance],eax
                    mov  [wCls.style],CS_HREDRAW or CS_VREDRAW ;fasm x32 assembler tutorial
                    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 ;fasm x32 assembler tutorial
                    mov  [wCls.hCursor],eax
          invoke    RegisterClass,wCls
          invoke    LoadMenu,[wHInstance],30
          ; +--------------------------+
          ; | creating the main window |
          ; +--------------------------+
          invoke    CreateWindowEx,\
                         0,\
                         wClsName,\
                         wTitle,\
                         WS_OVERLAPPEDWINDOW,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         CW_USEDEFAULT,\
                         NULL,\
                         eax,\
                         [wHInstance],\
                         NULL
                    mov  [wHMain],eax
          invoke    ShowWindow,[wHMain],SW_SHOW
          ; +---------------------------+
          ; | entering the message loop |
          ; +---------------------------+
          window_message_loop_start:
               invoke    GetMessage,wMsg,NULL,0,0
                         or   eax,eax
                         je   window_message_loop_end ;fasm x32 assembler tutorial
               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 ;fasm x32 assembler tutorial
               push ebx esi edi    ;eventhough the API would preserved, but play safe :p
               cmp  [uMsg],WM_COMMAND
               je   wmCOMMAND
               cmp  [uMsg],WM_DESTROY
               je   wmDESTROY

               wmDEFAULT:
                    invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
                              jmp  wmBYE
               wmCOMMAND:
                              mov  eax,[wParam]
                              cmp  ax,11
                              je   wmCOMMAND_11
                              cmp  ax,12
                              je   wmCOMMAND_12 ;fasm x32 assembler tutorial
                              cmp  ax,13
                              je   wmCOMMAND_13
                              cmp  ax,21
                              je   wmCOMMAND_21 ;fasm x32 assembler tutorial
                              cmp  ax,30
                              je   wmCOMMAND_30
                              jmp  wmDEFAULT

                    wmCOMMAND_11:
                              invoke    MessageBox,[hWnd],expBoxDesc11,expBoxTitle,MB_OK ;fasm x32 assembler tutorial
                              jmp  wmBYE
                    wmCOMMAND_12:
                              invoke    MessageBox,[hWnd],expBoxDesc12,expBoxTitle,MB_OK ;fasm x32 assembler tutorial
                              jmp  wmBYE
                    wmCOMMAND_13:
                              invoke    MessageBox,[hWnd],expBoxDesc13,expBoxTitle,MB_OK
                              jmp  wmBYE
                    wmCOMMAND_21:
                              invoke    MessageBox,[hWnd],expBoxDesc21,expBoxTitle,MB_OK ;fasm x32 assembler tutorial
                              jmp  wmBYE
                    wmCOMMAND_30:
                              invoke    MessageBox,[hWnd],expBoxDesc30,expBoxTitle,MB_OK
                              jmp  wmBYE
               wmDESTROY:
                    invoke    PostQuitMessage,0 ;fasm x32 assembler tutorial

               wmBYE:
                    pop  edi esi ebx
                    ret
          endp

section '.idata' import data readable writeable ;fasm x32 assembler tutorial
     library   KERNEL32, 'KERNEL32.DLL',\
               USER32,   'USER32.DLL'

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

     import    USER32,\
               RegisterClass,      'RegisterClassA',\
               CreateWindowEx,     'CreateWindowExA',\
               DefWindowProc,      'DefWindowProcA',\
               ShowWindow,         'ShowWindow',\
               LoadCursor,         'LoadCursorA',\
               LoadIcon,           'LoadIconA',\
               LoadMenu,           'LoadMenuA',\
               GetMessage,         'GetMessageA',\
               MessageBox,         'MessageBoxA',\
               TranslateMessage,   'TranslateMessage',\
               DispatchMessage,    'DispatchMessageA',\
               PostQuitMessage,    'PostQuitMessage'

section '.rsrc' resource data readable ;fasm x32 assembler tutorial - http://mykeylogger.biz
     directory RT_MENU,appMenu

     resource  appMenu,\
               30,LANG_ENGLISH,menuMain

     menu menuMain
          menuitem  'MenuBar A',10,MFR_POPUP
          menuitem       'MenuBar A -> MenuItem A',11,MFT_STRING
          menuitem       'MenuBar A -> MenuItem B',12,MFT_STRING
                         menuseparator
          menuitem       'MenuBar A -> MenuItem C',13,MFR_END
          menuitem  'MenuBar B',20,MFR_POPUP
          menuitem       'MenuBar B -> MenuItem A',21,MFR_END
          menuitem  'MenuBar C (Without Item)',30,MFR_END

Результат :

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

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

Вы здесь: Главная Блог Кодинг x32 Fasm x32 Урок 8. Меню.