[Keygen] Tutoriel EasyCrack

Mettez à disposition vos propres cours de cracking ou des cours que vous trouvez intéressant.

[Keygen] Tutoriel EasyCrack

Messagepar RevEng » 19 Août 2011, 16:11

Bonjour à tous, je suis nouveau sur le forum, je me suis inscris il y a quelques temps déjà, mais je n'ai encore rien posté. Alors, je vais commencer par un petit tuto sur l'analyse d'un KeygenMe basique que j'ai trouvé sur le site de la Reverse Engineering Team (http://www.reteam.org). Ca faisait un petit moment que je l'avais sur mon PC et je me suis penché dessus récemment. La routine est vraiment basique mais néanmoins intéressante (enfin je trouve...), alors je vais vous détailler mon analyse en espérant être suffisamment clair pour être compris par vous tous...

Fichier : http://www.reteam.org/challenges/ch18.zip

On commence par ouvrir le programme dans PEiD, qui nous indique qu'aucun packer n'a été utilisé, et que l'EntryPoint se situe en 00001182.

On ouvre ensuite le fichier dans OllyDbg et on constate qu'il n'est pas bien gros, il a surement été codé en assembleur, car un compilateur n'aurait jamais pu faire un code aussi simple et propre.
On distingue 3 "parties" dans le code, la première qui est la fonction contenant routine du serial, la seconde qui s'occupe des champs de saisie ainsi que de la MessageBox qui indique si le serial entré est bon, et la troisième qui gère le lancement du programme. Le PE du programme est au début de la troisième "partie" (en 00401182, comme PEiD l'avait indiqué).

On lance le programme dans OllyDbg avec F9, l'interface est sommaire, un champ pour le nom, un autre pour le serial, un bouton OK (Done), et un bouton Quitter (Fuck it). On tape un nom et un serial au hasard pour voir le message d'erreur qui s'affiche lorsqu'on clique sur Done et on constate que le message qui apparaît change à chaque fois. Il y a une dizaine de messages différents et lorsqu'on les a tous épuisés le programme se ferme, et il faut tout recommencer (Ctrl+F2 dans OllyDbg pour relancer le programme).
Ce n'est pas la peine de chercher les messages dans les Text Strings avec "Search for > All referenced text strings", ils n'y sont pas. Ils sont stockés en mémoire, on peut les trouver en faisant Alt+M et en cherchant un de ces messages (en ASCII) en mémoire avec Ctrl+B dans la fenêtre "Memory Map" qui vient d'apparaître. La recherche va s'arrêter dans la section .rsrc du programme, en 00403000, tous les messages sont stockés là.
Mais on ne va pas s'embêter à poser un breakpoint sur ces messages pour trouver quelle fonction les utilise etc, etc... Ca n'a aucun intérêt vu la simplicité du programme. On voit très bien l'appel à la fonction MessageBox avec les paramètres "RIGHT" ou "WRONG" selon que le serial entré est bon ou mauvais. Si vous ne trouvez pas, vous pouvez utiliser les Text Strings cette fois-ci, "RIGHT" et "WRONG" y sont répertoriés, mais c'est juste à une vingtaine de lignes au-dessus de l'EntryPoint.

Code: Tout sélectionner
00401125  |. E8 D6FEFFFF    CALL EasyCrac.00401000
0040112A  |. 85C0           TEST EAX,EAX
0040112C  |. 59             POP ECX
0040112D  |. 59             POP ECX
0040112E  |. 56             PUSH ESI
0040112F  |. 74 0C          JE SHORT EasyCrac.0040113D
00401131  |. 68 38234000    PUSH EasyCrac.00402338                   ;  ASCII "RIGHT"
00401136  |. 68 2C234000    PUSH EasyCrac.0040232C                   ;  ASCII "You got it!"
0040113B  |.^EB DA          JMP SHORT EasyCrac.00401117
0040113D  |> A1 B4234000    MOV EAX,DWORD PTR DS:[4023B4]            ; |
00401142  |. 68 24234000    PUSH EasyCrac.00402324                   ; |Title = "WRONG"
00401147  |. 6A 0B          PUSH 0B                                  ; |
00401149  |. 59             POP ECX                                  ; |
0040114A  |. 99             CDQ                                      ; |
0040114B  |. F7F9           IDIV ECX                                 ; |
0040114D  |. FF3495 2820400>PUSH DWORD PTR DS:[EDX*4+402028]         ; |Text
00401154  |. 57             PUSH EDI                                 ; |hOwner
00401155  |. FF15 10204000  CALL DWORD PTR DS:[<&USER32.MessageBoxA>]; \MessageBoxA


