Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [ 56 ] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

хог ret

еах,еах

file exit: close exit: destroy window:

invoke PostQuitMessage,0

popad

xor eax,eax ret

WindowProc endp

Как нетрудно заметить, оконная функция принимает первые четыре члена структуры сообщения в качестве отдельных параметров. Логика ее работы чрезвычайно проста и заключается в обработке системных сообщений, а также и элементов оконного меню. В случае необрабатываемых команд, они просто передаются на обработку по умолчаншо системному вызову. DefWindowProc.

При наличии сообщения WM DESTROY, что обычно вызвано закрытием окна, в систему ставится на обслуживание вызовом PostQuitMessage сообщение WMQUIT, принуждающее цикл сообщений завершить работу до того, как сообщение вернется оконной процедуре программы.

Основной функционал обсуждаемого Windows приложения заложен в функции обработки диалога ChildDlgProc, которая, стоит заметить, также является оконной функцей.

ChildDlgProc proc stdcall, @@hwnd:dword, @@wmsg;dword, @@wparam:dwoi @@lparam:dword

pushad

mov eax, [@@wmsg]

cmp eax,WM INITDIALOG je Initialize

crap eax,WM COMMAND jne Done Not Handled

Handle Command:

mov eax,@ @wparam

cmp ax,IDC GO BUTTON je go button

cmp ax,IDC EXIT BUTTON

je Exit Button

jmp Done Not Handled

jnitialize:

jmp Done Handled

go button:

invoke GetDlgltem,[chi1d dlg handle],IDC INPUT EDIT

invoke GetWindowText, eax, offset result buffer , 256

mov ebx, offset result buffer

add ebx,eax

mov byte ptr lebx] , 0

push offset result buffer call [TestFunction]

.if eax==NULL

.invoke GetDlgltem,[child dlg handle],IDC OUTPUT EDIT invoke SetWindowText,eax,offset result buffer

jmp Done Handled

Exit Button:

invoke PostQuitMessage,0

Done Handled: popad

mov eax,1 ret

Done Not Handled: popad

xor eax,eax ret

ChildDlgProc endp

Она так же, как и WindowProc, должна обрабатывать сообщения, только уже отправляемые в нее вызовом IsDialogMessage. Для демонстрационных целей в функцию •bildDlgProc включен шаблон обработчика сообщения WMINITDIALOG, которое приводит перед созданием окна диалога для возможной инициализации данных оконной Функции.



