ArTiF's Tutors ========= Salut, ce tutorial ( mon premier ) va vous expliquer comment keygenner le K4N Crackme n°1 disponible sur www.keygenning4newbies.cjb.net. Vous allez voir que l'algo est tres simple à comprendre et que ce crackme est une excellent introduction pour apprendre à keygenner ... Assez parler! Let's GO !!! En tracant sous Sice, vous devrez pas tarder à arriver sur la generation du serial: :0040110C 0FBE840D48FFFFFF movsx eax, byte ptr [ebp+ecx-000000B8] // prend la valeur ascii de la chaine à la poistion ecx :00401114 41 inc ecx // Prochain caractère :00401115 33C1 xor eax, ecx // xor eax avec ecx :00401117 03D8 add ebx, eax // ebx = ebx + eax :00401119 3B4DD8 cmp ecx, dword ptr [ebp-28] // A t'on fait tous les caracteres? :0040111C 75EE jne 0040110C // si non on boucle :0040111E 6BC006 imul eax, 00000006 // eax = eax x 6 :00401121 C1E307 shl ebx, 07 // ebx = shl ebx , 07 :00401124 03C3 add eax, ebx // eax = eax + ebx :00401126 8945C8 mov dword ptr [ebp-38], eax // met eax dans [ebp-38] :00401129 FF75C8 push [ebp-38] // sauve [ebp-38] sur la pile Vous pouvez maintenant coder votre propre keygen ? Quoi, vous savez pas!! Allez, je vais faire preuve de generosité en vous filant ma source !!! .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 Reg2Ascii proto :DWORD,:DWORD,:DWORD ;========================================================================= .const ;========================================================================= Prog equ "K4N Crackme n°1" Auteur equ "ArTiF" ;========================================================================= IDC_Gen equ 3001 IDC_Exit equ 3002 IDC_About equ 3003 .data ;========================================================================= ; Données dont vous aurez besoin ;========================================================================= Erreur db "Le Name doit être compose de 4 à 50 chars",0 ClassName db "WinClass",0 NameApp db Prog," KeyGen by [ArTiF]",0 EditClass db "edit",0 StaticClass db "static",0 ButtonClass db "button",0 DlgName db "Dialog",0 IconName db "Icon2",0 TextAbout db "KeyGen for K4N Crackme n°1",0Dh,0Ah,0Ah,0Ah db "Coded by ==[ArTiF]==",0 Caption db Prog,0 TextNom db "Enter your name here:",0 TextKey db "Your serial number:",0 TextCoded db "Coded by ==[ArTiF]==",0 ButtonAbout db "&About",0 ButtonExit db "&Exit",0 ButtonGen db "&Generate",0 FontString db "Arial", 0 conversion db '%d',0 lzUSER32 db 'USER32',0 lzWSPRINTFA db 'wsprintfA',0 nbr_char_serial db 8 .data? ;========================================================================= ; Variables dont vous aurez besoin ;========================================================================= Buff db 512 dup(?) buffer2 db 512 dup (?) hInstance HINSTANCE ? CommandLine LPSTR ? hwnd HWND ? hwndButton HWND ? hwndEdit1 HWND ? hwndEdit2 HWND ? hwndStatic1 HWND ? hwndStatic2 HWND ? hwndStatic3 HWND ? hwndButton1 HWND ? hwndButton2 HWND ? hwndButton3 HWND ? buffer db 512h dup (?) Key DWORD ? Font1 DWORD ? nbr_char dd ? serial dd ? .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,162,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_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 TextCoded,\ WS_CHILD or WS_VISIBLE or ES_LEFT ,\ 12,110,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,100,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,40,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,10,75,23,hWnd,IDC_Gen,hInstance,NULL mov hwndButton3,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 .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_Gen shr eax,16 .IF ax==BN_CLICKED invoke GetWindowTextA,hwndEdit1,ADDR buffer,512 ;========================================================================= ; KeyGeneraor ; la bonne clé se trouve dans EDI à la fin de la routine ;========================================================================= ;art[code]> :0040110C 0FBE840D48FFFFFF movsx eax, byte ptr [ebp+ecx-000000B8] ;:00401114 41 inc ecx ; :00401115 33C1 xor eax, ecx ; :00401117 03D8 add ebx, eax ; :00401119 3B4DD8 cmp ecx, dword ptr [ebp-28] ; :0040111C 75EE jne 0040110C ; :0040111E 6BC006 imul eax, 00000006 ; :00401121 C1E307 shl ebx, 07 ; :00401124 03C3 add eax, ebx ; :00401126 8945C8 mov dword ptr [ebp-38], eax ; :00401129 FF75C8 push [ebp-38] cmp eax, 4 jl not_good cmp eax, 50 jg not_good mov nbr_char,eax mov edx,offset buffer xor ecx,ecx xor ebx,ebx suite: movsx eax, byte ptr [edx+ecx] inc ecx xor eax, ecx add ebx, eax cmp ecx, [nbr_char] jne suite ;========================================================================= ; création du sérial ;========================================================================= imul eax, 6 shl ebx, 07 add eax, ebx invoke Reg2Ascii,eax,addr serial,04 cmp byte ptr [serial],'0' je zero_found jmp Affiche zero_found: xor ecx,ecx xor ebx,ebx xor eax,eax mov ecx,offset serial recur: inc cl cmp byte ptr[ecx],'0' je recur sub ecx,offset serial ; ici cl aura le nbr de '0' du serial ;car avec la conversion les zeros apparaissent(il ne doivent pas apparaitre ds le serial sub byte ptr[nbr_char_serial],cl recur2: mov al,byte ptr [serial+ecx+ebx] mov byte ptr[serial+ebx],al inc bl cmp bl,nbr_char_serial jne recur2 mov byte ptr[serial+ebx],0 jmp Affiche ;========================================================================= ; Affichage du résultat ;========================================================================= not_good: invoke SetWindowTextA,hwndEdit2,ADDR Erreur jmp Fin Affiche: invoke SetWindowTextA,hwndEdit2,addr serial ;*********************************************** ;*********************************************** Fin: ;========================================================================= ; Fin ;========================================================================= .endif .endif .IF ax==IDC_Exit invoke ExitProcess,eax .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif ret WndProc endp Reg2Ascii proc Le_Dword:DWORD,Addr_Destination:DWORD,Taille:DWORD pushf pusha mov ebx,Le_Dword xor eax,eax mov edi,Addr_Destination mov ecx,Taille mov edx,010h @Next_Char: xor eax,eax rol ebx,08h mov al,bl div dl cmp ah,0Ah jl @Number1 add ah,'A' - '0' - 0Ah @Number1: add ah,'0' cmp al,0Ah jl @Number2 add al,'A' - '0' - 0Ah @Number2: add al,'0' mov word ptr [edi],ax add edi,02 dec ecx jcxz @FINIT jmp @Next_Char @FINIT: mov byte ptr [edi],0 popa popf ret Reg2Ascii endp end start ;========================================================================= Et voilà, c'est fini! Pas trop dur :p Je tenais à remercier trois personnes pour leur aide quotidienne qui m'apporte: _seifer, tHE ANALYST, DXP Merci les gars, vous êtes cools. ArTiF