On voit un saut conditionnel en 0040112F qui saute, si le ZeroFlag est levé, en 0040113D pour charger en paramètre de la MessageBox un message d'erreur. Les drapeaux sont modifiés lors du test sur EAX en 0040112A. EAX doit donc être différent de 0 pour que le saut en 0040112F ne s'effectue pas et ainsi que le message "RIGHT" indiquant la réussite soit passé en paramètre de la MessageBox.

On pourrait bêtement inverser le saut en 0040112F ou le remplacer par un NOP pour toujours afficher le bon message, mais cela n'a auncun intérêt. Le but ici est de faire en sorte que le programme mette lui-même dans EAX une autre valeur que 0 pour que le saut ne s'effectue pas. Il faut pour cela entrer un serial cohérent avec le nom pour que la fonction chargée de vérifier le serial mette un nombre différent de 0 dans EAX.

C'est probablement la fonction appelée juste au-dessus du test sur EAX, en 00401125, qui va modifier la valeur de EAX, et la mettre ou non à 0. Cette fonction, en 00401000, est la première "partie" du programme, c'est la fonction qui va comparer le serial calculé à partir du nom avec le serial entré. On pose donc un breakpoint dessus avec F2, on entre un nom et un serial au hasard et on clique sur Done.
Le programme break et on descend dans la fonction avec F7.

Code: Tout sélectionner
00401000  /$ 55                 PUSH EBP
00401001  |. 8BEC               MOV EBP,ESP
00401003  |. 51                 PUSH ECX
00401004  |. 51                 PUSH ECX
00401005  |. 8365 FC 00         AND DWORD PTR SS:[EBP-4],0
00401009  |. 56                 PUSH ESI
0040100A  |. 8B75 08            MOV ESI,DWORD PTR SS:[EBP+8]
0040100D  |. 57                 PUSH EDI
0040100E  |. 56                 PUSH ESI                                    ; /String
0040100F  |. FF15 08204000      CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>]    ; \lstrlenA
00401015  |. 8BF8               MOV EDI,EAX
00401017  |. 33D2               XOR EDX,EDX
00401019  |. 85FF               TEST EDI,EDI
0040101B  |. 7E 2A              JLE SHORT EasyCrac.00401047
0040101D  |> 0FBE0C32           /MOVSX ECX,BYTE PTR DS:[EDX+ESI]
00401021  |. 014D FC            |ADD DWORD PTR SS:[EBP-4],ECX
00401024  |. 894D F8            |MOV DWORD PTR SS:[EBP-8],ECX
00401027  |. D145 FC            |ROL DWORD PTR SS:[EBP-4],1
0040102A  |. 8BC1               |MOV EAX,ECX
0040102C  |. 0FAF45 FC          |IMUL EAX,DWORD PTR SS:[EBP-4]
00401030  |. 8945 FC            |MOV DWORD PTR SS:[EBP-4],EAX
00401033  |. 8B45 F8            |MOV EAX,DWORD PTR SS:[EBP-8]
00401036  |. 0145 FC            |ADD DWORD PTR SS:[EBP-4],EAX
00401039  |. 314D FC            |XOR DWORD PTR SS:[EBP-4],ECX
0040103C  |. 42                 |INC EDX
0040103D  |. 3BD7               |CMP EDX,EDI
0040103F  |.^7C DC              \JL SHORT EasyCrac.0040101D
00401041  |. 837D FC 00         CMP DWORD PTR SS:[EBP-4],0
00401045  |. 75 1C              JNZ SHORT EasyCrac.00401063
00401047  |> 6A 00              PUSH 0                                      ; /Style = MB_OK|MB_APPLMODAL
00401049  |. 68 0C234000        PUSH EasyCrac.0040230C                      ; |Title = "A problem has occurred"
0040104E  |. 68 CC224000        PUSH EasyCrac.004022CC                      ; |Text = "There is no valid key for this name, please use another one."
00401053  |. FF35 AC234000      PUSH DWORD PTR DS:[4023AC]                  ; |hOwner = 00050242 ('Practice by keygenning this -...',class='#32770')
00401059  |. FF15 10204000      CALL DWORD PTR DS:[<&USER32.MessageBoxA>]   ; \MessageBoxA
0040105F  |. 33C0               XOR EAX,EAX
00401061  |. EB 1C              JMP SHORT EasyCrac.0040107F
00401063  |> 8175 0C DEC03713   XOR DWORD PTR SS:[EBP+C],1337C0DE
0040106A  |. 816D 0C E50DDCBA   SUB DWORD PTR SS:[EBP+C],BADC0DE5
00401071  |. 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
00401074  |. F755 0C            NOT DWORD PTR SS:[EBP+C]
00401077  |. 3345 0C            XOR EAX,DWORD PTR SS:[EBP+C]
0040107A  |. F7D8               NEG EAX
0040107C  |. 1BC0               SBB EAX,EAX
0040107E  |. 40                 INC EAX
0040107F  |> 5F                 POP EDI
00401080  |. 5E                 POP ESI
00401081  |. C9                 LEAVE
00401082  \. C3                 RETN


