Пример: Транспортная логистика
Я ищу:
На главную  |  Добавить в избранное  

Программированиеи компьютеры /

Компьютерные вирусы

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 



Скачать реферат


ANSI или расширенного набора символов.

;В качестве примера рассмотрим ANSI

CreateWindowEx equ

DefWindowProc equ

DispatchMessage equ

FindWindow equ

GetMessage equ

GetModuleHandle equ

LoadCursor equ

LoadIcon equ

MessageBox equ

RegisterClass equ

TextOut equ

.data

newhwnd dd 0

lppaint PAINTSTRUCT

msg MSGSTRUCT

wc WNDCLASS

mbx_count dd 0

hInst dd 0

szTitleName db "Bizatch by Quantum / VLAD activated"

zero db 0

szAlternate db "more than once",0

szClassName db "ASMCLASS32",0

;Сообщение выводимое в окне

szPaint db "Left button pressed:"

s_num db "00000000h times.",0

;Размер сообщения

MSG_L EQU ($-offset szPaint)-1

.code

;Сюда обычно передается управление от загрузчика.

start:

;Получим HMODULE

push L 0

call GetModuleHandle

mov [hInst],eax

push L 0

push offset szClassName

call FindWindow

or eax,eax

jz reg_class

;Пространство для модификации строки заголовка

mov [zero]," "

reg_class:

;Инициализируем структуру WndClass

mov [wc.clsStyle],CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS

mov [wc.clsLpfnWndProc],offset WndProc

mov [wc.clsCbClsExtra],0

mov [wc.clsCbWndExtra],0

mov eax,[hInst]

mov [wc.clsHInstance],eax

;Загружаем значок

push L IDI_APPLICATION

push L 0

call LoadIcon

mov [wc.clsHIcon],eax

;Загружаем курсор

push L IDC_ARROW

push L 0

call LoadCursor

mov [wc.clsHCursor],eax

;Инициализируем оставшиеся поля структуры WndClass

mov [wc.clsHbrBackground],COLOR_WINDOW+1

mov dword ptr [wc.clsLpszMenuName],0

mov dword ptr [wc.clsLpszClassName],offset szClassName

;Регистрирем класс окна

push offset wc

call RegisterClass

;Создаем окно

push L 0 ;lpParam

push [hInst] ;hInstance

push L 0 ;Меню

push L 0 ;hwnd родительского окна

push L CW_USEDEFAULT ;Высота

push L CW_USEDEFAULT ;Длина

push L CW_USEDEFAULT ;Y

push L CW_USEDEFAULT ;X

push L WS_OVERLAPEEDWINDOW ;Style

push offset szTitleName ;Title Style

push offset szClassName ;Class Name

push L 0 ;extra style

call CreateWindowEx

;Сохраняем HWND

mov [newhwnd],eax

;Отображаем окно на экране

push L SW_SHOWNORMAL

push [newhwnd]

call ShowWindow

;Обновляем содержимое окна

push [newhwnd]

call UpdateWindow

;Очередь сообщений

msg_loop:

;Прочитаем следующее сообщение из очереди

push L 0

push L 0

push L 0

push offset msg

call GetMessage

;Если функция GetMessage вернула нулевое значение,

;то завершаем обработку сообщений и выходим из процесса

cmp ax,0

je end_loop

;преобразуем виртуальные коды клавиш в сообщения клавиатуры

push offset msg

call TranslateMessage

;Предаем это сообщение назад в Windows

push offset msg

call DispatchMessage

;Переходим к следующему сообщению

jmp msg_loop

;Выходим из процесса

end_loop:

push [msg.msWPARAM]

call ExitProcess

;Обработка сообщений окна. Win32 требует сохранения регистров

;EBX, EDI, ESI. запишем эти регистры после "uses" в строке "proc"

;Это позволит Ассемблеру сохранить их

WndProc proc uses ebx edi esi,hwnd:DWORD, wmsg:DWORD,

wparam:DWORD, lparam:DWORD

LOCAL theDC:DWORD

;Проверим, какое сообщение получили, и перейдем к обработке

cmp [wmsg],WM_DESTROY

je wmdestroy

стр [wmsg],WM_RBUTTONDOWN

je wmrbuttondown

cmp [wmsg],WM_SIZE

je wmsize

cmp [wmsg],WM_CREATE

je wmcreate

cmp [wmsg],WM_LBUTTONDOWN

je wmlbuttondown

cmp [wmsg],WM_PAINT

je wmpaint

cmp [wmsg],WM_GETMINMAXINFO

je wmgetminmaxinfo

;Данная программа не обрабатывает это сообщение. ;Передадим его Windows, ;чтобы оно было обработано по умолчанию

jmp defwndproc

;Сообщение WM_PAINT (перерисовать содержимое окна)wmpaint:

;Подготовим окно для перерисовки

push offset Ippaint

push [hwnd]

call BeginPaint

mov [theDC], eax

;Переведем в ASCII-формат значение mbx_count, которое

;доказывает, сколько раз была нажата левая кнопка мыши

mov eax,[mbx_count]

mov edi, offset s_num

call HexWrite32

; Вывод строки в окно

push L MSG_L ;Длина строки

push offset szPaint ;Строка

push L 5 ;Y

push L 5 ;X

push [theDC] ;DC

call TextOut

;0бозначим завершение перерисовки окна

push offset Ippaint

push [hwnd]

call EndPaint

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение WM_CREATE (создание окна)

wmcreate:

; Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение, не обрабатываемое данной программой, передаем Windows

defwndproc:

push [Iparam]

push [wparam]

push [wmsg]

push [hwnd]

call DefWindowProc

; Выходим из обработки сообщения

jmp finish

;Сообщение WM_DESTROY (уничтожение окна)

wmdestroy:

; Закроем поток

push L О

call PostQuitMessage

;Выходим из обработки сообщения

mov eax, О

jmp finish

;Сообщение WMJ-BUTTONDOWN (нажата левая кнопка мыши)

wmlbuttondown:

inc [mbx_count]

;0бновим содержимое окна

push L 0

push L 0

push [hwnd]

call InvalidateRect

[Выходим из обработки сообщения

mov eax, О

jmp finish

;Сообщение WM_RBUTTONDOWN (нажата правая кнопка мыши)

wmrbuttondown:

push L 0

call MessageBeep

;Выходим из обработки сообщения

jmp finish

;Сообщение WM_SIZE (изменен размер окна)

wmsize:

;Выходим из обработки сообщения

mov eax, О

jmp finish

;Сообщение WM_GETMINMAXINFO (попытка изменить размер

;или положение окна)

wmgetminmaxinfo:

;Заполним структуру MINMAXINFO

mov ebx, [Iparam]

mov [(MINMAXINFO ptr. ebx).mintrackposition_x],350

mov [(MINMAXINFO ptr ebx).mintrackposition_y],60

;Выходим из обработки сообщения

mov eax, О

jmp finish

;Выходим из обработки сообщения

finish:

ret

WndProc endp

;Процедура перевода байта в ASCII-формат для печати. Значение,

;находящееся в регистре AL, будет записано в ASCII-формате

;по адресу ES-.EDI

HexWriteS proc

;Разделяем байт на полубайты и загружаем их в регистры АН и AL

mov ah,al

and al.0Fh

shr ah,4

;Добавляем 30h к каждому полубайту

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 



Copyright © 2005—2007 «Mark5»