Основными ожидаемыми сообщениями являются нажатия кнопок IDC GO BUTT(ji и IDC EX1T BUTT0N. Если с сообщением IDC EXIT BUTTON все очевидно, то обр! ботчик IDCGOBUTTON мы сейчас подвергнем обсуждению.

Наще диалоговое окно располагает элементом ввода данных (по смыслу программ сюда должна быть введена последовательность символов, для которой будет вычислят ся контрольная сумма по алгоритму MD5). Вызов GetDlgltem возвращает описатель эт го элемента, при помощи которого вызов GetWindowText разместит его содержим! в памяти по адресу result buffer и вернет размер в символах.

Далее, полученная строка дополняется в конце нулевым значением и осуществляет вызов функции из нащей динамически зафужаемой библиотеки mscapit.dll с передач! единственного парамефа - адреса этой сфоки для расчета контрольной суммы MD5, кот рая и заменит исходную сфоку. Результат работы экспортируемой функции, если не бы ощибок, будет размещен в элементе управления с идентификатором IDC OUTPUT ED диалога вызовом SetWindowText.

И, наконец, фетий файл проекта md5 - файл установок модуля mdS.def.

Md5 .def

NAME MD5

DESCRIPTION MD5 hash calculator

EXETYPE WINDOWS

STUB WINSTUB.EXE

CODE PRELOAD MOVEABLE

DATA PRELOAD MOVEABLE MULTIPLE

HEAPSIZE 65536

STACKSIZE 65536

EXPORTS WindowProc

ПарамефЫ, перечисленные в нем, определяют свойства результирующего исполни мого модуля.

NAME - имя исполняемого файла DESCRIPTION -описание модуля EXETYPE -ТИП системного окружения STUB п р офаммная заглущка CODE - свойства раздела кода DATA - свойства раздела данных HEAPSIZE -размер кучи STACKSIZE - размер стека EXPORTS -экспорт

5.2. Сервисная библиотека

Перейдем к рассмотрению файлов проекта динамически зафужаемой библиотеки gpitdll. Реализация вычисления конфольной суммы MD5 последовательности символов в ней базируется на использовании возможностей криптофафических модулей операциоииой системы Windows - Crypto API.

. Bscapit.asm .386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\advapi32.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.1ib includelib \masm32\1ib\kerne132 . 1ib includelib \masm32\lib\advapi32.1ib

DisplayError PROTO :DWORD

ByteToStr PROTO :DWORD,:DWORD,:DWORD

. const ALG SID MD5 PROV RSA FULL HP HASHVAL ALG CLASS HASH ALG TYPE ANY CRYPT VERIFYCONTEXT CALG MD5 ALG SID MD5

HCRYPTPROV TYPEDEF HCRYPTHASH TYPEDEF

equ equ equ equ equ equ

DWORD DWORD

equ 00000003h

OOOOOOOlh

00000002h

00008000h

OOOOOOOOh

OFOOOOOOOh

ALG CLASS HASH

OR ALG TYPE ANY

.data

LibName

ErrorMessage

db db

"crypto.dH",0 512 dup(O)

MAKELANGID MACRO p, s xor eax,eax mov eax, s shl eax,10



xor ebx,ebx mov ebx,p or eax,ebx

ENDM .code

DllEntry proc hInstDLL:HINSTANCE,reason:DWORD,reservedl:DWORD mov eax,TRUE ret

DllEntry Endp

TestFunction proc uses esi edi Ipstring:DWORD

LOCAL hCryptProv:HCRYPTPROV LOCAL hHash :HCRYPTHASH

LOCAL dwLength :DWORD LOCAL sHash [512] :BYTE

i.nvoke CryptAcquireContext, ADDR PROV RSA FULL, CRYPT VERIFYCONTEXT

hCryptProv,

NULL,

.IF eax==0

jmp error .ELSE

invoke CryptCreateHash,hCryptProv,CALG MD5,0,0,ADDR hHash

.IF eax==0

jmp error

.ELSE

invoke Istrlen,Ipstring mov dwLength,eax

invoke CryptHashData,hHash,Ipstring,dwLength,0

.IF eax==0

jmp error

.ELSE

mov dwLength,SIZEOF sHash

invoke CryptGetHashParam,hHash,HP HASHVAL,ADDR sHash,ADDR dwLength,0

.IF eax==0

jmp error

.ELSE

sHash,Ipstring

invoke ByteToStr,dwLength,ADDR

invoke CryptDestroyHash,hHash

xor eax,eax

jmp exit

.ENDIF

. ENDIF

invoke СryptRe leaseContext,hCryptProv,0

.ENDIF .ENDIF

error:

invoke GetLastError

invoke DisplayError,eax

mov eax,-l

exit:

TestFunction endp

DisplayError PROC Error ID:DWORD

MAKELANGID LANG NEUTRAL, SUBLANG DEFAULT invoke

FormatMessage,FORMAT MESSAGE FROM SYSTEM,NULL,Error ID, eax, OFFSET ErrorMessage,512, NULL

invoke MessageBox,NULL,OFFSET ErrorMessage,OFFSET

LibName, MB OK

DisplayError ENDP

ByteToStr PROC Len : DWORD,pArray:DWORD,pStr : DWORD mov ecx,Len mov esi,pArray mov edi,pStr ;int 3h

mov al,byte ptr[esi] and al,OFOh shr al,4 .IF al<=9

add al,"0"

mov byte ptr[edi],al

.ELSE

sub al,10 add al,"A"

mov byte ptr[edi] , al



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [ 56 ] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88