La fonction commence par tester si la longueur du nom est différente de 0, autrement dit, si quelque chose a été entré. Si la longueur vaut 0, le saut vers le message d'erreur s'effectue et on quitte la fonction. Sinon, on entre dans une boucle qui va générer un serial à partir du nom.

Code: Tout sélectionner
0040101D  |> 0FBE0C32       /MOVSX ECX,BYTE PTR DS:[EDX+ESI]
00401021  |. 014D FC        |ADD DWORD PTR SS:[EBP-4],ECX
00401024  |. 894D F8        |MOV DWORD PTR SS:[EBP-8],ECX
00401027  |. D145 FC        |ROL DWORD PTR SS:[EBP-4],1
0040102A  |. 8BC1           |MOV EAX,ECX
0040102C  |. 0FAF45 FC      |IMUL EAX,DWORD PTR SS:[EBP-4]
00401030  |. 8945 FC        |MOV DWORD PTR SS:[EBP-4],EAX
00401033  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]
00401036  |. 0145 FC        |ADD DWORD PTR SS:[EBP-4],EAX
00401039  |. 314D FC        |XOR DWORD PTR SS:[EBP-4],ECX
0040103C  |. 42             |INC EDX
0040103D  |. 3BD7           |CMP EDX,EDI
0040103F  |.^7C DC          \JL SHORT EasyCrac.0040101D


L'algorithme équivalent est le suivant :

temp = temp + lettre
temp = ROL temp
temp = temp * lettre
temp = temp + lettre
temp = temp XOR lettre

L'instruction ROL signifie Rotate On Left, il s'agit d'une opération qui consiste à décaler tous les bits du premier paramètre (ici [EBP-4]) autant de fois que le précise le second paramètre (ici 1), mais en réinjectant à droite les bits sortant à gauche (ex: 1011 -> 0111).

La boucle est répétée pour chaque lettre du nom, ce qui nous donne le serial. Lorsqu'on sort de la boucle, ce serial est comparé à 0. Si il est différent de 0, le saut vers 00401063 s'effectue. On arrive ici :

Code: Tout sélectionner
00401063  |> 8175 0C DEC03713   XOR DWORD PTR SS:[EBP+C],1337C0DE
0040106A  |. 816D 0C E50DDCBA   SUB DWORD PTR SS:[EBP+C],BADC0DE5
00401071  |. 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
00401074  |. F755 0C            NOT DWORD PTR SS:[EBP+C]
00401077  |. 3345 0C            XOR EAX,DWORD PTR SS:[EBP+C]
0040107A  |. F7D8               NEG EAX
0040107C  |. 1BC0               SBB EAX,EAX
0040107E  |. 40                 INC EAX
0040107F  |> 5F                 POP EDI
00401080  |. 5E                 POP ESI
00401081  |. C9                 LEAVE
00401082  \. C3                 RETN


On voit que l'adresse qui est traitée n'est plus [EBP-4] mais [EBP+C]. [EBP-4] contient le serial calculé à partir du nom, alors que [EBP+C] contient le serial entré par l'utilisateur (ce n'est pas évident à voir car on entre le nombre en décimal, mais il est stocké en hexadécimal dans [EBP+C]).
On pourrait penser que le serial entré serait comparé au vrai dès maintenant, mais non! Et c'est cela qui est intéressant, le serial entré est en quelque sorte hashé avant d'être comparé au vrai serial. Il va donc falloir reverser le hashage, mais heureusement, celui-ci est extrêmement basique.

