;========================================================================= ; ce source ASM est dérivé de ; Papaow pour la partie graphique ; SyntaxError pour la fonction Copy ; Alien pour le générateur des deux serials ;========================================================================= .386 .model flat, stdcall option casemap :none ; case sensitive ;========================================================================= include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\masm32.lib .const ;========================================================================= Prog equ "WinImage" ;========================================================================= IDC_Gen equ 3001 IDC_Exit equ 3002 IDC_About equ 3003 IDC_Copy equ 3004 .data ;========================================================================= ; Données dont vous aurez besoin ;========================================================================= Erreur db "Caractères alphabétiques uniquement",0 ClassName db "WinClass",0 NameApp db Prog," KeyMaker by [Christal]",0 EditClass db "edit",0 StaticClass db "static",0 ButtonClass db "button",0 DlgName db "Dialog",0 IconName db "Icon2",0 TextLong db "Le Name est limité à 8 caractères !",0 TextAbout db "KeyMaker pour WinImage 5.00.5000",0 Caption db Prog,0 TextNom db "Enter your name here:",0 TextKey db "Standard Serial:",0 TextKey2 db "Professional Serial:",0 ButtonAbout db "&About",0 ButtonExit db "&Exit",0 ButtonGen db "&Generate",0 ButtonCopy db "&Copy",0 FontString db "Arial", 0 Name_Length db 20 dup (0), 0 counter db 5 dup (0) Key dd 20 dup (0) Key2 dd 20 dup (0) Key3 dd 20 dup (0) .data? ;========================================================================= ; Variables dont vous aurez besoin ;========================================================================= buffer db 512 dup (?) hsmem dd ? smem dd ? nome dd ? hDlg dd ? cdc dd ? Flag dd ? Flag2 dd ? hInstance HINSTANCE ? CommandLine LPSTR ? hwnd HWND ? hwndButton HWND ? hwndEdit1 HWND ? hwndEdit2 HWND ? hwndEdit3 HWND ? hwndStatic1 HWND ? hwndStatic2 HWND ? hwndStatic3 HWND ? hwndButton1 HWND ? hwndButton2 HWND ? hwndButton3 HWND ? hwndButton4 HWND ? Font1 DWORD ? lg_serial DWORD ? lg_name DWORD ? .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax ;========================================================================= WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG ;========================================================================= ; Traçage de la boite de dialogue ;========================================================================= mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_DBLCLKS mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszClassName,OFFSET ClassName invoke LoadImage,hInstance,ADDR IconName,IMAGE_ICON,32,32,LR_LOADMAP3DCOLORS mov wc.hIcon,eax mov wc.hIconSm,NULL invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowExA,WS_EX_WINDOWEDGE,\ ADDR ClassName,ADDR NameApp,\ WS_SYSMENU or WS_MINIMIZEBOX or WS_DLGFRAME or WS_BORDER\ or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_VISIBLE,\ 280,200,385,202,NULL,NULL,hInst,NULL mov hwnd,eax INVOKE ShowWindow, hwnd,SW_SHOWNORMAL INVOKE UpdateWindow, hwnd .WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE TranslateMessage, ADDR msg INVOKE DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp ;========================================================================= WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov eax,uMsg .IF eax==WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF eax==WM_CREATE invoke CreateWindowExA,WS_EX_CLIENTEDGE, ADDR EditClass,NULL,\ WS_CHILDWINDOW or WS_MAXIMIZEBOX or WS_VISIBLE or\ ES_AUTOHSCROLL,12,30,261,23,hWnd,NULL,hInstance,NULL mov hwndEdit1,eax invoke CreateWindowExA,WS_EX_CLIENTEDGE, ADDR EditClass,NULL,\ WS_CHILDWINDOW or ES_READONLY or WS_VISIBLE or\ ES_AUTOHSCROLL,12,80,261,23,hWnd,NULL,hInstance,NULL mov hwndEdit2,eax invoke CreateWindowExA,WS_EX_CLIENTEDGE, ADDR EditClass,NULL,\ WS_CHILDWINDOW or ES_READONLY or WS_VISIBLE or\ ES_AUTOHSCROLL,12,130,261,23,hWnd,NULL,hInstance,NULL mov hwndEdit3,eax invoke CreateWindowExA,WS_EX_NOPARENTNOTIFY, ADDR StaticClass,ADDR TextNom,\ WS_CHILD or WS_VISIBLE or ES_LEFT ,\ 12,15,180,15,hWnd,NULL,hInstance,NULL mov hwndStatic1,eax invoke CreateWindowExA,WS_EX_NOPARENTNOTIFY, ADDR StaticClass,ADDR TextKey,\ WS_CHILD or WS_VISIBLE or ES_LEFT ,\ 12,65,180,15,hWnd,NULL,hInstance,NULL mov hwndStatic2,eax invoke CreateWindowExA,WS_EX_NOPARENTNOTIFY, ADDR StaticClass,ADDR TextKey2,\ WS_CHILD or WS_VISIBLE or ES_LEFT ,\ 12,115,180,15,hWnd,NULL,hInstance,NULL mov hwndStatic3,eax invoke CreateWindowExA,NULL, ADDR ButtonClass,ADDR ButtonAbout,\ WS_CHILDWINDOW or WS_MAXIMIZEBOX or WS_VISIBLE or WS_GROUP or WS_TABSTOP,\ 295,130,75,23,hWnd,IDC_About,hInstance,NULL mov hwndButton1,eax invoke CreateWindowExA,NULL, ADDR ButtonClass,ADDR ButtonExit,\ WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS,\ 295,70,75,23,hWnd,IDC_Exit,hInstance,NULL mov hwndButton2,eax invoke CreateWindowExA,NULL, ADDR ButtonClass,ADDR ButtonGen,\ WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS\ or BS_DEFPUSHBUTTON,\ 295,40,75,23,hWnd,IDC_Gen,hInstance,NULL mov hwndButton3,eax invoke CreateWindowExA,NULL, ADDR ButtonClass,ADDR ButtonCopy,\ WS_CHILDWINDOW or WS_VISIBLE or WS_CLIPSIBLINGS,\ 295,100,75,23,hWnd,IDC_Copy,hInstance,NULL mov hwndButton4,eax invoke SetFocus, hwndEdit1 invoke CreateFontA, -11, -5, 0, 0, 150, FALSE, FALSE, FALSE,\ DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,\ DEFAULT_QUALITY, DEFAULT_PITCH,ADDR FontString mov Font1, eax invoke PostMessageA, hwndStatic1, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndStatic2, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndButton1, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndButton2, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndButton3, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndStatic3, WM_SETFONT, Font1, TRUE invoke PostMessageA, hwndButton4, WM_SETFONT, Font1, TRUE .ELSEIF eax==WM_COMMAND mov eax,wParam .IF ax==IDC_About shr eax,16 .IF ax==BN_CLICKED invoke MessageBoxA, NULL,addr TextAbout, addr Caption,040h .ENDIF .ENDIF .IF ax==IDC_Copy invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,addr lg_serial ; lg serial + 1 mov hsmem,eax invoke GlobalLock,hsmem mov smem,eax invoke lstrcpy,smem,addr Key2 invoke GlobalUnlock,hsmem invoke OpenClipboard,hWnd invoke EmptyClipboard invoke SetClipboardData,CF_TEXT,hsmem invoke CloseClipboard invoke GetDlgItem,hDlg,hwndEdit2 invoke SetFocus,eax .ENDIF .IF ax==IDC_Gen shr eax,16 .IF ax==BN_CLICKED invoke GetWindowTextA,hwndEdit1,ADDR buffer,12 ;========================================================================= ; KeyGenerator ; les bons serials se trouvent dans Key1 et Key2 à la fin de la routine ;========================================================================= pushad mov Flag,0 ; réinitialise Flag caractères non alpha mov Flag2,0 ; et Flag2 pour suppréssion des 00 cmp eax, 01 ; vérifie Name >= à 1 caractère jnl Lg_OK invoke SetWindowTextA,hwndEdit2,ADDR Erreur jmp Fin Lg_OK: cmp eax, 08 ; vérifie Name < 8 caractères jng Long_OK invoke SetWindowTextA,hwndEdit3,ADDR TextLong jmp Fin Long_OK: mov dword ptr [lg_name],eax ; mémorise la taille du Name call majuscule ; contrôle et mise en majuscule cmp Flag,0 ; Flag=1 si caractère non conforme jne Fin ; sort de WinProc xor ecx,ecx ; initialise les registres xor esi,esi ; ecx et esi mov dword ptr [Key], 47694Ch ; charge Magic Number Loop1: mov eax, ecx ; routine d'Alien push 0000000Eh cdq pop ebx idiv ebx test edx, edx ; edi=27h uniquement au départ jne suite0 mov edi, 00000027h ; Magic Number suite0: movzx edx, byte ptr [ecx+buffer] ; edx = un caractère du Name lea eax, dword ptr [ecx+buffer] imul edx, edi ; edx * edi add dword ptr [Key], edx ; ajoute résultat au serial en cours push 0000000Eh cdq pop ebx idiv ebx test edx, edx ;je suite1 lea edi, dword ptr [edi+2*edi] ; (résultat+2)*résultat jmp suite2 suite1: imul edi, 00000007h suite2: inc ecx ; compteur de caractères cmp ecx, dword ptr [lg_name] ; compare si compteur = nb de caractères entrés jl Loop1 ;------------------------------------------------------------------- ; génère serial mode standard ;------------------------------------------------------------------- mov eax, Key ; eax = 4 derniers chiffres serial généré call end_serial invoke SetWindowTextA,hwndEdit2,ADDR Key2; affichage du 1er serial (standard) ;------------------------------------------------------------------- ; génère serial mode pro ;------------------------------------------------------------------- mov [Flag2],01 ; ne pas ignorer les 00 mov eax, Key ; eax = 4 derniers chiffres serial2 add eax, 10051981h ; rajoute Magic Number au serial précédent call end_serial ; construit serial définitif invoke lstrlen,Key2 ; calcul lg du serial definitif mov lg_serial,eax ; pour fonction COPY invoke SetWindowTextA,hwndEdit3,ADDR Key2; affiche serial 2 popad ;========================================================================= ; Fin ;========================================================================= Fin: .endif .endif .IF ax==IDC_Exit invoke ExitProcess,eax .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif ret WndProc endp ;========================================================================= ; contrôle validité des caractères et conversion en majuscule ;========================================================================= majuscule proc push edx ; sauve valeur de EDX mov [Flag],0 ; initialisation validité caractères xor ecx,ecx ; initialise compteur caractères lettre_suivante: movzx edx, byte ptr [ecx+buffer] ; récupére caractère du Name cmp edx, 5Ah ; compare si > Z jg minuscule cmp edx, 41h ; compare si < A jl just_letter cmp edx,7Ah ; compare si > z jg just_letter fin_maj: inc ecx ; caractère suivant cmp ecx, dword ptr [lg_name] ; compare si tous caractères traités jl lettre_suivante jmp fin_proc minuscule: sub [ecx+buffer],20h ; passe caractère en majuscule jmp fin_maj just_letter: invoke SetWindowTextA,hwndEdit2,ADDR Erreur ; message d'erreur inc Flag ; Flag= 1 si erreur fin_proc: pop edx ; récupère valeur de EDX ret majuscule endp ;========================================================================= ; conversion du serial génré en serial définitif ;========================================================================= end_serial proc push eax ; sauvegarde serial généré sur la pile xor eax,eax ; met EAX à 0 pour remplir lea edi, Key2 ; l'adresse de key 2 avec mov ecx,0Ch ; 12 zéros rep stosb ; pas très élégant, mais... pop eax ; récupére serial généré sur la pile mov edi ,4 mov ebx ,7 ; à partir du 8° caractère call IntToChar ; convertion @ -> Ascii mov edi ,0 ; traitement des 4 premiers chiffres mov ebx ,3 ; à partir du 4° caractère call IntToChar ; convertion @ -> Ascii + xor esi,esi ; initialise compteur serial généré xor edi,edi ; initialise compteur serial définitif Loop2: movzx eax, byte ptr [esi+Key2] ; charge val ASCII du serial généré cmp al, 38h ; compare si = à "8" jne suite3 ; non -> continue add al, 0Ah ; ajoute 10 => "B" jmp suite4 suite3: cmp al,42 ; compare si = à "B" jne suite4 ; non -> continue sub al, 09 ; soustrait 9 -> "9" suite4: cmp Flag2,01 ; premier serial est passé? je pas_zero ; ne pas ignorer le second zéro cmp esi,2 ; compare si 2 premiers membres du serial1 jg pas_zero ; ont été traités cmp al, 30h ; et si ceux ci sont = à zéro jne pas_zero dec edi ; sinon décrémente compteur serial définitif ; pour écraser le 0 par le caractère suivant pas_zero: mov byte ptr [edi+Key2],al ; place serial saisie (modifié ou non) inc esi ; compteur serial généré inc edi ; compteur serial définitif cmp esi,08 ; les 8 caractères maxis du serial sont traités? jne Loop2 mov byte ptr [edi+Key2],00 ; termine la string par un NULL ret end_serial endp ;========================================================================= ; Converti une adresse en image ASCII ;========================================================================= IntToChar proc near mov ecx, edi mov ecx, 10h Boucle: cdq idiv ecx cmp dl, 09h jg Lettre add dl, 30h jmp Suite Lettre: add dl, 37h Suite: mov byte ptr [Key2+ebx],dl dec ebx cmp ebx, edi jge Boucle ret IntToChar endp end start ;========================================================================= ;* Fin de KeyGen.asm * ;* KeyGen.rc * Icon2 ICON "icon2.ico" ;* Fin de KeyGen.rc * ;=========================================================================