Анимация
JavaScript
|
Главная Библионтека хог 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 |