Le serial entré subit un XOR (OU exclusif) avec la valeur hexadécimale 1337C0DE (attention, il s'agit bien d'un zéro et pas d'un "O" alphabétique), puis on soustrait au nombre résultant la valeur hexadécimale BADC0DE5 (même remarque que précédemment). On inverse ensuite tous les bits du nombre résultant (NOT) et on fait un XOR avec le vrai serial qui se trouve dans EAX. On transforme ce nombre en négatif (NEG). L'instruction SBB (SuBstract with Borrow) soustrait EAX à EAX, puis on ajoute 1 à EAX. Les instructions qui suivent dépilent les registres et on quitte la fonction.

Nous avons dit tout à l'heure que le message d'erreur s'affiche si EAX vaut 0. Il faut donc que EAX soit différent de 0 avant de sortir de la fonction. Il faut donc prendre les instructions à l'envers pour reverser le hashage.

Si le serial entré est faux, c'est que EAX vaut 0 à la fin de la fonction.
Donc avant l'instruction INC EAX, EAX valait FFFFFFFF (car sur 32 bits, FFFFFFFF + 1 = 00000000).
Soustraire un nombre à lui-même avec SBB donne toujours FFFFFFFF, sauf si ce nombre est 0.
EAX doit donc valoir 0 avant l'instruction SBB EAX, EAX.
EAX doit aussi valoir 0 avant NEG EAX, car seul -0 = 0.
Le XOR entre EAX (le vrai serial) et [EBP+C] (le serial entré hashé) doit donner 0.
Pour qu'un XOR donne 0, il faut l'appliquer entre deux nombres identiques.
En 00401077, [EBP+C] (le serial entré hashé) doit être identique à EAX (le vrai serial).

Les instructions qui hashent le serial entré sont donc celles qui précèdent le XOR en 00401077 :

Code: Tout sélectionner
00401063  |> 8175 0C DEC03713   XOR DWORD PTR SS:[EBP+C],1337C0DE
0040106A  |. 816D 0C E50DDCBA   SUB DWORD PTR SS:[EBP+C],BADC0DE5
00401071  |. 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
00401074  |. F755 0C            NOT DWORD PTR SS:[EBP+C]


Pour plus de lisibilité, on peut éliminer la troisième ligne, qui ne fait que mettre le vrai serial dans EAX. Ce qui nous laisse :

Code: Tout sélectionner
00401063  |> 8175 0C DEC03713   XOR DWORD PTR SS:[EBP+C],1337C0DE
0040106A  |. 816D 0C E50DDCBA   SUB DWORD PTR SS:[EBP+C],BADC0DE5
...
00401074  |. F755 0C            NOT DWORD PTR SS:[EBP+C]


Je rappelle que [EBP+C] est le serial entré et EAX le vrai serial. A la fin de ces 3 instructions, [EBP+C] doit être égal à EAX.
On peut marquer de manière mathématique les opérations qui sont effectuées sur [EBP+C], ce qui donne ceci :

[EBP+C] XOR 1337C0DE
([EBP+C] XOR 1337C0DE) - BADC0DE5
-(([EBP+C] XOR 1337C0DE) - BADC0DE5)

Je disais qu'à la fin de ces 3 instructions, [EBP+C] doit être égal à EAX, on peut donc écrire une équation mathématique relativement simple qu'il ne nous reste plus qu'à résoudre :

-(([EBP+C] XOR 1337C0DE) - BADC0DE5) = EAX
([EBP+C] XOR 1337C0DE) - BADC0DE5 = -EAX
([EBP+C] XOR 1337C0DE) = -EAX + BADC0DE5
[EBP+C] = (-EAX + BADC0DE5) XOR 1337C0DE

[EBP+C] doit donc être égal à (-EAX + BADC0DE5) XOR 1337C0DE, avec EAX qui est le serial calculé juste au-dessus avec la boucle. De cette façon, le XOR en 00401077 mettra EAX à 0. Après le NEG et le SBB, EAX sera toujours à 0. Par contre, l'instruction INC EAX (INCrémenter EAX) mettra EAX à 1. En sortant de la fonction, le saut vers le message d'erreur "WRONG" ne s'effectuera pas, et on verra le bon message ("RIGHT", "You got it!").

Il ne reste plus qu'à coder tout cela. J'ai donc écrit un code source en C++ :

Code: Tout sélectionner
#include <iostream>

using namespace std;

int main()
{
    string name;
    cout << "Name : ";
    cin >> name;

    unsigned int temp = 0;
    unsigned int serial = 0;
    for(int(i) = 0; i < name.size(); i++)
    {
        temp = temp + name[i];
        temp = (temp << 1) | (temp >> (32-1));  //Equivalent de ROL (sur 32 bits)
        temp = temp * name[i];
        temp = temp + name[i];
        temp = temp ^ name[i];
    }

    serial = (~temp + 0xBADC0DE5) ^ 0x1337C0DE; //~ est un NON logique
    cout << "Serial : " << serial << endl;

    return 0;
}


C'est le strict minimum, il n'y a aucune interface graphique, seulement un affichage console, mais pour avoir le serial c'est suffisant.
Je ne garantis pas que mon keygen fonctionne pour tous les noms, cela est dû aux jeux de caractères différents utilisés par mon keygen et le programme, mais les caractères alphanumériques [A-Z][a-z][0-9] passent très bien (sauf certains accents). Il faut aussi éviter les noms trop longs, mais les noms d'une dizaine de caractères "normaux" ne posent normalement pas de problèmes.

Voila, j'espère avoir été clair dans ma démarche, si vous avez des questions, je tâcherais d'y répondre.

P.S : Je me suis permis de poster ma solution sur ce forum bien que le fichier vienne d'un autre site, je ne sais pas si ça se fait, si non, je m'excuse auprès de l'auteur (Kwazy Wabbit)...
RevEng
 
Messages: 5
Inscription: 01 Juillet 2011, 20:44

Re: [Keygen] Tutoriel EasyCrack

Messagepar RevEng » 25 Août 2011, 18:54

Pourriez vous me dire ce que avez pensé de mon tuto? Ma démarche est-elle bonne? Avez-vous trouvé ça intéressant?

Merci
RevEng
 
Messages: 5
Inscription: 01 Juillet 2011, 20:44

Re: [Keygen] Tutoriel EasyCrack

Messagepar Todd » 25 Août 2011, 21:21

Salut RevEng,

c'est vrai que tu as pris le temps de rédiger un long... même très long tutoriel :? et personne n'a pris le temps de te répondre ! :evil:
Désolé ! :oops:

Pour ma part je l'ai lu, mais certainement comme d'autres j'ai rapidement abandonné ! :roll: Car c'est beaucoup trop long et monotone ! :aie: Comme tu l'as dit c'est un défi facile et tu en mets une tartine ! :shock: Il y a trop de détails inutiles ! :wink:
D'autant qu'il y a énormément d'informations techniques qu'on ne peut comprendre ou suivre qu'en mettant en pratique. :roll:

Je pense quand même que ton travail pourra servir aux débutants, qui voudront s'exercer sur un keygen. :wink: Ils n'auront qu'à suivre tes instructions. :)

Donc je t'encourage à continuer si ça te passionne (en tenant compte de mes remarques 8)), mais ne t'attends pas à ce que quelqu'un ait envie tout de suite de mettre en pratique... sois patient ! :wink:

Bonne continuation.

Todd
Avatar de l’utilisateur
Todd
Modérateur
Modérateur
 
Messages: 1795
Inscription: 19 Avril 2009, 12:11

Re: [Keygen] Tutoriel EasyCrack

Messagepar RevEng » 26 Août 2011, 10:34

Salut Todd, merci de tes remarques. Mais pourrais-tu me dire plus en détail les passages que tu trouves ennuyants ou inutiles, car j'ai l'impression que mon raisonnement devient difficile à suivre si j'enlève ne serait-ce que quelques lignes...
RevEng
 
Messages: 5
Inscription: 01 Juillet 2011, 20:44

Re: [Keygen] Tutoriel EasyCrack

Messagepar Todd » 26 Août 2011, 11:44

Disons que dans l'ensemble, au niveau du contenu, c'est correct :wink:... encore qu'il faudrait prendre le temps de mettre en pratique pour s'en assurer ! :roll: Et c'est là où cette lecture perd de son intérêt. :?
Comme d'autres curieux, j'avais envie de voir les différentes techniques utilisées, mais c'est impossible à suivre ! :(
Mis bout à bout :
RevEng a écrit:Ctrl+F2... en 00401125... plus [EBP-4] mais [EBP+C]... [EBP+C] XOR 1337C0DE, etc.
On comprend tous ce que tout cela signifie et pourtant présenté ainsi c'est incompréhensible ! :?

Sans vouloir mettre la barre trop haute, tu peux t'inspirer DU spécialiste en la matière : Beatrix
Il y en certainement d'autres, mais j'ai toujours eu une grande admiration pour son travail 8), à tout point de vue. :)

