************************************************************************************

          *                      CRACKING par Alexia[SKY],eBrain,TiPiaX                      *

          ************************************************************************************

 

 

      1 - Easy soft CD menu générateur par Alexia[SKY]

 

            Materiel nécéssaires :

            Un editeur HEXADECIMAL, style Hex Works Shop, Hiew etc....

            Ce programme à pour but de vous aider à préparer vos compiles sur cd.

            Compression, présentation, etc...

            En sa version SHAREWARE, il a cependant un inconvénient majeur.

            Dès que vous générez un joli menu, UREGISTRERES VERSION apparaît dans tous les sens.

            Sur chacune des fenêtres générées, 3 en l'occurrence.

            Notre but est donc de supprimer ce stupide message de ce stupide logiciel.

            Nous l'installons et avons ces fichiers executables :

            Lavmenu.exe, Menu.exe, et 2 autres qui ne nous interessent pas. Si nous lançons le Menu.exe,une erreur

            apparaît:"ERROR : File not Found [2] Creating menu.tps\ !farver etc."

            Ce n'est pas celui la. On lance Lavmenu.exe, et la tout se passe bien.

            On fait un peu n'importe quoi, le but étant de générer les fichiers.

            Je ne m'attarde pas sur les commandes de ce log, on est pas là pour ça.

            Nous générons notre fichier et le lançons. Voilà notre fameux UREGISTRERES VERSION partout.

            (Avec un nom comme ça, on ne peut pas s'empécher de le cracker ;)).

            On quitte et on regarde les fichiers générés.

            Autorun.inf, qui lui même fait appel au fichier menu.exe présent aussi dans ce repertoire.

            On en conclue donc qu'il colle son Menu.exe ici dans ce repertoire.Ca doit être ça.

            Prenez votre editeur hexadecimal, et ouvrez le fichier Menu.exe du répertoire d'install du log.

            Faites Find, Recherchez UREGIS (c'est pas la peine de mettre ça au complet..)

            PAF ! ! ! On le tient. Il est-là. modifiez ça par des espaces (20 en ascii), continuez la recherche.

            L'opération se fera 3 fois, une fois tout remplacés par des espaces, enregistrez, générez un fichier. BAK

            (Habitude a prendre, ca sert si on abime un fichier) et relancez le Lavmenu.exe.

            Ce dernier nous dit toujours uregistrers, mais le fichier menu lui, ne laisse plus apparaître

            UREGISTERES nulle part.

            Cool works ! Vous venez de faire votre premier crack ;))) Felicitations ;)

                 

            Bien sur, il y a bien d'autres méthodes pour y arriver, mais celle ci me semble la plus simple,

            faut avouez que.....

            Ceci dis, les programmeurs de ce log auraient pus avoir la bonté de crypter ça !

 

      2 - WinRescue 98 V 2.04  par Alexia[SKY]

 

            Cette fois ci, et pour la derniere fois je pense, on va se faire un petit crack facile.

            Parceque des daubes comme ça, vous devez être en mesure de les cracker en moins de 5 minutes maintenant.

            Première étape : on teste le logiciel. Il y a une boite de bialogue au démarage qui demande un mot de passe.

            On tape le mot de passe et on a un message d'erreur.

            On décompile. W32Dasm, notre fidèle serviteur se fera un plaisir de remplir cette tâche.

            On regarde ensuite la liste des chaines de caractère ( menu Refs \ String Data References ).

            On remarque une chaine bien sympa qui correspond à notre message d'erreur.

            On y va. Un peut plus haut, on voit que le code suit un saut conditionnel.

            Et encore plus haut le code qui correspond à la chaine "Registration Key Accepted". ( 465A5F )

            Alors, on va aller à l'origine du saut ( 4659F7 ). Là, on vois bien le JE ainsi que le CMP qui le précède.

            On voit aussi que tout ce code correspond à la chaine "Svet CHRISTA".

            ( Au passage si quelqu'un sait ce que ca veut dire, qu'il veuille bien me le signaler SVP :0).

            Serais ce le mot de passe ? On essaye et... oui, c'est bien lui !

            Noter que vous auriez tout aussi bien pu remplacer le JE par des NOP.

            De cette manière, n'importe quel pwd aurait été accepté.

            Mais ça, je vous laisse le faire !

 

      3 - Pretty HTML V2.00  par Alexia[SKY]

 

            Objet : Crack de Pretty HTML V 2.00 ( Disponible sur le CD Pro PC-Team N°43 )

            Niveau : Débutant

            Outils : Axe ( un éditeur hexadécimal )

            Outils : W32Dasm89 ( un désassembleur )

            Télécharger le logiciels <http://www.multimania.com/tirips/ph_200.zip>

            Voici les URLs où télécharger les logiciels nécesaire à ce crack :

                  Axe  <http://www.multimania.com/utils/axe20.zip>

                  W32Dasm<http://www.multimania.com/utils/w32ds893.zip>

           

            Là, il y a pas 36 solutions, il faut lancer le logiciel, en l'occurence prettyhtml.exe.

            Dès qu'on lance le logiciel, une boite de dialogue nous informe qu'il faut enregistrer

            le produit. Ok, cliquons sur le bouton "Enter registration key". Il nous est demander

            un nom et un mot de passe. Tu as de la chance, c'est le genre de crack qui se réalise

            assez rapidement. En plus comme il s'agit d'un petit logiciel, il ne devrait pas y avoir

            trop de complications. On entre n'y nom, n'y mot de passe. Que se passe t'il ?

            Un label change ( un label, c'est un zone de texte qui fait en général une ligne ).

            "Incorrect name or serial...". Voila un message interessant. On recommence l'opération

            en entrant cette fois ci un nom et un mot de passe bidon. Rien ne se passe.

            Le message est toujours le même. En fait, il a quand même du se passer quelquechose,

            le réaffichage du message, mais nous, on a rien vu ! On lance Axe et on fait une

            recherche du mot "Incorrect". Pour ceux qui hésiterait, c'est une chaine ANSI, mais ce

            n'est pas toujours le cas. Une fois la chaine trouvée, on regarde. Pas très interessant

            à première vu... et pourtant. On remarque d'autre chaine de caractères. Un peu plus

            haut, on voit "mpp". Tiens ! l'éditeur de ce logiciel s'apelle Média ++ ( mpp ).

            Coïncidence ? Et "PName", ca ne te dit rien ? Tout a l'heure, on ne te demandais

            pas d'entrer ton "name" ? Continuons... "pretty.reg", c'est sans doute un fichier.

            Un petit coup d'oeil dans le répertoire d'installation nous apprend qu'il n'y a pas

            de fichier portant ce nom... étrange... on s'apercevra à la fin qu'il est chargé de

            contenir le nom et le mot de passe crypté. On continue notre ascension et là !

            Révélation : "Thank you...". Cette petite phrase veut tout dire !

                  Ce logiciel est tout con. Il nous demande un mot de passe. Si ce n'est pas le bon

            ou s'il n'y en a pas, il change le texte du label qu'il y a juste en dessous.

            Par contre, on peut facilement déduire que si on entre un bon mot de passe,

            il change aussi le label, mais cette fois ci, il y aura écrit "Thank you...".

            Bien sur, a ce stade là, on peut pas le vérifier, mais on a pas le choix et on doit faire avec !

            En conclusion, le logiciel effectue une vérification du mot de passe tapé et

            choisit en fonction de celui ci le message à afficher. Cerise sur le gateau,

            il se pourrait même qu'a le suite de ce message, le logiciel soit enregistré,

            et c'est ce que nous cherchons !

                  Maintenant, lance W32Dasm et ouvre le fichier prettyhtml.exe.

            Laisse le logiciel désassembler le fichier et ensuite, rend toi à l'endroit où

            se trouve "Thank you" (fais une recherche !). Une fois que tu y es,

            observe le code. Pour ceux d'entre vous qui ne connaissent pas l'assembleur,

            ca va être dur de tout comprendre, alors je vais essayer d'être le plus clair possible.

 

            On voit * Possible StringData Ref from Code Obj ->" Thank you, ..."

            La ligne indique qu'à cet endroit, on fait appel à la chaine "Thank you".

            La ligne d'après, on voit: 004815E9 B91C174800        mov ecx, 0048171C

            Clique deux fois dessus et vérifie qu'elle se surligne bien en bleu.

            Si c'était vert, ca signifierait que cette ligne renvoi à une autre adresse

            (un peu comme goto en basic) ou qu'au contraire, cette ligne est la cible

            d'un saut. Ce dernier cas aurait compliqué la situation. On aurait été obligé

            d'aller chercher dans le code la ligne qui renvoi à celle ci, et la compréhension

            aurait été plus difficile. Mais ce n'est pas le cas, alors tout ce qu'on peut en

            déduire, puisqu'on sait que les lignes qui suivent celle-ci servent à enregister

            PrettyHTML ( enfin, on le suppose ), c'est que plus haut dans le code,

            il y a un endroit qui sera la cible d'une instruction genre "goto" que l'on

            appelle JMP(jump), ou qu'il y aura un JMP vers le message "Incorrect name or serial".

            Regarde la ligne 004815E0 0F84DD000000        je 004816C3

            On remarque la commande "JE" qui signifie "Aller à 004816C3 si la ligne précédente

            renvoi 1". 004816C3 est une adresse qu'il faut aller vérifier. A cette adresse ci, il n'y

            a rien de très concluant. Regardont un peu plus bas : "Incorrect name or serial".

            BINGO ! La ligne 3 crée une dérivation conditionelle vers le code qui garde

            le logiciel "unregistered".

            Maintenant la ligne 004815DC 837DF800        cmp dword ptr  [ebp-08],  00000000

            Cette ligne est la solution de tout. Elle compare une valeur dword et 0. Si les deux

            valeurs sont égales, la ligne renvoie la valeur 1. La ligne 3 elle regarde le renvoi

            de la 4 et si ce renvoie est 1, elle ordonne au programme d'effectuer un saut vers

            l'adresse 004816C3, qui rappellons le maintient le programme en version shareware.

            De cette manière, le code qui enregistre le logiciel et qui se situe après la ligne 3

            n'est jamais executé. La valeur dword [ebp-8] est déterminée plus haut dans le

            programme et si elle est égale à 0, la ligne 3 est executée. Tu as compris, il suffit

            de modifier la ligne 4. Tu vois le chiffre 00000000 ? Remplacons le par n'importequelle

            valeur différent de 0. Ainsi, la ligne 4 comparera la valeur dword ( egale à 0 pour n'importe

            quel mot de passe incorrect ) et le chiffre que tu auras entré. Les deux chiffres étant

            différents, la valeur de renvoie ne sera pas 1, mais 0. La ligne 3 ne n'executera pas,

            mais le code qui enregistre le programme si !

 

            Dans le menu debug, clique sur "Load process". Double-clique sur la ligne 4 et appuie sur F2

            pour placer un point d'arrêt. Appuie sur F9 en deux fois pour lancer l'execution du logiciel.

            Une fois la fenètre de Pretty HTML chargé, clique sur "Enter registration key" et tape n'importe

            quel nom et mot de passe. Clique sur "OK". Tu entendras un bip ! Basculer vers W32Dasm.

            Cherche la ou il y a écrit "Source for data disp 1" et clique sur "eip" et sur "code". Tu vois là

            ou il y a "BP*" ? C'est la ligne 4. Clique dessus. Et ensuite sur dword. Note la valeur à coté

            de l'adresse qui apparait au même endroit que la ligne 4 au paravant ( la valeur est 00f87d83 ).

            Bon, maintenant, regarde l'autre fenètre ou il y a ecrit "Patch Code". Clique sur ce bouton.et

            tape "cmp [ebp-08], 1". Moi, j'ai mit 1, mais tu peut mettre ce que tu veut. Clique sur "Apply Patch"

            et confirme. Ferme la fenètre. Regarde de nouveau "Source for data disp 1". Et oh ! Miracle,

            la valeur à changer ! Maintenant, c'est 01f87d83 ( enfin, si t'a mit 1 tout à l'heure !). Note cette valeur.

            Lance ton éditeur hexadécimal préféré et cherche la valeur 837df800. Pourquoi cette valeur,

            c'est un peu compliqué a expliqué ici ( consulte des manuels sur la manière dont les programmes

            chargent leurs données dans la mémoire ), mais sache qu'il faut prendre les valeurs que tu as

            notée 2 chiffre par 2, et lire à l'envers (ainsi 00 f8 7d 83 donne 83 7d f8 00 ). Il y en a peut être

            plusieures de ces valeurs, mais n'oublie pas que celle qu'on cherche se trouve près de la chaine

            "Thank you". Ok, t'as trouvé ? Pour moi, il est à l'offset 809DC en hexa ( 528612 en Décimal ).

            Ensuite, c'est pas compliqué, change le 837df800 en 837df801. Enregistre le tout, ferme tout

            les logiciels inutiles et lance Pretty HTML. Clique sur "Enter registered key" et tape le nom

            et mot de passe que tu veut ! Et la, Magie ! Tu es enregistré !

 

            Voila, c'était pas bien compliqué ! Mais, ce n'est qu'un début, et pour devenir un crackeur,

            tu doit vraiment t'y mettre et essayer de cracker n'importe quoi ( euh, commence quand même

            pas par des grands softs genre 3D Studio MAX, c'est un coup à te décourager !!! )

 

      4 - PhotoImpact 4 Trial Version  par Alexia[SKY]

 

            Objet : Crack de Ulead PhotoImpact 4 Trial version

            Niveau : C ( pas très compliqué....)

            Outils : Axe ( un éditeur hexadécimal )

            Outils : W32Dasm89 ( un désassembleur )

 

            Petit crackeur, tu es de retour ? C'est bien. Si tu as réussis à cracker Pretty HTML, tu es sur le chemin

            de la progression. Comme tu as déjà acquis de l'expérience, ce cours va être beaucoup moins détaillé,

            parceque je suis sur d'abord que tu as pas tellement envie de lire des pages et des pages de texte,

            et ensuite, parceque l'oiseau doit, petit à petit, voler de ses propres ailes !

            Bon allez, j'arrête mes conneries et on commence...

 

            1° On regarde le programme

            Les 30 premiers jours, le programme se lance normalement... ou presque. Il y a toujours cette boite

            de dialogue à la con au démarrage. Mais on va s'en occuper plus tard... OK, vous avez vu ?

            Bon, alors maintenant, avancez votre horloge de quelque mois pour voir ce qui se passe au bout

            de 30 jour ( euh non, ne le fais pas sinon, tu sera obligé de réinstaller windows. Donc on va faire

            comme si tu l'avais fais...). Après, relancez le soft, et là, galère, le programme lance toujours la boite

            de dialogue, mais il est impossible d'aller plus loin, le programme se ferme quand on clique sur OK.

            Remettez votre horloge à l'heure et relancez le soft : le soft ne se lance toujours pas...

            Conclusion : le programme vérifie la date et la compare à celle de la première execution.

                         Si la date à dépasser 30 jours, le programme se vérrouille.

 

            2° Comment contrer la protection ?

            Cette étape est celle qui ne s'apprend pas. Chaque cas est différent et c'est au crackeur de savoir

            s'adapter. J'ai déjà tenter d'apprendre l'art du crack à plusieurs personne et j'ai remarquer que

            c'est cette étape qui pose le plus de probleme aux débutant. Il sont capable de réaliser les opérations

            techniques, mais ne savent pas lesquelles réaliser. Alors, exercez vous le plus possible en utilisant

            votre matière grise plus que les tutoriaux. Je vais pas vous torturer plus longtemps. Pour contrer la

            protection, on a droit à deux solution :

                  Première méthode : On regarde ce qui ce passe quand on clique sur le bouton "Continuer".

                              On regarde ce qui se passe quand on clique sur "OK". On compare

                              et on effectue une petit modification de manière à ce que lorsque la date

                              est dépassée, si on clique sur "OK", tout se déroule comme si on cliquait

                              sur "Continuer".

                  Deuxième méthode : On regarde dans le code décompilé ce qui fait appel à la boite de dialogue

                              orange et ce qui fait appel à le fenètre principale du logiciel. Ensuite, on va

                              remplacer le code qui lance la boite de dialogue par celui qui lance la fenêtre.

                              De ce fait, l'application se lancera immédiatement quel que soit la date.

 

            Comme vous l'avez compris, la méthode la plus intéressante est la seconde. C'est donc celle là qu'on

            va réaliser. Notez bien qu'on ne va pas s'attarder à chercher les lignes de code qui verifient la date...

            Il est si simple de carrement les contourner :o)

 

            3° En pratique, ce que ça donne....

            Lancez iedit.exe avec W32Dasm ( CTRL+L et F9 pour ceux qui auraient pas encore trouvé... ).

            Quand la boite de dialogue apparait, cliquez sur API... La ligne de code qui viens d'etre executée est

            "4EB01D68 call USER32.DialogBoxParamA". C'est tout simplement la ligne qui affiche la boite de dialogue.

            Notez bien qu'on ne se trouve plus dans le fichier IEDIT.EXE lancé initialement, mais dans le module

            U32CFG.DLL. Et bien soit, on va le décompiler lui aussi. Il suffit juste de cliquer sur le nom de la dll dans la

            liste des modules. Donc tu te trouve à la ligne 4EB01D68. Ben maintenant clique sur Continue et on regarde

            ce qui se passe grace à F8 (mode pas à pas !). On constate qu'il y a un jne vers 4EB01D1C juste après un cmp

            ! Voila la solution !

            Le programme teste si on a cliquer sur Continue et nous envoie vers la suite si c'est oui. Remplacez à la ligne

            4EB01D68 "call USER32.DialogBoxParamA" par un "JMP 4EB01D1C" et 4 nop... ( Pour remplacer, il suffit

            de cliquer sur "Patch Code"... ) Et c'est pas plus compliqué que ca ! Remplacez les chaines hexadécimales

            adéquates par les nouvelles dans le fichier U32CFG.DLL.

 

            Ce tutorial est un peu plus compliqué parce que je n'ai quasiment rien expliqué en détails à part la manière de

            procéder, mais le crack en lui même ne m'a pas demandé plus de temps que celui de Pretty HTML. 

 

                                                By Alexia[SKY]

                 

      5 - Comment trouver une adresse de softice(ou windasm) qui corresponds a l'offset du fichier exe ? par eBrain

 

            Remarque: ce cours est util aux crackers et à ceux qui veulent connaitre la structure

                  des executables windows PE (portable executable)

 

            Réponse : générealement on fait une recherche de la chaine dans le programme et

                  puis on trouve l'offset dans le fichier. Mais je voudrais vous présenter

                  une autre méthode, à savoir sans faire de recherche.

 

            Outils nécessaires :

                  un editeur hexa

                  windasm

                  un peu de mathématiques

 

            Concrètement : prenons la version 6.2 de winzip32.exe (version tres ancienne de winzip)

                  ouvrons le avec windasm

                  on voit par exemple :

 

            COPIER/COLLER -------------------------------------------------------------------------------------------

                  * Reference To: USER32.GetDlgItemTextA, Ord:00F5h

                  |

                  :0040B418 FF15C8FA4D00        Call dword ptr [004DFAC8]

                        * call qui appelle la fenêtre d'enregistrement

                  :0040B41E 0FB605B0C24D00      movzx eax, byte ptr [004DC2B0]

                        *on stock en eax le nom entré dans Name. Ici : HUGS2000 dans l 'ex.

                  :0040B425 85C0                test eax, eax

                        *Vérifie si on a entré quelque chose, sinon --> erreur

                  :0040B427 0F841C000000        je 0040B449

                  :0040B42D 0FB605A0A44D00      movzx eax, byte ptr [004DA4A0]

                        * stock en eax le serial entré dans Registration. Ici : 12345678 dans l 'ex.

                  :0040B434 85C0                test eax, eax

                        *Vérifie si on a entré quelque chose, sinon --> erreur

                  :0040B436 0F840D000000        je 0040B449

                  :0040B43C E8F6F7FFFF          call 0040AC37

                        *Vérifie si le serial et le nom correspondent si OK alors eax =0 sinon

                  :0040B441 85C0                test eax, eax

                  :0040B443 0F8545000000        jne 0040B48E

            ---------------------------------------------------------------------------------------------------------

                  L'adresse 0040b418 est la même dans softice, sauf que dans softice il y a en plus un sélécteur du style :

                  0170:0040B418 FF15C8FA4D00    Call dword ptr [004DFAC8]

            0170 ici est le selecteur que windows attribue aux programmes il y a d'autre selecteurs, comme 015f, 0030.

            Pour l'instant on oublie le selecteur. A quel offset du fichier correspond ce code ?

            Ne faisons pas de recherche de la chaine du code FF15C8FA4D00 dans l'exe, oublions cette séquence de code.

            Tout d'abord si vous ne connaissez pas le header du format PE, je vous conseillerai de lire securimag

            (e-zine underground) que vous pouvez trouver sur madchat.org ou allez sur wotsit.org dans la section

            binaire. Il y a aussi des docs dessus.

                  ce qui nous interresse ici c'est seulement  :

                  Header          Offset          Bytes          Function

            ----------------------------------------------------------------------------------------------------

               MZ |       +00        |        2         |  signature 'MZ'= 4Dh 5Ah

                  |      +3C         |        4         |  offset du nouveau header PE ou 0

            ----------------------------------------------------------------------------------------------------

               PE |       +00        |        4         |  signature 'PE..' (= 50h 45h 00h 00h)

                  |       +2C        |        4         |  adresse de base

                  |                  |                  |  du code dans la mémoire du process

                  |       +10C       |        4         |  raw offset

            ----------------------------------------------------------------------------------------------------

            Le format PE possède à la fois le header MZ pour pouvoir être executé sous DOS (2.0+)

            et le header PE pour windows 9x et NT x.

            Exemple dans l'exe de winzip 6.2, on a :

            4D5A90000300000004000000FFFF0000    MZ..............

            B8000000000000004000000000000000    ........@.......

            00000000000000000000000000000000    ................

            000000000000000000000000 8000 0000  ................

            0E1FBA0E00B409CD21B8014CCD215468    ........!..L.!Th

            69732070726F6772616D2063616E6E6F    is program canno

            742062652072756E20696E20444F5320    t be run in DOS

            6D6F64652E0D0D0A2400000000000000    mode....$.......

            504500004C010700CF0C603200000000    PE..L.....`2....

            00000000E0000E010B010414007E0700    .............~..

            Le header de MZ commence a l'offset 0. La signature est MZ ou ZM.

            l'offset du header de PE est precisé à l'offset 3c ici 8000 ce qui est égale a l'offset 80 (hexa)

            à partir de l'offset 80 (hexa) on va 2c(hexa) octets plus loin on note le dword VIRTUAL OFFSET

            et 10c(hexa) + loin on note le dword RAW OFFSET.

            Remarque : dword est un double word, 4 octets

            Savez vous comment soustraire ou additionner ?

            Si non, fermez cet e-mag et allez prendre de l'air dehors !

            -------------------------------------------------------------------------------------------------

            * l'OFFSET du CODE dans windasm ou soft ice

            - (VIRTUAL OFFSET - RAW OFFSET) = OFFSET du FICHIER *

            -------------------------------------------------------------------------------------------------

 

            Actually : Le code se charge à virtual offset dans la mémoire, à cause de la taille du header et

                    les déclarations de l'exe(header). Le code ne commence qu'à l'offset RAW OFFSET.

                    En fait c'est beaucoup plus compliqué que ça mais j'ai un peu simplifié.

 

            VOILA ! avec notre exemple de winzip 6.2 on a VIRTUAL OFFSET = 1000 h et RAW OFFSET = 0400h

            Remarque : pour les neuneus, dans l'editeur hexa on a 0004 0000 qui correspond 0000 0400.

                       Les processeur INTEL lisent a l'envers octet par octet.

                       Un autre exemple : 1000 0000 => 00000010

 

 

            l'offset dans windasm :

            :0040B418 FF15C8FA4D00             Call dword ptr [004DFAC8]

            0040B418 - (1000-400) = 40b418-c00 =  40a818

 

            Bilan :

            ADRESSE DANS WINDASM(SOFTICE) /  FICHIER

            0040B418                      /  a818(hexa)

 

            Voilà allez sur l'offset a818 et vous l'avez votre séquence de code !

 

            Remarque : Les programmes windows (sauf kernel......) commencent a l'offset selecteur :

            0040 0000 + VIRTUAL offset donc 0040 0000 est la base en fait.

            Lisez Delphi 3 ou securimag(chapitre 16.4) vous trouvez d'avantage d'informations.

 

            Bien, j'espere que vous avez compris même si vous trouvez ça complêtement inutile.

                  Allez sur le site protools.hpages.net, il y a des tonnes de logiciels pour convertir

                  les offset DEBUGGER -> FILE et d'autre outils très efficaces.

 

                                                By eBrain (alias OCEAN), IRCnet #codefr

 

 

      6 - Solution Du KeygenMe par TiPiaX

 

            On va donc se faire le KeygneMe de moi!

            (eh oui je crack mes progs :)

 

            Tout d'abord on démarre le proggy et on rentre:

 

            nom:     TiPiaX

            serial :  1911 (vieille habitude, j'aurais pas du lire les tuts de Bama :)

 

            ensuite on fait CTRL+D pour faire apparaître Softice et vous tappez votre

            config comme d'hab :

 

            data

            code on

 

            puis on place un :

 

            bpx GetDlgItemTextA

 

            C'est un breakpoint sur l'API qui permet de loader les chaînes en mémoire.

            Puis CTRL+D pour quitter.

            Vous faites "OK" et là (on s'en doute pas du tout) SOFTice break ! sisi !

            On fait F12 pour revenir dans le prog (car là on est dans les APIs)

            et on arrive ici: (je vous commente un peu le truc).

            Je vous balance tout:

            légende : appel d'API en rouge.

                      endroits ou vont les jumps en vert.

                      ce qui nous intéresse en bleu.

 

            ------------------------------------------------------------------------------

            PUSH 32                                //

            PUSH 004056D4                   // <-cet argument correspond au buffer

            PUSH 000003E8                   // qui recevra le nom lors de l'appel

            PUSH EDI                             // de l'API.

 

            MOV  DWORD PTR [00405708],00000000      // <-On met quelques variables à 0.

            MOV  DWORD PTR [0040570C],00000000      //

            MOV  DWORD PTR [004056D0],00000000      //

            CALL [USER32!GetDlgItemTextA]          // Appel de GetDlgItemTextA pour chopper le nom

                 

            MOV  AL,[004056D4]                // met la premiere lettre du nom dans al

            TEST AL,AL                              // teste si la lettre est un 0

            JNZ  004010AA                          // saute sur (1) si oui    *voir ps(1)

                 

            PUSH 00                                     //

            PUSH 00405250                         // Sinon on appelle une boite de message

            PUSH 00405234                         // "entrez un nom".

            PUSH EDI                                   //

            CALL [USER32!MessageBoxA]  //

            MOV  EAX,00000001                //

            POP  EDI                                    //

            RET  0010                                  //

                 

            (1):

            PUSH ESI

            PUSH 00

            PUSH 00

            PUSH 000003E9

            PUSH EDI

            CALL [USER32!GetDlgItemInt]                // Appel de GetDlgItemInt pour chopper le serial entré

                 

            MOV Cl,[004056D4]

            MOV ESI,[0040570C]

            XOR EDX,EDX

            MOV [00405710],EAX               // serial en 00405710

            TEST CL,CL

            MOV [004056D0],EDX

            JZ 004010F4

 

            //!!!la boucle interessante!!! // détaillé après:)

            (2):

            MOVSX ECX,CL

            ADD ESI,ECX

            INC EDX

            MOV [00405708],ECX

            MOV CL,[EDX+004056D4]

            TEST CL,CL

            JNZ 0040108D                //saute sur (2)

 

            MOV 004056D0,EDX

            MOV ECX,ESI

            SHL ECX,05

            ADD ECX,ESI

            POP ESI

            CMP EAX,ECX

            MOV [0040570C],ECX

            PUSH 00

            JNZ 00401122

           

            //la boite de message "bravo"

 

            PUSH 0040522C

            PUSh 0040520C

            PUSH EDI

            CALL [USER32!MessageBoxA]

            MOV EAX,00000001

            POP EDI

            RET 0010

 

            //la boite de message Mauvais serial

 

            PUSH 00405205

            PUSH 004051E8

            PUSH EDI

            CALL [USER32!MessageBoxA]

            MOV EAX,00000001

            POP EDI

            RET 0010

 

            ------------------------------------------------------------------------------

 

            ps(1) : Le prog regarde si la premiere lettre est 0 car cela signifie qu'aucun nom n'a été entré.

            Dans ce cas il envoie une boite de message.

 

            Là on a vu une vue d'ensemble qu'on va résumer avant de passer à la suite:

           

            tout d'abord le prog appelle GetDlgItemTextA pour chopper notre nom qu'il met en 004056D4

            Il teste ensuite si on a bien entré un nom. Puis il prend le numero de serie qu'il place

            en 00405710. Après il génère le bon serial et le compare à celui qu'on avait entré puis

            il envoie les boites de messages: "Bravo, bon serial" ou "mauvais serial"

 

            Etudions donc la procédure qui génère le serial (c'était le bleu :)

 

            ------------------------------------------------------------------------------

 

            MOV Cl,[004056D4]                   // premiere lettre du nom dans Cl

            MOV ESI,[0040570C]                  // on met 0040570C à 0 (car ESI = 0 ici)

            XOR EDX,EDX                         // met EDX à 0

            MOV [00405710],EAX                  // serial en 00405710

            TEST CL,CL                          // teste si la premiere lettre est un 0

            MOV [004056D0],EDX                  // on s'en fout...

            JZ 004010F4

 

            //!!!la boucle interessante!!!

            (2):

            MOVSX ECX,CL                        // Met CL dans ECX (ça fait rien du tout, lol :)

            ADD ESI,ECX                         // on ajoute la valeur de la lettre dans ESI

            INC EDX                             // EDX = EDX +1

            MOV [00405708],ECX                  // Met la lettre dans 00405708

            MOV CL,[EDX+004056D4]               // TRES IMPORTANT : Cl vaut maintenant la valeur

                                                // du début du nom +1. En fait CL pointe sur la

                                                // prochaine lettre quoi.

            TEST CL,CL                          // si il y a plus de lettre

            JNZ 0040108D                        // on part sauter sur (2)

 

            ------------------------------------------------------------------------------

            Pour résumer:

            le prog prend donc le nom lettre par lettre et les additionne dans ESI. Donc ESI = lettre1 + lettre2 ...

            Car il faut savoir que toute lettre a une valeur sous forme de nombre entier.

            On pourrait penser que c'est fini, mais il reste encore ceci à ne pas oublier (c'est le plus dur :)

 

            ------------------------------------------------------------------------------

 

            MOV 004056D0,EDX              // on s'en tape :)

            MOV ECX,ESI                   // on met la valeur de notre addition dans ECX

            SHL ECX,05                    // on décalle ECX de 5 bits vers la gauche.

            ADD ECX,ESI                   // et on ajoute L'addition (ECX) au résultat.

            POP ESI

            CMP EAX,ECX                   // compare le bon et le mauvais serial.

            MOV [0040570C],ECX

            PUSH 00

            JNZ 00401122

 

            ------------------------------------------------------------------------------

 

            un décalage de bits à gauche revient à multiplier le nombre par une puissance de 2

            SHL 5 , 20 = décalage de 20 bits sur le nombre 5.

            ce qui équivaut à 5 * 2^20 .

 

            Donc dans notre cas on a SHL ECX,05 ce qui correspond à : ECX = ECX * 5^2

            soit : ECX = ECX * 32

            Si on regarde la suite du source on voit que l'on ajoute encore ESI au résultat. Or ESI = ECX

            donc en réalité le prog fait : ECX = ECX * 33

 

            Si vous avez tout compris : le serial vaut :

            (somme des lettres) *33

            Eh oui tout ce code juste pour ça ! :)

 

            Vous n'êtes pas obligé de comprendre comment marche SHL c'est juste mieux. Mais rien ne vous empêche

            de faire des décalages de bits dans votre Keygen pour trouver le serial.

            Maintenant il faut passer au coding de notre keygen. Si vous la programmez en asm, il suffit de faire

            un copier coller du prog (enfin presque quoi). C'est pourquoi on va la faire en c pour ce qui savent pas

            comment ça ce boutique. On va en faire 2 : une avec les decalages de bits et l'autre sans:

 

            Votre KeyGen:

 

            On voit la première sans les decalages de bits:

 

            ------------------------------------------------------------------------------

                  //les variables nécessaires:

 

                  int nombre = 0;

                  int total = 0;

                  int i = 0;

                  int serial;

                  char nom[50];

 

                  GetDlgItemText(hwnd,IDC_NOM,nom,50);

     

                  if (nom[0] == 0) //pas de nom !!

                  {

                        MessageBox(hwnd,"Vous devez entrer un nom","KeyGeN",MB_OK);

                        break;

                  }

 

                  for (i=0; nom[i] != 0; i++)

                  {

                        nombre = (char) nom[i];

                        total = total + nombre;

                  }

 

                  total = total * 33;

                  SetDlgItemInt(hwnd,IDC_SERIAL,total,NULL);

 

            ------------------------------------------------------------------------------

 

            Vous rajoutez une belle boite de dialogue à tout ça. Comme certains savent pas le faire je joint

            la source complète :) Vyons maintenant la même chose avec les décalages de bits. L'interêt est

            qu'il n'y a pas besoin de réfléchir, c'est du copier coller traduit en c :)

 

            ------------------------------------------------------------------------------

                  //les variables nécessaires:

 

                  int nombre = 0;

                  int total = 0;

                  int i = 0;

                  int serial;

                  char nom[50];

 

                  GetDlgItemText(hwnd,IDC_NOM,nom,50);

 

                  if (nom[0] == 0) //pas de nom !!

                  {

                        MessageBox(hwnd,"Vous devez entrer un nom","KeyGeN",MB_OK);

                        break;

                  }

 

                  for (i=0; nom[i] != 0; i++)

                  {

                        nombre = (char) nom[i];

                        total = total + nombre;

                  }

 

                  total = (total << 5) + total;

                  SetDlgItemInt(hwnd,IDC_SERIAL,total,NULL);

            ------------------------------------------------------------------------------

 

            Et voila ce tut s'achève ici. J'espère qu'il vous servira pour Keygener de vrai progs. Big greets à:

            Moi, Jufox, AntiSocial, Obscurer, LutinNoir, KoP, Christal, Pointbat, Bendi, TeeJi et tout FcF.

 

            Gros Fuck à : Mist :-(

 

            Bonne Chance - D'autres plus difficiles devraient suivre...

 

                                          By TiPiaX