; Программа на ФАСМе для создания паролей состоящих из символов любой комбинации ; четырёх основных категорий: ; ; * буквы A, ..., Z, ; * буквы a, ..., z, ; * цифры 0, ..., 9, ; * символ подчёркивания '_' ; ; и других выбранных пользователем символов. Количество всех возможных непустых ; наборов знаков равно 2^224-1 (количество всех непустых подмножеств набора символов ; с шестнадцатеричными кодами от 0x20 до 0xFF). Максимальная длина созданного пароля ; равна 9999 символам. Созданный пароль можно скопировать в буфер обмена пользуясь ; кнопкой с иконкой. ; ; Кроме того, нажатие сочетания клавиш WIN + F12 даёт возможность создания нового ; пароля и немедленного помещения его в буфере обмена, даже когда окно приложения ; неактивно. ; ; Настройки программы определяющее длину пароля и набор составных символов создающихся ; паролей хранятся перед концом работы приложения в следующем подразделе системного ; реестра: ; ; HKEY_CURRENT_USER\Software\SimPaGen\<версия_программы> ; ; В приложении использованы функции CryptoAPI библиотеки 'advapi32.dll', благодаря ; чему созданная последовательность символов пароля является "криптографически ; случайной". ; ; Исходный файл содержит встроенные непосредственно данные иконок и манифеста. ; ; Программа является примером использования метода сабклассинга полей редактирования. ; ; (C) Mikołaj Hajduk, 11.09.2008. ; ; Домашняя страница: http://mikhajduk.houa.org ; E-mail: mikhajduk@gmail.com ; format PE GUI 4.0 ; Включение файла, который содержит все нужные макросы ФАСМа использованы в программе. ; include 'win32wx.inc' ; Определение кодировки, в которой записан исходный файл. ; include '\ENCODING\utf8.inc' ; Определение константы, которая содержит информацию о версии программы. ; PROG_VERSION equ '2008.09.11.0' ; Дефиниции глобальных данных. ; section '.data' data readable writeable ; Строки, которые содержат имена встроенных классов системы Windows. ; _edit du 'EDIT', 0 _button du 'BUTTON', 0 _static du 'STATIC', 0 ; Строки, которые содержат имена определённых нами классов. ; _MainClass du 'SimPaGen', 0 _PassPanelClass du 'PassPanel', 0 _CharPanelClass du 'CharPanel', 0 ; Дефиниции новых классов используемых в программе. ; MainClass WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _MainClass PassPanelClass WNDCLASS 0, PassPanelProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _PassPanelClass CharPanelClass WNDCLASS 0, CharPanelProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, _CharPanelClass ; Хэндл шрифта используемого для описания контролов программы. ; Font dd ? ; Структура, которая содержит информации об обрабатываемом сообщении. ; msg MSG ; Хэндл модуля приложения. ; hInstance dd ? ; Хэндл панели, в которой создаются пароли. ; PassPanel dd ? ; Хэндл панели, в которой определяем набор символов для генерированных ; паролей. ; CharPanel dd ? ; Таблица определяющая характеристическую функцию множества составных символов. ; CharFun rd 7 ; Таблица, которая содержит строковое представление длины создающихся паролей. ; PassLen du '10' rb 6 ; Переменная, которая содержит состав флагов соответствующих состоянии ; переключателей определяющих факт использования основных категорий ; символов. ; Flags dw 0 ; Исполняемый код программы. ; section '.code' code readable writeable executable start: ; Проверка загрузки библиотеки 'comctl32.dll'. Это необходимо для работы с манифестом. ; invoke InitCommonControls ; Получение хэндла модуля приложения. ; invoke GetModuleHandle, 0 test eax, eax jz error mov [hInstance], eax invoke LoadIcon, eax, ID_MAINICON test eax, eax jz error mov [MainClass.hIcon], eax invoke LoadCursor, 0, IDC_ARROW test eax, eax jz error mov [MainClass.hCursor], eax ; Регистрация используемых в программе классов окон. ; invoke RegisterClass, MainClass test ax, ax jz error invoke RegisterClass, CharPanelClass test ax, ax jz error invoke RegisterClass, PassPanelClass test ax, ax jz error invoke CreateWindowEx, 0, _MainClass, <"SimPaGen v.", PROG_VERSION>, WS_VISIBLE + WS_SYSMENU + WS_CAPTION + WS_MINIMIZEBOX,\ 144, 128, 300, 332, NULL, 0, [hInstance], NULL test eax, eax jz error ; Петля обработки сообщений. ; msg_loop: invoke GetMessage, msg, NULL, 0, 0 cmp eax, -1 je error cmp eax, 1 jb end_loop jne msg_loop ; Если данное сообщение касается любой панели, тогда обрабатываем его ; для перехвата нажатий клавиши TAB и клавиш управляющих курсором ; (выбор данного контрола панели). ; invoke IsDialogMessage, [PassPanel], msg test eax, eax jnz msg_loop invoke IsDialogMessage, [CharPanel], msg test eax, eax jnz msg_loop invoke TranslateMessage, msg invoke DispatchMessage, msg jmp msg_loop error: stdcall ShowLastError, NULL end_loop: invoke ExitProcess, [msg.wParam] ; Процедура управления окном приложения. ; proc WindowProc, hwnd, wmsg, wparam, lparam locals Disposition dd ? endl push ebx esi edi cmp [wmsg], WM_CREATE je .wmcreate cmp [wmsg], WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam] jmp .finish .wmcreate: ; Создание шрифта используемого в полях редактирования, метках и кнопках. ; invoke CreateFont, 16, 0, 0, 0, 0, FALSE, FALSE, FALSE,\ DEFAULT_CHARSET, OUT_RASTER_PRECIS, CLIP_DEFAULT_PRECIS,\ DEFAULT_QUALITY, FIXED_PITCH + FF_DONTCARE, "Tahoma" test eax, eax jz .failed mov [Font], eax ; Создание подраздела системного реестра (или его открытие, если уже существовал) ; связанного с приложением. ; lea ebx, [Disposition] invoke RegCreateKeyEx, HKEY_CURRENT_USER, .KeyName, 0, 0, REG_OPTION_NON_VOLATILE,\ KEY_ALL_ACCESS, 0, .hKey, ebx test eax, eax jnz .failed ; Проверка значения переменной 'Disposition' возвращенного функцией 'RegCreateKeyEx'. ; cmp dword [ebx], REG_CREATED_NEW_KEY jne .CreatePanels ; Если значение это подтверждает факт создания нового подраздела системного реестра, ; тогда в реестр записываются стандартные значения определяющее длину паролей ; и характеристическую функцию набора составных символов. ; .SaveStartRegValues: ; Выделение блока памяти для хранения значений подраздела системного ; реестра связанного с приложением. ; invoke LocalAlloc, LMEM_ZEROINIT, 29 test eax, eax jz .failed xchg ebx, eax ; Запись состояния переключателей определяющих использование основных ; категорий символов (по умолчанию используются буквы A-Z и цифры 0-9). ; mov byte [ebx], 5 ; [A-Z] + [0-9] invoke RegSetValueEx, [.hKey], .FlagsRegVal, 0, REG_BINARY, ebx, 2 test eax, eax jnz .failed ; Запись характеристической функции набора составных символов (с исключением ; основных категорий). ; lea eax, [ebx + 1] ; eax := ebx + 1 invoke RegSetValueEx, [.hKey], .CharFunRegVal, 0, REG_BINARY, eax, 28 test eax, eax jnz .failed ; Освобождение блока памяти использованного как буфер для значений ; подраздела системного реестра. ; invoke LocalFree, ebx test eax, eax jnz .failed ; Запись в реестре строкового представления стандартной длины пароля. ; invoke RegSetValueEx, [.hKey], .PassLenRegVal, 0, REG_SZ, PassLen, 10 test eax, eax jnz .failed .CreatePanels: ; Создание панели, в которой создаются пароли. ; invoke CreateWindowEx, NULL,\ _PassPanelClass, 0,\ WS_VISIBLE + WS_CHILD,\ 15, 10, 265, 172, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed mov [PassPanel], eax ; Создание панели, в которой определяем набор символов для генерируемых паролей. ; invoke CreateWindowEx, NULL,\ _CharPanelClass, 0,\ WS_VISIBLE + WS_CHILD,\ 15, 192, 265, 95, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed mov [CharPanel], eax ; Загрузка характеристической функции набора знаков записанной в связанном ; с приложением подразделе системного реестра. ; invoke RegQueryValueEx, [.hKey], .CharFunRegVal, 0, 0, CharFun, .CharFunBufSize test eax, eax jnz .failed ; Загрузка строкового представления длины создающихся паролей. ; invoke RegQueryValueEx, [.hKey], .PassLenRegVal, 0, 0, PassLen, .PassLenBufSize test eax, eax jnz .failed ; Помещение этого представления в поле редактирования 'ID_PASSLEN'. ; invoke SendDlgItemMessage, [PassPanel], ID_PASSLEN, WM_SETTEXT, 0, PassLen ; Выделение блока памяти, в котором хранятся определённый пользователем набор ; составных символов. ; invoke LocalAlloc, LMEM_ZEROINIT, 450 test eax, eax jz .failed xchg edi, eax mov esi, edi ; Цикл, в котором характеристическая функция превращается в строку символов Unicode, ; содержащую определённый пользователем набор символов. ; mov eax, 31 xor ebx, ebx .CreateOtherLoop: inc al bt [CharFun - 4], eax setc bl ; CharTab[x] := al mov byte [edi], al ; x := x + 2*CharFun[eax - 32] adc edi, ebx test al, al jnz .CreateOtherLoop ; Помещение этой строки в поле редактирования 'ID_PASSCHARS'. ; invoke SendDlgItemMessage, [CharPanel], ID_PASSCHARS, WM_SETTEXT, 0, esi ; Загрузка набора флагов определяющих состояние переключателей соответствующих ; основным категориям символов. ; invoke RegQueryValueEx, [.hKey], .FlagsRegVal, 0, 0, esi, .FlagsBufSize test eax, eax jnz .failed movzx ebx, word [esi] ; В зависимости от значения флагов определяем состояние данных переключателей. ; .CheckBox_AZ: bt ebx, 0 jnc .CheckBox_az invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX1, BM_CLICK, 0, 0 .CheckBox_az: bt ebx, 1 jnc .CheckBox_09 invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX2, BM_CLICK, 0, 0 .CheckBox_09: bt ebx, 2 jnc .CheckBox__ invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX3, BM_CLICK, 0, 0 .CheckBox__: bt ebx, 3 jnc .FreeMem invoke SendDlgItemMessage, [CharPanel], ID_CHKBOX4, BM_CLICK, 0, 0 .FreeMem: ; Освобождение блока памяти использованного для хранения определённого ; пользователем набора составных символов. ; invoke LocalFree, esi test eax, eax jnz .failed ; Эмуляция нажатия кнопки 'Создай' для создания примерного пароля. ; invoke SendDlgItemMessage, [PassPanel], ID_GENBTN, BM_CLICK, 0, 0 xor eax, eax jmp .finish .failed: stdcall ShowLastError, [hwnd] or eax, -1 jmp .finish .wmdestroy: ; ; Запись настроек программы в соответствующем подразделе системного реестра. ; ; Загрузка в таблицу 'CharFun' характеристической функции составного набора ; символов. ; invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0 ; В зависимости от значения флагов из характеристической функции исключаем ; соответствующее основные категории символов. ; movzx ebx, [Flags] .Modify_AZ: bt ebx, 0 jnc .Modify_az xor [CharFun + 4], 07FFFFFEh .Modify_az: bt ebx, 1 jnc .Modify_09 xor [CharFun + 8], 07FFFFFEh .Modify_09: bt ebx, 2 jnc .Modify__ xor [CharFun], 03FF0000h .Modify__: bt ebx, 3 jnc .SaveRegKeyVals btr dword [CharFun + 4], 31 ; Запись в подразделе системного реестра строкового представления длины ; создающихся паролей, модифицированной характеристической функции набора ; символов и набора флагов. ; .SaveRegKeyVals: invoke RegSetValueEx, [.hKey], .CharFunRegVal, 0, REG_BINARY, CharFun, 28 test eax, eax jnz .failed invoke SendDlgItemMessage, [PassPanel], ID_PASSLEN, WM_GETTEXT, 5, PassLen invoke RegSetValueEx, [.hKey], .PassLenRegVal, 0, REG_SZ, PassLen, 10 test eax, eax jnz .failed invoke RegSetValueEx, [.hKey], .FlagsRegVal, 0, REG_BINARY, Flags, 2 test eax, eax jnz .failed ; Закрытие подраздела системного реестра связанного с приложением. ; invoke RegCloseKey, [.hKey] test eax, eax jnz .failed ; Удаление ненужного шрифта. ; invoke DeleteObject, [Font] test eax, eax jz .failed invoke PostQuitMessage, 0 xor eax, eax .finish: pop edi esi ebx ret align 4 ; Переменные, используемые для операций на подразделе системного реестра. ; .CharFunBufSize dd 28 .PassLenBufSize dd 10 .FlagsBufSize dd 2 .hKey dd ? .KeyName du 'Software\SimPaGen\', PROG_VERSION, 0 .CharFunRegVal du 'CharFun', 0 .PassLenRegVal du 'PassLen', 0 .FlagsRegVal du 'Flags', 0 endp ; Процедура управления парольной панелью. ; proc PassPanelProc, hwnd, wmsg, wparam, lparam locals Password dd ? PassLen dd ? CharTabLen dd ? endl ; Тип провайдера криптографических услуг (CSP) используемого ; для создания случайной последовательности символов пароля. ; PROV_RSA_FULL = 1 ; Дефиниции констант соответствующих идентификаторам контролов панели. ; ID_GENBTN = 101 ID_CLIPBTN = 102 ID_PASSEDIT = 201 ID_PASSLEN = 202 ; Идентификатор сочетания клавиш WIN + F12. ; ID_HOTKEY = 1 ; Дефиниция констант соответствующих номерам сообщений используемых для ; управления полями редактирования. ; ; Константы равны WM_USER + 2 для избежания возможных конфликтов ; с сообщениями DM_GETDEFID и DM_SETDEFID, равными номерам WM_USER и ; WM_USER + 1, которые может вызвать функция 'IsDialogMessage'. ; WM_GETPASSLEN = WM_USER + 2 WM_GETCHARSET = WM_USER + 2 push ebx ecx edx esi edi cmp [wmsg], WM_CREATE je .wmcreate cmp [wmsg], WM_COMMAND je .wmcommand cmp [wmsg], WM_HOTKEY je .wmhotkey cmp [wmsg], WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam] jmp .finish .wmcreate: ; Определение провайдера криптографических услуг, хэндл которого помещаем ; в переменную '.hProv'. ; invoke CryptAcquireContext, .hProv, NULL, NULL, PROV_RSA_FULL, 0 test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_GROUPBOX,\ 0, 0, 265, 172, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "Пароль" test eax, eax jz .failed invoke CreateWindowEx, WS_EX_CLIENTEDGE,\ _edit, 0,\ WS_VISIBLE + WS_CHILD + WS_VSCROLL + ES_READONLY + ES_AUTOVSCROLL + ES_MULTILINE,\ 15, 25, 235, 80, [hwnd], ID_PASSEDIT, [hInstance], NULL test eax, eax jz .failed invoke SendMessage, eax, WM_SETFONT, [Font], FALSE invoke CreateWindowEx, NULL,\ _static, 0,\ WS_VISIBLE + WS_CHILD + SS_RIGHT,\ 15, 128, 50, 20, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "Длина:" test eax, eax jz .failed invoke CreateWindowEx, WS_EX_CLIENTEDGE,\ _edit, 0,\ WS_VISIBLE + WS_CHILD + ES_RIGHT + WS_TABSTOP,\ 70, 128, 50, 20, [hwnd], ID_PASSLEN, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax ; Замена стандартной процедуры обслуживания поля редактирования 'ID_PASSLEN' ; новой, определённой нами. ; invoke SetWindowLong, ebx, GWL_WNDPROC, PassLenEditProc test eax, eax jz .failed mov [PassLenEditProc.OldWndProc], eax ; Определение максимального количества символов, которые можно ввести в поле ; длины паролей. ; invoke SendMessage, ebx, EM_SETLIMITTEXT, 4, 0 invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + WS_TABSTOP + BS_ICON,\ 133, 120, 36, 36, [hwnd], ID_CLIPBTN, [hInstance], NULL test eax, eax jz .failed ; Загрузка иконки с изображением карточек, которая будет помещена на кнопке ; используемой для копирования созданного пароля в буфер обмена. ; invoke LoadIcon, [hInstance], ID_COPYICON test eax, eax jz .failed invoke SendDlgItemMessage, [hwnd], ID_CLIPBTN, BM_SETIMAGE, IMAGE_ICON, eax invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + WS_TABSTOP + BS_DEFPUSHBUTTON,\ 180, 119, 70, 38, [hwnd], ID_GENBTN, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "Создай" test eax, eax jz .failed ; Выделение блока памяти для таблицы составных символов генерируемых паролей. ; invoke LocalAlloc, LMEM_ZEROINIT, 224 test eax, eax jz .failed mov [.CharTab], eax ; Регистрация сочетания клавиш WIN + F12 связанного с окном приложения. ; invoke RegisterHotKey, [hwnd], ID_HOTKEY, MOD_WIN, VK_F12 test eax, eax jz .failed xor eax, eax jmp .finish .failed: stdcall ShowLastError, [hwnd] or eax, -1 jmp .finish .wmcommand: mov eax, [wparam] and eax, 0FFFFh cmp eax, ID_CLIPBTN je .copy cmp eax, ID_GENBTN jne .defwndproc ; Операции исполняемые после нажатия кнопки 'Создай'. ; .GenBtn: ; Посылка полю редактирования 'ID_PASSLEN' пользовательского сообщения для ; определения длины генерируемых паролей. ; invoke SendDlgItemMessage, [hwnd], ID_PASSLEN, WM_GETPASSLEN, 0, 0 test eax, eax jz .clear mov [PassLen], eax ; Посылка "символьной" панели пользовательского сообщения для определения выбранного ; набора символов. ; invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0 ; Цикл, в котором преображаем характеристическую функцию набора символов в таблицу ; составных знаков генерированных паролей. ; mov edi, [.CharTab] mov eax, 31 .FillCharTabLoop: inc al bt [CharFun - 4], eax mov byte [edi], al ; CharTab[x] := al adc edi, 0 ; x := x + CharFun[eax - 32] test al, al jnz .FillCharTabLoop ; Определение длины таблицы символов. ; sub edi, [.CharTab] test edi, edi jz .clear mov [CharTabLen], edi ; Превращение длины пароля в символах в количество байтов необходимых для ; хранения созданного пароля. ; mov ebx, [PassLen] shl ebx, 1 mov eax, ebx add eax, 2 ; Выделение блока памяти для созданного пароля. ; invoke LocalAlloc, LMEM_ZEROINIT, eax test eax, eax jz .failed mov [Password], eax ; Заполнение буфера случайным содержимым. ; invoke CryptGenRandom, [.hProv], ebx, eax test eax, eax jz .failed ; Цикл, в котором байты созданного пароля заменяем символами принадлежащими ; множеству допускаемых символов. ; mov ecx, [PassLen] mov esi, [Password] mov edi, esi mov ebx, [.CharTab] cld .GenPasswordLoop: xor edx, edx lodsw ; div [CharTabLen] ; movzx ax, byte [ebx + edx] ; Password[x] := CharTab[Password[x] mod CharTabLen] stosw ; loop .GenPasswordLoop ; Помещение созданного пароля в поле редактирования 'ID_PASSEDIT'. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, [Password] ; Освобождение блока памяти выделенного для хранения пароля. ; invoke LocalFree, [Password] test eax, eax jnz .failed jmp .finish ; Операции исполняемые после нажатия сочетания клавиш WIN + F12. ; .wmhotkey: cmp [wparam], ID_HOTKEY jne .finish ; Создание нового пароля. ; invoke SendDlgItemMessage, [hwnd], ID_GENBTN, BM_CLICK, 0, 0 ; Загрузка пароля в буфер обмена после нажатия кнопки с иконкой или использования ; сочетания клавиш WIN + F12. ; .copy: ; Определение количества символов пароля и вычисление количества байтов ; буфера предназначенного для загрузки скопированного пароля. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXTLENGTH, 0, 0 inc eax mov ebx, eax shl eax, 1 ; Выделение блока памяти для копированного пароля. ; invoke GlobalAlloc, GHND + GMEM_DDESHARE, eax ; GHND = GMEM_MOVEABLE + GMEM_ZEROINIT test eax, eax jz .failed ; Блокировка блока памяти и получение указателя на его первый байт. ; invoke GlobalLock, eax test eax, eax jz .failed xchg esi, eax ; Открытие буфера обмена и блокировка возможности изменения его ; содержимого другими приложениями. ; invoke OpenClipboard, [hwnd] test eax, eax jz .failed ; Очистка буфера обмена, освобождение всех хэндлов данных находящихся ; внутри и привязка его к окну приложения. ; invoke EmptyClipboard test eax, eax jz .failed ; Загрузка пароля в выделенный блок памяти. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXT, ebx, esi ; Перенос пароля (в формате Unicode) в буфер обмена. ; invoke SetClipboardData, CF_UNICODETEXT, esi test eax, eax jz .failed ; Снятие блокировки с блока памяти используемого как буфер для загрузки ; паролей. ; invoke GlobalUnlock, esi test eax, eax jz .failed ; Закрытие буфера обмена, что даёт возможность доступа к нему другим ; приложениям. ; invoke CloseClipboard test eax, eax jz .failed jmp .finish ; Очищение поля 'ID_PASSEDIT' в случае пустого множества составных символов или для длины ; пароля равной нулю. ; .clear: invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, 0 jmp .finish .wmdestroy: ; Освобождение сочетания клавиш WIN + F12. ; invoke UnregisterHotKey, [hwnd], ID_HOTKEY test eax, eax jz .failed ; Освобождение блока памяти выделенного для таблицы составных знаков. ; invoke LocalFree, [.CharTab] test eax, eax jnz .failed ; Освобождение хэндла провайдера криптографических услуг. ; invoke CryptReleaseContext, [.hProv], 0 test eax, eax jz .failed xor eax, eax .finish: pop edi esi edx ecx ebx ret align 4 ; Хэндл таблицы составных знаков. ; .CharTab dd ? ; Хэндл провайдера криптографических услуг. ; .hProv dd ? endp ; Новая процедура обслуживания поля редактирования предназначенного для определения длины ; пароля. ; proc PassLenEditProc, hwnd, wmsg, wparam, lparam cmp [wmsg], WM_CHAR je .wmchar cmp [wmsg], WM_GETPASSLEN je .wmuser cmp [wmsg], WM_PASTE ; Блокировка операции вставки текста je .finish ; в поле редактирования. .defwndproc: invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam] jmp .finish ; Поле редактирования принимает только символы '0', ..., '9' и 'backspace'. ; .wmchar: mov eax, [wparam] cmp eax, VK_BACK je .defwndproc cmp eax, '0' jb .finish cmp eax, '9' ja .finish jmp .defwndproc ; После получения сообщения WM_GETPASSLEN поле редактирования рассчитывает ; число соответствующее последовательности десятичных цифр и помещает это ; значение в регистре eax. Благодаря этому число доступно в процедуре, которая ; отправила сообщение. ; .wmuser: push ebx esi ; Получение содержимого поля редактирования. ; lea esi, [PassLen] invoke SendMessage, [hwnd], WM_GETTEXT, 5, esi ; Цикл, в котором рассчитываем значение соответствующее последовательности ; десятичных цифр. ; xor eax, eax xor ebx, ebx cld .Loop: lodsw test eax, eax jz .LoopEnd ; ebx := 10*ebx + (eax - '0') ; lea ebx, [ebx + 4*ebx] ; ebx := ebx + 4*ebx = 5*ebx shl ebx, 1 ; ebx := 2*ebx sub al, '0' ; add ebx, eax ; ebx := ebx + (eax - '0') jmp .Loop .LoopEnd: xchg eax, ebx pop esi ebx .finish: ret align 4 ; Хэндл оригинальной процедуры обслуживания поля редактирования. ; .OldWndProc dd ? endp ; Процедура обслуживания панели, в которой определяем набор составных символов для ; создающихся паролей. ; proc CharPanelProc, hwnd, wmsg, wparam, lparam ; Дефиниции констант соответствующих идентификаторам контролов панели. ; ID_CHKBOX1 = 1 ID_CHKBOX2 = 2 ID_CHKBOX3 = 3 ID_CHKBOX4 = 4 ID_PASSCHARS = 101 push ebx cmp [wmsg], WM_CREATE je .wmcreate cmp [wmsg], WM_COMMAND je .wmcommand cmp [wmsg], WM_GETCHARSET je .wmuser cmp [wmsg], WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam] jmp .finish .wmcreate: invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_GROUPBOX,\ 0, 0, 265, 95, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "Применяемые символы" test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\ 27, 25, 40, 17, [hwnd], ID_CHKBOX1, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "A-Z" test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\ 87, 25, 40, 17, [hwnd], ID_CHKBOX2, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "a-z" test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\ 147, 25, 40, 17, [hwnd], ID_CHKBOX3, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "0-9" test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _button, 0,\ WS_VISIBLE + WS_CHILD + BS_AUTOCHECKBOX + WS_TABSTOP,\ 207, 25, 40, 17, [hwnd], ID_CHKBOX4, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "_" test eax, eax jz .failed invoke CreateWindowEx, NULL,\ _static, 0,\ WS_VISIBLE + WS_CHILD + SS_RIGHT,\ 27, 60, 50, 20, [hwnd], 0, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE invoke SetWindowText, ebx, "Другие:" test eax, eax jz .failed invoke CreateWindowEx, WS_EX_CLIENTEDGE,\ _edit, 0,\ WS_VISIBLE + WS_CHILD + ES_AUTOHSCROLL + WS_TABSTOP,\ 82, 60, 155, 20, [hwnd], ID_PASSCHARS, [hInstance], NULL test eax, eax jz .failed xchg ebx, eax invoke SendMessage, ebx, WM_SETFONT, [Font], FALSE ; Замена стандартной процедуры обслуживания поля редактирования 'ID_PASSCHARS' ; новой, определённой нами. ; invoke SetWindowLong, ebx, GWL_WNDPROC, PassCharsEditProc test eax, eax jz .failed mov [PassCharsEditProc.OldWndProc], eax xor eax, eax jmp .finish .failed: stdcall ShowLastError, [hwnd] or eax, -1 jmp .finish ; Если данное сообщение касается любого переключателя, тогда изменяем значение ; соответствующего флага. ; .wmcommand: mov eax, [wparam] and eax, 0FFFFh jz .defwndproc cmp eax, ID_CHKBOX4 ja .defwndproc dec eax btc [Flags], ax jmp .defwndproc ; В случае перехвата сообщения WM_GETCHARSET передаем его полю редактирования ; 'ID_PASSCHARS', которое изменит характеристическую функцию учитывая определённый ; пользователем набор символов. ; .wmuser: invoke SendDlgItemMessage, [hwnd], ID_PASSCHARS, WM_GETCHARSET, 0, 0 jmp .finish .wmdestroy: xor eax, eax .finish: pop ebx ret endp ; Новая процедура обслуживания поля редактирования, в котором пользователь определяет ; собственный набор символов для генерируемых паролей. ; proc PassCharsEditProc, hwnd, wmsg, wparam, lparam locals Buffer dd ? endl cmp [wmsg], WM_CHAR je .wmchar cmp [wmsg], WM_GETCHARSET je .wmuser cmp [wmsg], WM_PASTE ; Блокировка операции вставки текста je .finish ; в поле редактирования. .defwndproc: invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam] jmp .finish ; Ограничение набора знаков, которые можно ввести пользуясь клавиатурой, ; до символов соответствующих шестнадцатеричным кодам от 20h до FFh и ; символа 'backspace'. ; .wmchar: mov eax, [wparam] cmp eax, VK_BACK je .defwndproc cmp eax, 20h jb .finish cmp ax, 0FFh ja .finish jmp .defwndproc .failed: stdcall ShowLastError, [hwnd] or eax, -1 jmp .finish ; В случае перехвата сообщения WM_GETCHARSET содержимое поля ; редактирования перерабатывается для дополнения символами ; определёнными пользователем характеристической функции набора ; знаков создающихся паролей. ; .wmuser: push ebx ecx esi edi ; Очистка таблицы определяющей характеристическую функцию набора ; составных символов создающихся паролей. ; xor eax, eax mov ecx, 7 mov edi, CharFun cld rep stosd ; Загрузка в регистр ebx информации о состоянии переключателей. ; movzx ebx, [Flags] ; Если любой из флагов соответствующих переключателям установлен, ; тогда характеристическую функцию дополняем нужной основной ; категорией символов. ; .Check_AZ: bt ebx, 0 jnc .Check_az or [CharFun + 4], 07FFFFFEh .Check_az: bt ebx, 1 jnc .Check_09 or [CharFun + 8], 07FFFFFEh .Check_09: bt ebx, 2 jnc .Check__ or [CharFun], 03FF0000h .Check__: bt ebx, 3 jnc .OtherChars bts dword [CharFun + 4], 31 ; Дополнение характеристической функции символами определёнными ; пользователем. ; .OtherChars: ; Определение длины содержимого поля редактирования. ; invoke SendMessage, [hwnd], WM_GETTEXTLENGTH, 0, 0 inc eax mov ebx, eax shl eax, 1 ; Выделение блока памяти предназначенного для текста полученного ; из поля редактирования. ; invoke LocalAlloc, LMEM_ZEROINIT, eax test eax, eax jz .failed mov [Buffer], eax ; Помещение содержимого поля редактирования в выделенном буфере. ; invoke SendMessage, [hwnd], WM_GETTEXT, ebx, eax ; Цикл, в котором устанавливаем биты характеристической функции набора ; символов соответствующее кодам знаков определённых пользователем. ; xor eax, eax mov esi, [Buffer] cld .Loop: lodsw test eax, eax jz .LoopEnd bts [CharFun - 4], eax ; CharFun[eax - 32] := 1 jmp .Loop .LoopEnd: ; Освобождение блока памяти выделенного для буфера. ; invoke LocalFree, [Buffer] test eax, eax jnz .failed pop edi esi ecx ebx .finish: ret align 4 ; Хэндл оригинальной процедуры обслуживания поля редактирования. ; .OldWndProc dd ? endp ; Процедура обслуживания "непредвиденных случаев", показывающая окно с сообщением ; об ошибке, которая случилась во время работы программы. ; proc ShowLastError, hwnd locals Buffer dd ? endl push ebx invoke GetLastError lea ebx, [Buffer] invoke FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM, 0, eax, LANG_NEUTRAL, ebx, 0, 0 invoke MessageBox, [hwnd], [Buffer], NULL, MB_ICONERROR + MB_OK invoke LocalFree, [Buffer] pop ebx ret endp .end start ; Секция программы, в которой определяем ресурсы приложения. ; section '.rsrc' resource data readable RT_MANIFEST = 24 ID_MANIFEST = 1 ID_MAINICON = 1 ID_COPYICON = 2 directory RT_ICON, icons,\ RT_GROUP_ICON, icon_groups,\ RT_VERSION, versions,\ RT_MANIFEST, manifest resource icons,\ 1, LANG_NEUTRAL, main_icon_data,\ 2, LANG_NEUTRAL, copy_icon_data resource icon_groups,\ ID_MAINICON, LANG_NEUTRAL, main_icon_grp_data,\ ID_COPYICON, LANG_NEUTRAL, copy_icon_grp_data resource versions,\ 1, LANG_NEUTRAL, version resource manifest,\ ID_MANIFEST, LANG_NEUTRAL, man versioninfo version, VOS__WINDOWS32, VFT_APP, VFT2_UNKNOWN, LANG_ENGLISH + SUBLANG_DEFAULT, 0,\ 'FileDescription', 'Простой генератор паролей.',\ 'LegalCopyright', '(C) Mikołaj Hajduk, 2008',\ 'FileVersion', PROG_VERSION,\ 'ProductVersion', PROG_VERSION,\ 'OriginalFilename', 'SimPaGen.exe' ; Данные главной иконки программы включенной непосредственно в исходник. ; main_icon_data dd RVA main_idata, 0x2E8, 0, 0 main_idata db 0x28, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0 db 0x40, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0xF9, 0x0, 0xC, 0x0 db 0xE9, 0x0, 0x2B, 0x0, 0xDC, 0x0, 0x46, 0x0 db 0xD4, 0x0, 0x56, 0x0, 0xCC, 0x0, 0x67, 0x0 db 0xC4, 0x0, 0x77, 0x0, 0xBB, 0x0, 0x88, 0x0 db 0xB3, 0x0, 0x98, 0x0, 0xAB, 0x0, 0xA9, 0x0 db 0xA3, 0x0, 0xB9, 0x0, 0x9B, 0x0, 0xC9, 0x0 db 0x92, 0x0, 0xDA, 0x0, 0x8A, 0x0, 0xEA, 0x0 db 0x82, 0x0, 0xFB, 0x0, 0x0, 0xFF, 0xFF, 0x0 db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF db 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE db 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF db 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD db 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDF db 0xFD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD db 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDF db 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC db 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF db 0xFC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC db 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF db 0xFB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB db 0xBB, 0xBB, 0xBB, 0xBB, 0xBF, 0xFB, 0xBB, 0xBF db 0xFB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB db 0xBB, 0xBB, 0xBB, 0xBB, 0xBF, 0xFB, 0xBB, 0xBF db 0xFA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA db 0xAA, 0xAA, 0xAA, 0xAA, 0xAF, 0xFA, 0xAA, 0xAF db 0xFA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA db 0xAA, 0xAA, 0xAA, 0xAA, 0xAF, 0xFA, 0xAA, 0xAF db 0xF9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99 db 0x99, 0x99, 0x99, 0x99, 0x9F, 0xF9, 0x99, 0x9F db 0xF9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99 db 0x99, 0x99, 0x99, 0x99, 0x9F, 0xF9, 0x99, 0x9F db 0xF8, 0x88, 0x88, 0x88, 0xFF, 0x88, 0x88, 0x88 db 0x88, 0xFF, 0x88, 0x88, 0x8F, 0xF8, 0x88, 0x8F db 0xF8, 0x88, 0x8F, 0xF8, 0xFF, 0x8F, 0xF8, 0x8F db 0xF8, 0xFF, 0x8F, 0xF8, 0x8F, 0xF8, 0x88, 0x8F db 0xF7, 0x77, 0x77, 0xFF, 0xFF, 0xFF, 0x77, 0x77 db 0xFF, 0xFF, 0xFF, 0x77, 0x7F, 0xF7, 0x77, 0x7F db 0xF7, 0x77, 0x77, 0x7F, 0xFF, 0xF7, 0x77, 0x77 db 0x7F, 0xFF, 0xF7, 0x77, 0x7F, 0xF7, 0x77, 0x7F db 0xF6, 0x66, 0x66, 0x6F, 0xFF, 0xF6, 0x66, 0x66 db 0x6F, 0xFF, 0xF6, 0x66, 0x6F, 0xF6, 0x66, 0x6F db 0xF6, 0x66, 0x66, 0xFF, 0xFF, 0xFF, 0x66, 0x66 db 0xFF, 0xFF, 0xFF, 0x66, 0x6F, 0xF6, 0x66, 0x6F db 0xF5, 0x55, 0x5F, 0xF5, 0xFF, 0x5F, 0xF5, 0x5F db 0xF5, 0xFF, 0x5F, 0xF5, 0x5F, 0xF5, 0x55, 0x5F db 0xF5, 0x55, 0x55, 0x55, 0xFF, 0x55, 0x55, 0x55 db 0x55, 0xFF, 0x55, 0x55, 0x5F, 0xF5, 0x55, 0x5F db 0xF4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 db 0x44, 0x44, 0x44, 0x44, 0x4F, 0xF4, 0x44, 0x4F db 0xF4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 db 0x44, 0x44, 0x44, 0x44, 0x4F, 0xF4, 0x44, 0x4F db 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 db 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF3, 0x33, 0x3F db 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 db 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF3, 0x33, 0x3F db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 db 0x22, 0x22, 0x22, 0x22, 0x2F, 0xF2, 0x22, 0x2F db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 db 0x22, 0x22, 0x22, 0x22, 0x2F, 0xF2, 0x22, 0x2F db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F db 0xF2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 db 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2F db 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F db 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 db 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 align 4 main_icon_grp_data dd RVA main_icon_grp_header, 20, 0, 0 main_icon_grp_header dw 0, 1, 1 dd 0x102020, 0x40001, 0x2E8 dw main_icon_data.resid align 4 ; Данные иконки помещенной на кнопке используемой для копирования созданного пароля ; в буфер обмена. ; copy_icon_data dd RVA copy_idata, 0x2E8, 0, 0 copy_idata db 0x28, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0 db 0x40, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x31, 0x2D, 0x2C, 0x0, 0x96, 0x60, 0x29, 0x0 db 0xC4, 0x9F, 0x57, 0x0, 0x38, 0x3C, 0x8F, 0x0 db 0x97, 0x6D, 0xA9, 0x0, 0x4A, 0x92, 0xAF, 0x0 db 0xAB, 0xA4, 0x9B, 0x0, 0xDE, 0xB3, 0x97, 0x0 db 0xB1, 0xCE, 0xAA, 0x0, 0xE8, 0xDC, 0xAE, 0x0 db 0x99, 0xAA, 0xDB, 0x0, 0xA0, 0xD0, 0xF4, 0x0 db 0xC0, 0xC0, 0xC0, 0x0, 0xFE, 0xFE, 0xFE, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x50, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xEE, 0xEE db 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x0, 0x0, 0x8, 0xFF, 0xF5 db 0x4C, 0x20, 0x97, 0xF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8E, 0xEE, 0xE8, 0xFF, 0xF9 db 0xFD, 0x8F, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xF7 db 0x0, 0xA, 0x53, 0xDF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x58, 0xFF, 0xF2 db 0x2, 0x33, 0x70, 0xBF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x98, 0xFF, 0xFF db 0xFF, 0xFF, 0xFC, 0xBF, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x78, 0xFF, 0xF3 db 0x57, 0x22, 0x36, 0x5F, 0xFE, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xF8, 0x0, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x5, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x28, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF, 0xF8, 0x80, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xF8, 0x88, 0x88 db 0x88, 0x88, 0x88, 0x88, 0x5, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0x35, 0x72, 0x23 db 0x65, 0xFF, 0xE0, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF db 0xFF, 0x80, 0x0, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF db 0xFF, 0x8F, 0x80, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF db 0xFF, 0x88, 0x5, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x88, 0x88, 0x88, 0x88, 0x88 db 0x88, 0x80, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 db 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 align 4 copy_icon_grp_data dd RVA copy_icon_grp_header, 20, 0, 0 copy_icon_grp_header dw 0, 1, 1 dd 0x102020, 0x40001, 0x2E8 dw copy_icon_data.resid align 4 ; Данные манифеста включенного непосредственно в исходник. ; resdata man db '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' db '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">' db '<assemblyIdentity ' db 'version="', PROG_VERSION,'" ' db 'processorArchitecture="X86" ' db 'name="Mikołaj Hajduk.SimPaGen" ' db 'type="win32"' db '/>' db '<description>Простой генератор паролей.</description>' db '<dependency>' db '<dependentAssembly>' db '<assemblyIdentity ' db 'type="win32" ' db 'name="Microsoft.Windows.Common-Controls" ' db 'version="6.0.0.0" ' db 'processorArchitecture="X86" ' db 'publicKeyToken="6595b64144ccf1df" ' db 'language="*"' db '/>' db '</dependentAssembly>' db '</dependency>' db '</assembly>' endres