Tu sembles maitriser le fond, il faut maintenant que tu travailles la forme. :wink:
Présentation, chapitres, mise en page, schéma, etc. sont autant d'artifices indispensables si tu souhaites mettre en valeur ton travail. :wink:

Todd
Avatar de l’utilisateur
Todd
Modérateur
Modérateur
 
Messages: 1795
Inscription: 19 Avril 2009, 12:11

Re: [Keygen] Tutoriel EasyCrack

Messagepar baboon » 26 Août 2011, 13:14

Personnellement j'aime bien, le style est peut être un peu scolaire mais ca ne me dérange pas.
Continue tes tutos et passe à plus dur :p
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3271
Inscription: 08 Juillet 2005, 17:49

Re: [Keygen] Tutoriel EasyCrack

Messagepar RevEng » 26 Août 2011, 16:28

Ok, merci Todd, je vais tâcher de tenir compte de tes remarques dans mes prochains tutos, et jeter un coup d'oeil aux tutos de Beatrix.
Baboon, quand tu dis de passer à plus dur, je pense à un soft que j'ai keygenné il y a quelques jours, mais c'est un logiciel commercial, ça pose problème?
RevEng
 
Messages: 5
Inscription: 01 Juillet 2011, 20:44

Re: [Keygen] Tutoriel EasyCrack

