; Program w FASMie służący do generowania haseł złożonych ze znaków należących ; do dowolnej kombinacji czterech predefiniowanych kategorii: ; ; * litery A, ..., Z, ; * litery a, ..., z, ; * cyfry 0, ..., 9, ; * znak podkreślenia '_' ; ; oraz dowolnego zbioru znaków zdefiniowanego przez użytkownika. Ilość wszystkich ; możliwych do zdefiniowania niepustych zbiorów znaków składowych jest równa ; 2^224-1 (ilość wszystkich niepustych podzbiorów zbioru znaków o szesnastkowych ; kodach od 0x20 do 0xFF). Maksymalna długość wygenerowanego hasła wynosi 9999 ; znaków. Utworzone hasło można skopiować do schowka przy pomocy przycisku z ikoną. ; ; Ponadto, dzięki istnieniu skrótu klawiszowego WIN + F12, istnieje możliwość ; jednoczesnego wygenerowania nowego hasła i umieszczenia go w schowku, nawet ; w przypadku, gdy okno programu nie jest aktywne. ; ; Ustawienia programu dotyczące ilości znaków hasła oraz zbioru znaków składowych ; tworzonych haseł są zapisywane każdorazowo przed zakończeniem pracy aplikacji ; w kluczu rejestru ; ; HKEY_CURRENT_USER\Software\SimPaGen\<wersja_programu> ; ; Program wykorzystuje funkcje CryptoAPI biblioteki 'advapi32.dll', dzięki czemu ; uzyskany ciąg znaków hasła jest "kryptograficznie losowy". ; ; Do pliku źródłowego programu włączono bezpośrednio treść manifestu, jak również ; dane ikon programu. ; ; Program może być traktowany jako przykład subclassingu zastosowanego do pól ; tekstowych. ; ; (C) Mikołaj Hajduk, 11.09.2008. ; ; Strona domowa: http://mikhajduk.houa.org ; E-mail: mikhajduk@gmail.com ; format PE GUI 4.0 ; Wklejenie pliku zawierającego definicje wszystkich niezbędnych makr FASMa ; wykorzystanych w programie. ; include 'win32wx.inc' ; Określenie zestawu znaków, użytego do zakodowania treści pliku źródłowego. ; include '\ENCODING\utf8.inc' ; Stała przechowująca informację nt. aktualnej wersji programu. ; PROG_VERSION equ '2008.09.11.0' ; Definicje danych globalnych. ; section '.data' data readable writeable ; Łańcuchy znaków zawierające nazwy klas predefiniowanych w systemie Windows. ; _edit du 'EDIT', 0 _button du 'BUTTON', 0 _static du 'STATIC', 0 ; Łańcuchy znaków przechowujące nazwy definiowanych przez nas klas. ; _MainClass du 'SimPaGen', 0 _PassPanelClass du 'PassPanel', 0 _CharPanelClass du 'CharPanel', 0 ; Definicje używanych w programie klas okien. ; 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 ; Uchwyt czcionki używanej do wyświetlania napisów w kontrolkach. ; Font dd ? ; Struktura przechowująca informacje nt. przetwarzanego komunikatu. ; msg MSG ; Uchwyt modułu aplikacji. ; hInstance dd ? ; Uchwyt panelu, w którym generujemy hasła. ; PassPanel dd ? ; Uchwyt panelu, w którym definiowany jest zbiór znaków składowych ; dla tworzonych haseł. ; CharPanel dd ? ; Tablica definiująca funkcję charakterystyczną zbioru znaków składowych. ; CharFun rd 7 ; Tablica przechowująca łańcuchową reprezentację liczby określającej ; długość tworzonych haseł. ; PassLen du '10' rb 6 ; Zmienna przechowująca zestaw flag informujących o stanie pól wyboru ; odpowiadających standardowym kategoriom znaków. ; Flags dw 0 ; Sekcja zawierająca kod wykonywalny programu. ; section '.code' code readable writeable executable start: ; Sprawdzenie, czy biblioteka 'comctl32.dll' jest załadowana. ; Jest to konieczne, jeśli chcemy korzystać z pliku manifestu. ; invoke InitCommonControls ; Pobranie uchwytu modułu aplikacji. ; 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 ; Zarejestrowanie używanych w programie klas okien. ; 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 ; Pętla, w której dokonujemy przetworzenia komunikatów dotyczących naszego ; okna aplikacji. ; msg_loop: invoke GetMessage, msg, NULL, 0, 0 cmp eax, -1 je error cmp eax, 1 jb end_loop jne msg_loop ; Sprawdzamy, czy dany komunikat dotyczy któregoś z paneli. Jeśli tak, ; wówczas przetwarzamy ten komunikat w celu odpowiedniej interpretacji ; naciśnięcia takich klawiszy, jak TAB i klawisze sterujące kursorem ; (wybór określonych kontrolek panelu). ; 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] ; Procedura obsługi okna aplikacji. ; 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: ; Utworzenie czcionki używanej do wyświetlania napisów etykiet, na przyciskach ; oraz w oknach tekstowych. ; 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 ; Utworzenie klucza rejestru (lub otwarcie go, jeśli wcześniej istniał) ; przypisanego do bieżącej aplikacji. ; 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 ; Sprawdzenie, czy wartość wpisanej przez funkcję 'RegCreateKeyEx' do zmiennej ; lokalnej 'Disposition' informuje o fakcie utworzenia klucza rejestru. ; cmp dword [ebx], REG_CREATED_NEW_KEY jne .CreatePanels ; Jeśli tak, to do klucza rejestru wpisywane są domyślne, startowe wartości ; określające długość hasła oraz funkcję charakterystyczną zbioru znaków ; składowych tworzonych haseł. ; .SaveStartRegValues: ; Zarezerwowanie bloku pamięci używanego podczas wpisywania wartości ; do klucza rejestru skojarzonego z programem. ; invoke LocalAlloc, LMEM_ZEROINIT, 29 test eax, eax jz .failed xchg ebx, eax ; Zapisanie stanu pól wyboru określających użycie predefiniowanych kategorii ; znaków (domyślnie użyte są litery A-Z oraz cyfry 0-9). ; mov byte [ebx], 5 ; [A-Z] + [0-9] invoke RegSetValueEx, [.hKey], .FlagsRegVal, 0, REG_BINARY, ebx, 2 test eax, eax jnz .failed ; Zapis funkcji charakterystycznej zbioru składowych (bez uwzględnienia ; predefiniowanych kategorii). ; lea eax, [ebx + 1] ; eax := ebx + 1 invoke RegSetValueEx, [.hKey], .CharFunRegVal, 0, REG_BINARY, eax, 28 test eax, eax jnz .failed ; Zwolnienie bloku pamięci używanego do operacji na rejestrze Windows. ; invoke LocalFree, ebx test eax, eax jnz .failed ; Zapis w kluczu rejestru skojarzonym z programem łańcucha znaków ; określającego standardową długość hasła. ; invoke RegSetValueEx, [.hKey], .PassLenRegVal, 0, REG_SZ, PassLen, 10 test eax, eax jnz .failed .CreatePanels: ; Utworzenie panelu, w którym generowane są hasła. ; 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 ; Utworzenie panelu, w którym definiujemy zbiór znaków składowych tworzonych ; haseł. ; 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 ; Pobranie zapisanej w skojarzonym z programem kluczu rejestru funkcji ; charakterystycznej zbioru znaków składowych. ; invoke RegQueryValueEx, [.hKey], .CharFunRegVal, 0, 0, CharFun, .CharFunBufSize test eax, eax jnz .failed ; Pobranie reprezentacji łańcuchowej długości tworzonych haseł. ; invoke RegQueryValueEx, [.hKey], .PassLenRegVal, 0, 0, PassLen, .PassLenBufSize test eax, eax jnz .failed ; Umieszczenie tegoż łańcucha znaków w polu tekstowym 'ID_PASSLEN'. ; invoke SendDlgItemMessage, [PassPanel], ID_PASSLEN, WM_SETTEXT, 0, PassLen ; Rezerwacja bloku pamięci używanego do przechowania zbioru znaków zdefiniowanych ; przez użytkownika. ; invoke LocalAlloc, LMEM_ZEROINIT, 450 test eax, eax jz .failed xchg edi, eax mov esi, edi ; Pętla, w której przetwarzamy funkcję charakterystyczną zbioru znaków w łańcuch ; znaków Unikodu zawierający znaki składowe zdefiniowane przez użytkownika. ; 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 ; Umieszczenie zbioru znaków składowych w polu tekstowym 'ID_PASSCHARS'. ; invoke SendDlgItemMessage, [CharPanel], ID_PASSCHARS, WM_SETTEXT, 0, esi ; Pobranie zapisanego w rejestrze systemowym zestawu flag określających ; stan pól wyboru odpowiadających predefiniowanym kategoriom znaków. ; invoke RegQueryValueEx, [.hKey], .FlagsRegVal, 0, 0, esi, .FlagsBufSize test eax, eax jnz .failed movzx ebx, word [esi] ; W zależności od wartości danych flag określamy stan pól wyboru. ; .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: ; Zwolnienie bloku pamięci wykorzystywanego do przechowywania ; zbioru znaków zdefiniowanych przez użytkownika. ; invoke LocalFree, esi test eax, eax jnz .failed ; Symulacja naciśnięcia klawisza 'Utwórz' w celu wygenerowania przykładowego ; hasła. ; invoke SendDlgItemMessage, [PassPanel], ID_GENBTN, BM_CLICK, 0, 0 xor eax, eax jmp .finish .failed: stdcall ShowLastError, [hwnd] or eax, -1 jmp .finish .wmdestroy: ; ; Zapisanie ustawień programu w kluczu rejestru skojarzonym z aplikacją. ; ; Pobranie do tablicy 'CharFun' funkcji charakterystycznej zbioru znaków ; składowych. ; invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0 ; W zależności od wartości flag wykluczamy z funkcji charakterystycznej ; predefiniowane kategorie znaków. ; 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 ; Zapisanie łańcuchowej reprezentacji długości tworzonych haseł, zmodyfikowanej ; funkcji charakterystycznej zbioru znaków oraz zestawu flag w kluczu rejestru. ; .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 ; Zamknięcie klucza rejestru skojarzonego z aplikacją. ; invoke RegCloseKey, [.hKey] test eax, eax jnz .failed ; Usunięcie utworzonej czcionki. ; invoke DeleteObject, [Font] test eax, eax jz .failed invoke PostQuitMessage, 0 xor eax, eax .finish: pop edi esi ebx ret align 4 ; Zmienne wykorzystywane podczas operacji na kluczu rejestru. ; .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 ; Procedura obsługi panelu, w którym dochodzi do generowania haseł. ; proc PassPanelProc, hwnd, wmsg, wparam, lparam locals Password dd ? PassLen dd ? CharTabLen dd ? endl ; Typ dostarczyciela usług kryptograficznych (CSP) wykorzystywanego ; do generowania losowego ciągu znaków hasła. ; PROV_RSA_FULL = 1 ; Stałe przechowujące identyfikatory kontrolek panelu. ; ID_GENBTN = 101 ID_CLIPBTN = 102 ID_PASSEDIT = 201 ID_PASSLEN = 202 ; Identyfikator skrótu klawiszowego WIN + F12. ; ID_HOTKEY = 1 ; Zdefiniowanie stałych przechowujących kody komunikatów użytkownika ; wykorzystywanych do komunikacji z polami tekstowymi programu. ; ; Stałym nadajemy wartość równą WM_USER + 2 w celu uniknięcia możliwych ; konfliktów z komunikatami DM_GETDEFID i DM_SETDEFID, równymi ; odpowiednio WM_USER i WM_USER + 1, które może wygenerować funkcja ; '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: ; Określenie dostarczyciela usług kryptograficznych i umieszczenie ; uchwytu tegoż w zmiennej '.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, "Hasło" 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, "Długość:" 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 ; Zastąpienie domyślnej procedury obsługi pola tekstowego 'ID_PASSLEN' procedurą ; zdefiniowaną w programie. ; invoke SetWindowLong, ebx, GWL_WNDPROC, PassLenEditProc test eax, eax jz .failed mov [PassLenEditProc.OldWndProc], eax ; Ograniczenie do 4 ilości znaków możliwych do wprowadzenia do pola tekstowego ; 'ID_PASSLEN'. ; 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 ; Załadowanie ikony i umieszczenie jej na przycisku służącym do kopiowania ; wygenerowanego hasła do schowka. ; 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, "Utwórz" test eax, eax jz .failed ; Zarezerwowanie bloku pamięci niezbędnego do przechowania zbioru znaków ; składowych hasła. ; invoke LocalAlloc, LMEM_ZEROINIT, 224 test eax, eax jz .failed mov [.CharTab], eax ; Rejestracja skrótu klawiszowego WIN + F12 i skojarzenie go z oknem aplikacji. ; 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 ; Operacje wykonywane w przypadku naciśnięcia przycisku 'Utwórz'. ; .GenBtn: ; Wysłanie do pola tekstowego 'ID_PASSLEN' komunikatu użytkownika w celu określenia ; ilości znaków generowanego hasła. ; invoke SendDlgItemMessage, [hwnd], ID_PASSLEN, WM_GETPASSLEN, 0, 0 test eax, eax jz .clear mov [PassLen], eax ; Wysłanie do panelu, w którym definiowany jest zbiór znaków używanych do generowania ; haseł, komunikatu użytkownika w celu określenia zdefiniowanego przez użytkownika ; zbioru znaków dodatkowych. ; invoke SendMessage, [CharPanel], WM_GETCHARSET, 0, 0 ; Pętla, w której przetwarzamy funkcję charakterystyczną zbioru znaków w tablicę ; zawierającą znaki tworzonych haseł. ; 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 ; Określenie długości tablicy znaków. ; sub edi, [.CharTab] test edi, edi jz .clear mov [CharTabLen], edi ; Przetworzenie długości hasła w znakach w ilość bajtów niezbędnych ; do przechowania wygenerowanego hasła. ; mov ebx, [PassLen] shl ebx, 1 mov eax, ebx add eax, 2 ; Rezerwacja bloku pamięci przeznaczonego dla tworzonego hasła. ; invoke LocalAlloc, LMEM_ZEROINIT, eax test eax, eax jz .failed mov [Password], eax ; Wypełnienie przygotowanego bufora losową zawartością. ; invoke CryptGenRandom, [.hProv], ebx, eax test eax, eax jz .failed ; Pętla, w której bajty wygenerowanego hasła są przetwarzane w znaki ; należące do dozwolonego zbioru symboli. ; 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 ; Wyświetlenie wygenerowanego hasła w polu tekstowym 'ID_PASSEDIT'. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, [Password] ; Zwolnienie pamięci przeznaczonej dla hasła. ; invoke LocalFree, [Password] test eax, eax jnz .failed jmp .finish ; Operacje wykonywane w przypadku naciśnięcia skrótu klawiszowego WIN + F12. ; .wmhotkey: cmp [wparam], ID_HOTKEY jne .finish ; Wygenerowanie nowego hasła. ; invoke SendDlgItemMessage, [hwnd], ID_GENBTN, BM_CLICK, 0, 0 ; Skopiowanie hasła do schowka w przypadku naciśnięcia przycisku z ikoną lub ; użycia skrótu klawiszowego WIN + F12. ; .copy: ; Określenie długości hasła (w znakach) i przeliczenie jej na ilość ; bajtów bufora przeznaczonego do przechowywania tekstu pobranego ; z pola hasłowego. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXTLENGTH, 0, 0 inc eax mov ebx, eax shl eax, 1 ; Alokacja bloku pamięci dla pobieranego hasła. ; invoke GlobalAlloc, GHND + GMEM_DDESHARE, eax ; GHND = GMEM_MOVEABLE + GMEM_ZEROINIT test eax, eax jz .failed ; Zablokowanie bloku pamięci i pobranie wskaźnika na jego pierwszy bajt. ; invoke GlobalLock, eax test eax, eax jz .failed xchg esi, eax ; Otwarcie schowka i zablokowanie możliwości modyfikacji jego zawartości ; przez inne aplikacje. ; invoke OpenClipboard, [hwnd] test eax, eax jz .failed ; Opróżnienie schowka, zwolnienie uchwytów bloków danych znajdujących się ; w nim oraz skojarzenie schowka z oknem bieżącej aplikacji. ; invoke EmptyClipboard test eax, eax jz .failed ; Pobranie hasła i umieszczenie go w wydzielonym buforze. ; invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_GETTEXT, ebx, esi ; Umieszczenie treści hasła w schowku w formacie Unicode. ; invoke SetClipboardData, CF_UNICODETEXT, esi test eax, eax jz .failed ; Odblokowanie obszaru pamięci używanego jako bufor dla pobieranego hasła. ; invoke GlobalUnlock, esi test eax, eax jz .failed ; Zamknięcie schowka i umożliwienie dostępu do niego pozostałym aplikacjom. ; invoke CloseClipboard test eax, eax jz .failed jmp .finish ; Wyczyszczenie pola tekstowego 'ID_PASSEDIT' w przypadku, gdy zbiór znaków składowych ; jest pusty lub długość hasła jest równa 0. ; .clear: invoke SendDlgItemMessage, [hwnd], ID_PASSEDIT, WM_SETTEXT, 0, 0 jmp .finish .wmdestroy: ; Wyrejestrowanie skrótu klawiszowego WIN + F12 skojarzonego z bieżącą aplikacją. ; invoke UnregisterHotKey, [hwnd], ID_HOTKEY test eax, eax jz .failed ; Zwolnienie bloku pamięci używanego do przechowywania tablicy ; znaków składowych tworzonych haseł. ; invoke LocalFree, [.CharTab] test eax, eax jnz .failed ; Zwolnienie uchwytu dostarczyciela usług kryptograficznych. ; invoke CryptReleaseContext, [.hProv], 0 test eax, eax jz .failed xor eax, eax .finish: pop edi esi edx ecx ebx ret align 4 ; Uchwyt tablicy znaków składowych haseł. ; .CharTab dd ? ; Uchwyt dostarczyciela usług kryptograficznych. ; .hProv dd ? endp ; Nowa procedura obsługi pola tekstowego służącego do określania długości generowanego ; hasła. ; proc PassLenEditProc, hwnd, wmsg, wparam, lparam cmp [wmsg], WM_CHAR je .wmchar cmp [wmsg], WM_GETPASSLEN je .wmuser cmp [wmsg], WM_PASTE ; Blokada możliwości wklejania tekstu je .finish ; w pole tekstowe. .defwndproc: invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam] jmp .finish ; Pole tekstowe akceptuje tylko znaki '0', ..., '9' oraz 'backspace'. ; .wmchar: mov eax, [wparam] cmp eax, VK_BACK je .defwndproc cmp eax, '0' jb .finish cmp eax, '9' ja .finish jmp .defwndproc ; Po otrzymaniu komunikatu WM_GETPASSLEN pole tekstowe oblicza wartość ; liczbową odpowiadającą przechowywanemu ciągowi cyfr dziesiętnych i umieszcza ; ją w rejestrze eax, dzięki czemu będzie ona dostępna w procedurze, która ; wysłała tenże komunikat. ; .wmuser: push ebx esi ; Pobranie zawartości pola tekstowego. ; lea esi, [PassLen] invoke SendMessage, [hwnd], WM_GETTEXT, 5, esi ; Pętla, w której obliczamy wartość liczbową odpowiadającą ciągowi ; cyfr dziesiątkowych. ; 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 ; Uchwyt starej procedury obsługi okna tekstowego. ; .OldWndProc dd ? endp ; Procedura obsługi panelu, w którym definiujemy zbiór znaków składowych ; dla generowanych haseł. ; proc CharPanelProc, hwnd, wmsg, wparam, lparam ; Definicje stałych przechowujących identyfikatory kontrolek panelu. ; 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, "Symbole składowe" 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, "Inne:" 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 ; Zastąpienie standardowej procedury obsługi pola tekstowego 'ID_PASSCHARS' procedurą ; zdefiniowaną w programie. ; 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 ; Jeśli zdarzenie związane jest ze zmianą stanu któregoś z pól wyboru, ; wówczas zmieniamy wartość odpowiedniej flagi. ; .wmcommand: mov eax, [wparam] and eax, 0FFFFh jz .defwndproc cmp eax, ID_CHKBOX4 ja .defwndproc dec eax btc [Flags], ax jmp .defwndproc ; W przypadku przechwycenia komunikatu WM_GETCHARSET transmitujemy go do pola ; tekstowego 'ID_PASSCHARS', które w odpowiedzi dokona modyfikacji funkcji ; charakterystycznej zbioru znaków uwzględniając znaki dodane przez użytkownika. ; .wmuser: invoke SendDlgItemMessage, [hwnd], ID_PASSCHARS, WM_GETCHARSET, 0, 0 jmp .finish .wmdestroy: xor eax, eax .finish: pop ebx ret endp ; Nowa procedura obsługi pola tekstowego służącego do definiowania dostosowanego ; do potrzeb użytkownika zbioru znaków dla generowanych haseł. ; 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 ; Blokujemy możliwość wklejania je .finish ; tekstu do pola tekstowego. .defwndproc: invoke CallWindowProc, [.OldWndProc], [hwnd], [wmsg], [wparam], [lparam] jmp .finish ; Ograniczenie zbioru znaków możliwych do wpisania z klawiatury do symboli o kodach ; od 20h do FFh oraz znaku '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 ; W przypadku przechwycenia komunikatu użytkownika zawartość pola tekstowego jest ; przetwarzania w celu uzupełnienia funkcji charakterystycznej zestawu znaków ; o symbole dodatkowe podane przez użytkownika. ; .wmuser: push ebx ecx esi edi ; Wyczyszczenie zawartości tablicy definiującej funkcję charakterystyczną ; zbioru znaków składowych. ; xor eax, eax mov ecx, 7 mov edi, CharFun cld rep stosd ; Informacja o stanie pól wyboru kopiowana jest do rejestru ebx. ; movzx ebx, [Flags] ; Jeśli flaga odpowiadająca któremukolwiek z pól wyboru jest ustawiona, ; wówczas funkcja charakterystyczna jest uzupełniana odpowiednią bazową ; kategorią znaków. ; .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 ; Uzupełnienie funkcji charakterystycznej zestawu znaków o symbole podane ; przez użytkownika. ; .OtherChars: ; Określenie długości tekstu przechowywanego w polu tekstowym. ; invoke SendMessage, [hwnd], WM_GETTEXTLENGTH, 0, 0 inc eax mov ebx, eax shl eax, 1 ; Zarezerwowanie bloku pamięci przeznaczonego na tekst pobrany ; z pola tekstowego. ; invoke LocalAlloc, LMEM_ZEROINIT, eax test eax, eax jz .failed mov [Buffer], eax ; Umieszczenie zawartości pola tekstowego w zarezerwowanym buforze. ; invoke SendMessage, [hwnd], WM_GETTEXT, ebx, eax ; Pętla, w której ustawiamy bity tablicy przechowującej funkcję ; charakterystyczną zbioru znaków odpowiadające kodom znaków ; zawartych w polu tekstowym. ; 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: ; Zwolnienie bloku pamięci przeznaczonego na tekst pobrany ; z pola tekstowego. ; invoke LocalFree, [Buffer] test eax, eax jnz .failed pop edi esi ecx ebx .finish: ret align 4 ; Uchwyt starej procedury obsługi pola tekstowego. ; .OldWndProc dd ? endp ; Procedura używana do wyświetlania okienka komunikatu zawierającego informację na temat ; błędu, jaki może wystąpić podczas wykonania programu. ; 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 ; Sekcja, w której definiujemy zasoby programu. ; 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', 'Prosty generator haseł.',\ 'LegalCopyright', '(C) Mikołaj Hajduk, 2008',\ 'FileVersion', PROG_VERSION,\ 'ProductVersion', PROG_VERSION,\ 'OriginalFilename', 'SimPaGen.exe' ; Dane głównej ikony programu włączonej bezpośrednio w treść pliku źródłowego. ; 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 ; Dane ikony wyświetlanej na przycisku służącym do kopiowania wygenerowanego hasła ; do schowka. ; 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 ; Dane manifestu włączonego bezpośrednio w treść pliku źródłowego. ; 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>Prosty generator haseł.</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