ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Keygen de Teleport Pro º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Niveau : 1 (tres simple) ~~~~~~~~~~~~~~~~~~~~~~~~ Bon cette fois ci on va s'attaquer a un soft tres simple a keygenner : teleport pro. C'est d'ailleurs un logiciel qui peut etre assez sympa parfois. Lorsque le serial est mauvais le programme nous envoie une messagebox nous disant: "You must enter your username in the Name field, exactly...." On va pas debugger tout de suite, on regarde d'abord ce que ca donne sous Wdasm. On va dans les strings datas references et on trouve la phrase magique. On double clique et on arrive ici: Dump sous Wdasm: * Possible StringData Ref from Data Obj ->"User" | :00425F9F BEC8C94700 mov esi, 0047C9C8 :00425FA4 0F8406010000 je 004260B0 :00425FAA FFB7D5000000 push dword ptr [edi+000000D5] :00425FB0 E896090000 call 0042694B :00425FB5 3945E8 cmp dword ptr [ebp-18], eax :00425FB8 59 pop ecx :00425FB9 753A jne 00425FF5 <<<<<<<<<< MECHANT ! :( :00425FBB A130D44700 mov eax, dword ptr [0047D430] :00425FC0 8945F0 mov dword ptr [ebp-10], eax * Possible Reference to String Resource ID=07028: "Thank you! Your copy of Teleport Pro is now registered. Al" | :00425FC3 68741B0000 push 00001B74 :00425FC8 8D4DF0 lea ecx, dword ptr [ebp-10] :00425FCB 895DFC mov dword ptr [ebp-04], ebx :00425FCE E8E8D60100 call 004436BB :00425FD3 53 push ebx :00425FD4 53 push ebx :00425FD5 FF75F0 push [ebp-10] :00425FD8 C745FC01000000 mov [ebp-04], 00000001 :00425FDF E8ED400200 call 0044A0D1 :00425FE4 834DFCFF or dword ptr [ebp-04], FFFFFFFF :00425FE8 8D4DF0 lea ecx, dword ptr [ebp-10] :00425FEB E8B3D10100 call 004431A3 :00425FF0 E925010000 jmp 0042611A * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00425FB9(C) | :00425FF5 8BBFD5000000 mov edi, dword ptr [edi+000000D5] :00425FFB 395FF8 cmp dword ptr [edi-08], ebx :00425FFE 7536 jne 00426036 :00426000 A130D44700 mov eax, dword ptr [0047D430] :00426005 8945F0 mov dword ptr [ebp-10], eax * Possible Reference to String Resource ID=07031: "You must enter your username in the Name field, exactly as y" MOuhahhahaa. Bon bah deja je crois que la c'est assez clair. Le jne est un saut conditionnel (suis qui sait pas ca, il va avoir une mauvais note !). ce qui veut dire que ce saut va nous balancer soit sur "You must enter your username in the Name field, exactly ..." soit sur "Thank you! Your copy of Teleport Pro is now registered". Perso je prefere la deuxieme option. c'est le "cmp dword ptr [ebp-18], eax" du desus qui determine la nature du saut. Si la valeur en [ebp-18] est egale a la valeur stockee en eax, alors on sautera sur la bonne option. Maintenant qu'on sait ceci, on passe sous Softice et on pose un: bpx 00425FB5 cmp dword ptr [ebp-18], eax compare la valeur qui est en ebp-18 avec eax. Voyons donc ce que c'est. En cliquant avec le bouton droit sur le [ebp-18] et en faisant display, on voit apparaitre je serial qu'on a rentre. Mais a quoi peut il bien comparer notre serial ? bah oui, forcement il le compare au bon serial pardi ! On regarde donc la valeur de eax en faisant "? eax". Puis on choppe la valeur en decimal (c'est la deuxieme). Pour moi qui avait mis mon nom et ma companie cela donne ca: nom : TiPiaX companie: Hccc Serial : 1439161753 Bon voila on a fait un serial fishing dans les regles. Maintenant il reste le keygenerator. On va matter un peu ce qu'on a dans le call au dessus de la comparaison: (suffit de double cliquer sur le call) -> Rappel: en sortant du call, le bon serial est en eax De plus on sait evidemment que c'est ce call qui permet de generer le bon serial. :0042695F 83F805 cmp eax, 00000005 // :00426962 7304 jnb 00426968 // 6 lettres minimum. :00426964 33C0 xor eax, eax // sinon on se casse. :00426966 5F pop edi :00426967 C3 ret * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00426962(C) | :00426968 53 push ebx :00426969 56 push esi :0042696A BEA4E4FE5D mov esi, 5DFEE4A4 // ESI = 5DFEE4A4 <<<< :0042696F 33DB xor ebx, ebx // EBX = 0 <<<< * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00426991(U) | :00426971 85FF test edi, edi // boucle :00426973 7409 je 0042697E // :00426975 57 push edi // :00426976 E8A5560000 call 0042C020 // ON S'EN TAPE :0042697B 59 pop ecx // :0042697C EB02 jmp 00426980 // * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00426973(C) | :0042697E 33C0 xor eax, eax // EAX = 0 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042697C(U) | :00426980 83C0FC add eax, FFFFFFFC // EAX = EAX - 4 :00426983 3BD8 cmp ebx, eax // compare compteur a EAX :00426985 730C jnb 00426993 // On se casse si on a finit :00426987 33343B xor esi, dword ptr [ebx+edi] // XOR ESI avec la lettre en cours :0042698A F6C340 test bl, 40 // .... :0042698D 7401 je 00426990 // .... :0042698F 43 inc ebx // .... * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0042698D(C) | :00426990 43 inc ebx // On prend la prochaine lettre :00426991 EBDE jmp 00426971 // on boucle L'algo est donc hyper simple. On prend le nombre de lettres du nom. Ensuite on enleve 4 a cette valeur. Ensuite on prend chaque lettre et on fait un XOR de cette lettre avec la valeur de ESI (cette valeur est 5DFEE4A4 au depart). (ps: notre serial est pointe par edi lors de la routine) En fait on ne prend pas toutes les lettres, on prend (nb de lettres du nom - 4) lettres. Par exemple pour "TiPiaX" qui fait 6 lettres, on va faire un XOR uniquement avec les lettres T puis i. Voici comment on code la keygen en asm pour le compilateur Masm: ;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ; ;ANOTHER KEYGEN by TiPiaX ;TELEPORT PRO keygenerator ; ;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ .386 .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\comdlg32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\comdlg32.lib DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD GenKey PROTO :DWORD IDD_DIALOG = 100 IDC_QUIT = 600 IDC_ABOUT = 500 IDC_NAME = 1000 IDC_FNAME = 1500 IDC_SERIAL = 2000 .data titre db "TiPiaX/VDS",0 message db "Greetz to all the cracking and vx scene",13,10 db "and to: Drak, Cynabs, Sboub, Artif, Analyst, Kerberos",13,10 db "Christal, titi, Bendi, Androgyne, Kerberos, Nostra, CoolViper",0 petit db "The name is too short",0 nom db 50 dup (0) serial db 50 dup (0) taille dd 0 print db "%lu",0 .data? hInstance HINSTANCE ? .code start: invoke DialogBoxParam, hInstance,IDD_DIALOG,NULL,addr DlgProc,NULL DlgProc proc hwnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_CLOSE invoke ExitProcess,0 .ELSEIF uMsg==WM_COMMAND mov eax,wParam .IF ax==IDC_ABOUT invoke MessageBox,NULL,offset message,offset titre,NULL .ELSEIF ax==IDC_QUIT invoke ExitProcess,0 .ELSEIF ax==IDC_NAME invoke GenKey,hwnd .ELSEIF ax==IDC_FNAME invoke GenKey,hwnd .ENDIF .ELSE mov eax,FALSE ret .ENDIF mov eax,TRUE ret DlgProc endp ;fin de dlgproc GenKey proc hwnd:HWND invoke GetDlgItemText,hwnd,IDC_NAME,offset nom,50 mov taille,eax cmp eax,5 jle tooshort ;generate the code ;----------------------- mov esi, 05DFEE4A4h xor ebx, ebx mov eax, taille add eax, 0FFFFFFFCh ; -4 boucle: cmp ebx, eax jnb fini xor esi, dword ptr [offset nom + ebx] inc ebx jmp boucle fini: ;end of keygen ;--------------- invoke wsprintfA,offset serial,offset print,esi invoke SetDlgItemText,hwnd,IDC_SERIAL,offset serial ret tooshort: invoke SetDlgItemText,hwnd,IDC_SERIAL,offset petit ret GenKey endp end start ;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Petite note: le serial est ensuite passe sous forme decimale grace a wsprintfA. Voila je pense que j'ai tout dit. Ce prog est tres bien fait mais la protection se semble pas avoir ete le plus grand soucis des programmeurs ;) TiPiaX/VDS - hccc@caramail.Com