Messagepar Bango » 29 Août 2011, 08:49

Salut,

J'aime bien aussi :) ça manque peut-être un peu de simplicité vu la simplicité de la cible, mais c'est po mal ;)

RevEng a écrit:Baboon, quand tu dis de passer à plus dur, je pense à un soft que j'ai keygenné il y a quelques jours, mais c'est un logiciel commercial, ça pose problème?


Tant que c'est à but éducatif... tu peux utiliser un soft commercial :aie: . Evite de mettre le nom du soft en gros (ni même en petit) et ne fais aucun lien de dl direct sur la page de l'éditeur :roll:
\ô/
Avatar de l’utilisateur
Bango
Modérateur
Modérateur
 
Messages: 1512
Inscription: 23 Juillet 2007, 15:33
Localisation: Gotham city

Re: [Keygen] Tutoriel EasyCrack

Messagepar EpicOut » 17 Décembre 2012, 12:52

Personnellement, j'ai bien aimé ton tutoriel, il a tout ce qu'il faut et pour ce qui est de l'explication de l'algo en langage naturel, c'était sympa au contraire de Todd qui a trouvé celà incompréhensible (btw,qu'est-ce que tu as trouvé incompréhensible?), bref continue ainsi !
EpicOut
 
Messages: 3
Inscription: 07 Novembre 2012, 06:14

Re: [Keygen] Tutoriel EasyCrack

Messagepar Todd » 31 Décembre 2012, 01:03

EpicOut a écrit:qu'est-ce que tu as trouvé incompréhensible?
C'était une façon de parler ! :wink:
Un bon tutoriel est comme un livre, il doit pouvoir se lire sans trop se prendre la tête. :? Ici j'ai rapidement décroché parce qu'il y avait trop de référence impossible à vérifier sans passer à la pratique. :|
Certains tutoriels bien plus complexe se lisent malgré tout sans difficulté. 8) Si je reprends le travail de Beatrix en exemple :mrgreen:, je dirais qu'à part le vocabulaire, ses articles peuvent être suivis même par des débutants. :wink:

Sinon je n'ai pas dit que RevEng avait été mauvais :o, j'ai seulement essayé d'expliquer, selon moi, pourquoi personne n'avait réagit. :(

Todd
Avatar de l’utilisateur
Todd
Modérateur
Modérateur
 
Messages: 1795
Inscription: 19 Avril 2009, 12:11

Re: [Keygen] Tutoriel EasyCrack

Messagepar alpaga51 » 19 Mars 2013, 20:49

RevEng a écrit:Pourriez vous me dire ce que avez pensé de mon tuto? Ma démarche est-elle bonne? Avez-vous trouvé ça intéressant?

Merci

Très interessant et le tuto est remarquablement écrit
Bonne suite
Windev 7.5 plus si possible
alpaga51
 
Messages: 7
Inscription: 25 Juin 2007, 08:38
Localisation: ALGERIE


Retourner vers Tutoriels

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité