•  

    Dans cette seconde partie de notre tutorial, nous allons aborder différents raisonnements pour cracker, toujours avec StartClean ... (le pauvre :( ). Dans cette partie du cours, je m'adresse particulierement aux Newbies qui ont deja essayé de cracker un truc mais qui ont pas réussi, sans comprendre pourquoi...

     

    1/ Les logiciels utiles pour ce cours

    -> Le programme à craquer     :  Start Clean v1.2
    -> Un désassembleur             :  W32dasm 8.93
    -> Un éditeur hexa décimal     :  Winhex 10.2

     

    2/ Contenu d'un programme

    Dans un programme il y a des menus, un titre en haut de la fenêtre, une barre d'état, des boîtes de dialogues....

    Tous ces éléments contiennent du texte (menu "Fichier", "Erreur 806...") Eh ben, W32Dasm permet de retrouver ce texte a l'intérieur de l'exécutable ! C'est ce que nous avons déja fait dans la première partie du cours (souvenez vous de la recherche sur le mot "name"), sauf que maintenant, je vais expliquer un raisonnement que beaucoup de newbies ont mais qui s'avère erroné... Lorsque l'on rentre un code au pif asn start clean, on tombe sur la boîte de dialog "Incorrect Code"...

    Reflechissons donc deux secondes : ce message ne s'affiche qu'a condition que le code soit faux...

    Donc, si on arrive a retrouver ce message, on pourrait faire en sorte qu'il ne s'affiche plus (en "noppant" un saut conditionnel par exemple...) Essayons ce raisonnement dans W32Dasm...:

       -> Lancer W32Dasm.
       -> Désassembler le fichier StartClean. (cf cours de crack 1)
       -> Faites Refs => String Data References.... Là, vous devriez avoir une petite fenetre comme celle ci :

    <script type="text/javascript">document.write("")</script>

     

    Bon, balladez vous dedans jusqu'a ce que vous trouviez la phrase "Incorrect Code"...

       -> Double cliquez sur cette phrase : vous êtes amené à l'endroit précis où on y fait reference ! Cependant, de la même maniere qu'il y avait plusieurs fois le mot name dans le 1er cours, verifiez que "Incorrect Code" n'est pas repeté plusieurs fois dans le programme...(double cliquez plusieurs fois dessus). Par chance, il n'y a qu'une seule occurence a cette phrase !

    NB : s'il y avait eu plusieurs occurences, il aurait fallu s'occuper de chacune de ces occurences, ou alors determiner celles qui nous interressent (cf 1ere partie du cours). Bien, maintenant observons l'endroit ou on a atterri :
     

    <script type="text/javascript">document.write("")</script>

     

    La ligne "Referenced by..." indique l'adresse qui nous a amené ici, c'est a dire l'adresse 004027A3 depuis laquelle le programme a sauté...Il y a un "C" entre parenthese juste derriere l'addresse. Ce "C" signifie tout simplement "Conditional". Ca veut dire que c'est un saut conditionnel qui nous a envoyé a cette partie du code.

    Reflechissons un minimum : si on veut ne pas venir ici, il suffit de nopper ce vilain saut ! On va donc aller a l'adresse indiquée par le "Referenced by....", a savoir 004027A3 ...Faites :

       -> Faites : Goto => Goto Code Location... (ou shift F12) et rentrer l'adresse en question : 004027A3.

     

    <script type="text/javascript">document.write("")</script>

     

    Oh !! Le beau je 004027C1 !! Bon, ben vous savez ce qu'on va faire : On va nopper le saut :).

       -> Dans l'éditeur hexadecimal winhex, vous aller cherchez 741C. Cependant, il va falloir mettre plus d'instructions que "741C" parcequ'il peut y avoir plusieurs fois "741C" dans le code Hexadecimal du programme :). Donc, on va cherchez "741C" en rajoutant un peu devant et un peu derriere : 83C40485C0741CC7054C7240

    NB : si vous comprenez pas d'ou sorte les chiffres avant et apres, faites le rapprochemment avec le listing de la photo du dessus. Une fois la recherche effectué, vous remplacez le 741C par 9090... Maintenant, lancer le prog et enregistrer vous n'importe comment : ca marche !!! Super !!!

    Etes vous sur que ca marche vraiment ? Bien sur, le programme ne vous dit plus "Incorrect Code", mais êtes vous pour autant enregistré ? Un seul moyen de le savoir : fermer le prog' et relancer le...Sniff!...ben non, ca a pas marcher :(...enfin, pas tout a fait...

    Explications : en fait, tout ce qu'on a fait, c'est detourner le message sensé nous indiquez que le code est incorecte...Ce message s'affiche lorsque le programme sait deja qu'on a entré un faux code.

    Reprenons les choses pas-a-pas :
       -> On vous demande de rentrer un nom et un code...
       -> Lorsque vous cliquez sur "OK", le programme verifie le code :
           -> s'il est bon, c'est cool et vous etes enregistrer,
           -> si il est pas bon, on vous previens par un petit message que le code est mauvais...

    Donc,s'il y a le message "Incorrect Code", ca veut dire que le programme a deja determiné que le code était faux...Inutile donc d'essayer de changer le message qu'on nous affiche, c'est bien avant qu'il faut agir :) Compris ??

    Si j'ai pris le temps d'expliquer cette erreur, c'est parceque beaucoup de Newbies tombent dans le piège lors de leur premiers cracks. J'espère donc que ce cours aura eclairé certains et prévenus d'autres sur les résultats d'un tel raisonnement ;)

     

    <script type="text/javascript">document.write("")</script>

     


    1 commentaire
  • Mon objectif : tout vous expliquer de A à Z pour que vous puissiez comprendre comment fonctionne le cracking. Il va falloir que vous lisiez bien tout attentivement de façon à bien comprendre les cours. Chaque cours est la suite du précdent et de niveau croissant en difficulté (rassurez vous on va faire dans la simplicité en expliquant au maximum les points pouvant paraître obscurs).

     

     

    1/ Qu'est ce qu'un crack ?

    Un crack, est un petit programme (quelques ko en général) qui va modifier certains octets d'une application à certains emplacements du fichier cible de façon transformer son comportement. Par exemple jouer à votre jeux préféré sans CD ou encore utiliser le programme en tant qu'utilisateur enregistré.

    Pour faire votre premier crack, on a choisi un programme super facile à cracker pour vous montrer un truc super classique, le saut conditionnel ;))

    Comme son nom l'indique, un saut conditionnel est un endroit dans le programme où une condition (on parle encore de test) est vérifiée. Si cette condition n'est pas remplie par exemple lors la tentative d'enregistrement de Start Clean v1.2 le programme sautera vers une partie du code qui affichera un message d'erreur sinon il continuera normalement son exécution pour afficher un message de succès (pour l'enregistrement).

     

     

    2/ Les logiciels pour le cracking.

    Pour craquer un programme il vous faut d'abord choisir une cible (le programme lui-même à craquer). Typiquement il s'agit dans la majorité des cas une fichier exécutable (d'extension .exe) ; plus rarement un fichier dll. Ici la cible choisie qu'on a choisi pour sa simplicité et sa taille c'est Start Clean v1.2 (il ne fait que 14 ko). Ce programme sert à supprimer les raccourcis orphelins dans le menu Démarrer (c'est à dire qui ne mènent nulle part).

    Ensuite il vous faut un désassembleur qui comme son nom l'indique sert à désassembler un fichier (ici Start Clean v1.2) de façon à le rendre lisible et compréhensible. Pour ma part, j'utilise W32Dasm 8.93 facile à trouver sur le net. Il existe aussi pour ceux qui ont un niveau un peu plus avancé en cracking le désassembleur ollydbg 1.10. Ces 2 désassembleurs intègrent un débugger : c'est un module qui permet d'exécuter ligne de code par ligne de code le programme à craquer.

    Par ailleurs il vous faut aussi ce qu'on appelle un éditeur hexadécimal. Comme son nom l'indique aussi, il sert à faire apparaître un fichier sous forme héxadécimale. C'est cet éditeur qui nous permet de modifier physiquement le comportement du programme et donc de le craquer en remplaçant une suite d'octets par une autre. Mon préferé c'est WinHex 10.2 , mais il y a ausi HexWorks 3.X. N'importe quel éditeur hexadécimal fera l'affaire.

    Enfin, il vous faudra dans tous les cas (enfin presque) un cerveau réveillé et en état de marche ;)

     

     

    3/ Réglages préliminaires de W32dasm.

    D'abord, lancez

    Start Clean v1.2

    (

    STARTCLN.EXE

    ). Au démarrage, une fenêtre s'affiche pour pouvoir s'enregistrer. Mais le problème c'est que vous avez peut être pas que ça à faire que d'envoyer de l'argent à ce cher monsieur

    Fira El-Hasans

    , le concepteur du logiciel

    Start Clean v1.2

    , d'où la necessité de réaliser un crack ;) .

    Donc, pour pouvoir voir le programme de façon lisible, il faut l'ouvrir avec notre désassembleur W32Dasm 8.93 (W32DSM89.EXE).

    Avant tout, faite une copie de STARTCLN.EXE et lancez W32DSM89.EXE.

    Comme c'est le premier lancement de W32DSM89.EXE, il faut choisir la font par défaut que l'on va utiliser. Faites :
    Disassembler -> Font ... -> Select Font.

    Et pour sauvegarder la font choisie, faite :
    Disassembler -> Font -> Save Default Font.

    Allez cherchez ensuite la copie du fichier executable STARTCLN.EXE de la façon suivante :
    Disassembler -> Open File to Disassemble ..

    Double-cliquez sur la copie de STARTCLN.EXE

     

     

    4/ Le listing de désassemblage.

    Ben oui, ce que vous voyez maintenat à l'écran c'est du code en assembleur. Ce sont de petites instructions qui s'enchaînent pour former un tout, un programme.

    L'assembleur est le language de programmation le plus bas. Quand vous programmez que se soit en C ou en Delphi, tout est traduit en assembleur pour que votre programme soit compréhensible par l' ordinateur, car ne l'oublions pas l'assembleur, c'est le language machine par exellence. Ses avantages résident dans le fait qu'il est tout de suite compris par la machine, ainsi, un programme, même écrit en C sera exécuté moins rapidement que s'il avait été fait en assembleur (de quelques dixièmes de secondes, mais bon ...).

    Ok, vous devez peut-être vous dire "c'est quoi ce charabia incompréhensible, je quitte ça et je retourne télécharger des cracks tous faits sur internet". Si c'est ce que vous vous dites, alors quittez ce tutorial, et vous serez obligé d'attendre sur le net que les cracks sortent, et surtout, vous ratterez le plus important, la satisfaction personnelle et le monde superbe qu'est l'assembleur.

    Par contre si vous vous dites "ce truc, c'est bizarre mais j'ai envie d'appronfondir et de savoir comment on s'y prend pour cracker" ; alors la suite de ce tutorial est pour vous ;)).

    Bon, ce qui apparaît à l'écran ça s'appelle un listing de désassemblage. C'est là dessus que l'ont va travailler.

     

    <script type="text/javascript">document.write("")</script>

     

    Avant de poursuivre ayez à l'esprit que les instructions successives d'un programme s'exécutent toujours de bas en haut et de gauche à droite : c'est le sens naturel de lecture.

     

     

    5/ Faisons un peu d'assembleur.

    Revenons à

    W32DSM89.EXE

    .

    -> Avant de lancer une recherche sur un mot, on va se placer directement à l'entrée du prog, car ce qu'il y a avant on s'en fiche un peu ;). Pour ca, faites: Goto -> Goto Code Start...

    -> Lancez ensuite une recherche automatique sur le mot "name"; (ne rentrez pas les guïllemets ), car il fait partie de la boîte de dialogue se chargeant de la saisie du code. On pourrait aussi rechercher "code". Pour faire cette recherche, faites  la commande suivant dans Search -> Find Text..

     

    <script type="text/javascript">document.write("")</script>

     

    Et là, vous allez forcement tomber sur quelque chose. Cependant, il se peut qu'il y ait plusieurs fois ce mot dans le programme... Donc, par mesure de prudence, faites Suivant. Vous verrez alors que vous arrivez à d'autres endroits du programme. Alors, que choisir ?

    -> Revenez au debut du code (Goto -> Goto Code Start ou bien clic sur le bouton avec une lampe marqué Cd Start en dessous dans la barre de bouton de w32dasm).

    -> Refaite une recherche et arrêtez vous à la seconde occurence de "name " (qui doit etre trouvée a la ligne 423 comme indiqué en bas de cette photo qui représente une partie de listing de désassemblage crée plus haut).

    <script type="text/javascript">document.write("")</script>

    On se trouve alors à un endroit particulièrement intérressant. Mais alors pourquoi cet endroit est t-il si intéressant me direz-vous ?

    Parce que si l'on observe bien cette petite partie (ce qu'il y a avant et après...), on remarque que l'indication *Reference To: ADVAPI32. RegCreateKey, Ord: 00C6h est affichée.

    Cette indication de fonction indique que STARTCLN.EXE va inscrire un truc dans la base de registre de Windows, sans doute votre nom et code a condition que votre code soit bon :). En français pour ceux qui sont allergiques à l'anglais RegCreateKey veux dire créer une clef dans le registre (Reg pour Registry).

    L'instruction que l'on recherche est un saut conditionnel. En assembleur, ça se traduit par :
    JNE, JNZ... (jump if not equal (to zéro), jump if not zéro) qui sont des sauts appelés sauts de "non egalité"...
    JE, JZ....    (jump if equal (to zéro), jump if zéro) qui sont des sauts qui s'effectuent en cas d'égalité"...

    Egalité signifie ici "deux valeur identique". Lorsque que le programme va comparer votre code avec le vrai, il va indiquez s'il sont "egaux" ou non.

    Si le saut est de forme JE, alors on dira que "le saut se fait si les codes sont égaux".
    Si le saut est de la forme JNE, alors on dira que "le saut se fait si les codes ne sont pas egaux"...

    Il existe un type de saut appelé inconditionnels, c'est a dire que le saut s'effectue sans conditions (on saute tout le temps).Ce saut s'ecrit avec une instruction JMP en assembleur, mais cela ne nous servira pas pour ce tutorial.

    Donc, pour revenir a STARTCLN.EXE, il va falloir qu'on trouve tout les sauts qu'il y a dans le bout de code ci dessus, puis qu'on analyse où est-ce qu'ils nous font sauter.

    On est chanceux, ici il n'y a qu'un seul saut qui est a l'adresse 004011EB, et qui est située juste apres un test (un TEST est l'instruction qui determine si une valeur est égale à zéro) et juste au dessus de la chaîne "name" trouvée.On a donc :

     

    <script type="text/javascript">document.write("")</script>

     

    L'instruction assembleur jne 00401271 signifie : "Sauter à l'adresse 00401271 si la valeur testée ici eax n'est pas égale à zéro". Cette instruction est intéressante car il y a fort à parier que la valeur testée soit le numéro de série que vous avez rentré au pif. En effet au dessus on voit que le programme fait appel à une API (Application Interfcace Programming) nommée Kernel32 qui est un fichier sur votre disque dur (le fichier kernel32.dll dans C:windowssystem32). C'est dans cette dll (Dynamic Link Librairie <=> bibliothèque de liens dynamiques) qu'est encodée la fonction de comparaison de chaînes nommée lstrcmpA ( l' API Kernel32.lstrcmpA va comparer votre numéro de série encore appelé serial dans la terminologie anglo-saxone avec le vrai serial calculé par l'application).

    Il faut bien comprendre que souvent, un numéro de série est considéré comme valide lorsque la valeur du test est égale a zéro. Autrement, dans le cas où le test n'est pas égal à zéro, alors ce numéro est reconnu comme incorrect. C'est un peu comme le courant electrique : 0 = ouvert et 1 = fermé. Compris ?

    Donc, "sauter a l'adresse 00401271 si la valeur testée n'est pas egale a zéro" siginfie que si le code est mauvais, on va "sauter" tout ce qu'il y a entre l'adresse 004011EB (l'endroit d'où l'on saute) et l'adresse 00401271 (l'endroit où le saut nous amène).

     

    Regardez sur le listing.Concrètement, le saut va passer au dessus de toutes la partie du programme qui inscrit notre nom et notre code dans la base de registre.

    * Reference To: ADVAPI32.RegCreateKeyExA, Ord:00C6h
    :00401218     FF1500924000              Call dword ptr [00409200]
    ... 

    * Reference To: ADVAPI32.RegSetValueExA, Ord:00ECh
    :0040122C     8B35FC914000             mov esi, dword ptr [004091FC]
    ...

    * Possible StringData Ref from Data Obj ->"Name"
    :00401236     6838624000                  push 00406238
    ...

    * Possible StringData Ref from Data Obj ->"Code"
    :00401250     6830624000                  push 00406230
    ...

    * Reference To: ADVAPI32.RegCloseKey, Ord:00C2h
    :0040125D    FF15F0914000              Call dword ptr [004091F0]

     

    Par contre, si le code est bon, le saut ne s'effectue pas et le programme va continuer son listing en passant sur ls lignes du dessus.

     

    Là encore c'est une API qui est utilisée ADVAPI32.dll qui est utilisée
    -> pour créer une clé dans le registre de windows on utilise la fonction RegCreateKeyExA).
    -> pour assigner une valeur à cette clef on utilise la fonction RegSetValueExA.

    Le mot Reg est une abréviation de Registry (registre en français. Le registre est la base de paramétrage du système windows, du matétriel et des applications installés sur votre machine; en d'autres termes c'est une grosse base de données et le coeur des systèmes windows).

    Cette étape est importante à comprendre et si vous ne l'avez pas comprise relisez la plus attentivement...

     

    Donc, il va falloir que l'on modifie le saut jne 00401271.Dans ce cas de figure, il faut faire ce que l'on appelle "nopper" une valeur :)
    Mais avant, un petit cour sur l'hexadécimal s'impose :))

     

     

    6/ L'hexadécimal. 

    D'abord oubliez la façon dons vous avez appris à compter. Parce qu' en hexadécimal, on compte le la façon suivante :

    Décimal

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    Hexadécimal

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    A

    B

    C

    D

    E

    F

     

    Par exemple 15 en décimal s' ecrit F en hexadécimal. Mais pouquoi dit-on héxadécimal ? Tout simplement parce qu' après les neufs premier chiffres il y à six lettres, 6 d'où hexa, comme un héxagone a six cotés ;) Sinon pour ce qui est des conversions et tout, nous verrons ça dans un autre tutorial ;)

     

     

    7/ Conversion assembleur / hexadécimal.

    Voici une petite liste qui vous indique la valeur hexadécimale de quelques instructions assembleur.

     

    Assembleur

    Hexadécimal

    NOP 90
    JNE 75 ou 0F85
    JE 74 ou 0F84
    JMP EB ou E9
    XOR 33
    RET C3

    Il existe encore beaucoup d'autres instructions, mais qui sont peu intéressantes à notre stade ;)

    Pour illustrer ce tableau prenons un exemple. Regardons le code hexadécimal

    0F8580000000

    se trouvant à la gauche de l'instruction

    jne 00401271

    dans le listing à l'adresse

    004011EB

    . C'est en fait la valeur traduite en hexadécimale de l'instruction assembleur 

    jne 00401271

    .

    0F85

    c'est

    jne

    et

    80000000

    c'est la zone mémoire mémoire où l'on saute. Une zone mémoire, si vous ne savez pas, c'est un peut comme un petit carré de mémoire éléctronique qui va contenir une information. Par exemple si vous collez un post-it avec écrit dessus "

    achète du pain pour ce soir

    " sur un porte, et bien la porte c'est le bloc mémoire et le post-it l'information ;)

     

     

    8/ Nopper une valeur.

    Qu'est ce que ça veut dire "

    Nopper une valeur

    " ? Ca veut dire que l'on va remplacer la valeur d'un octet par la valeur

    90

    en hexadécimal, ce qui correspond à une instruction assembleur qui veut dire

    ne fait rien

    (

    Nop

    =

    N

    o

    OP

    eration). L'instruction

    nop

    en assembleur est un peu bizarre, puisqu'elle ne sert à rien. Sauf dans certains cas pour faire perdre du temps CPU (Central Processing Unit = micro-processeur) en encombrant ses entrées/sorties.

     

     

    9/ Modifier l'exécutable STARTCLN.EXE.

    La question qu'on se pose maintenant c'est Comment nopper le saut conditionnel en 004011EB ?

    Il suffit d' ouvrir le fichier

    STARTCLN.EXE

    avec votre éditeur hexadécimal

    WinHex 10.2

    (commande

    fichier

    ->

    ouvrir

    ->

    STARTCLN.EXE

    ), de lancer une recherche automatique sur la valeur

    0F 85 80 00 00 00

    (avec

    CTRL ALT F

    ->

    0F8580000000

    qui represente en assembleur l'instruction

    jne 00401271

    ). Une fois vérifié que cette valeur est bien la seule occurence trouvée en faisant suivant avec

    F3

    , on écrit au milieu de la fenêtre

    909090909090

    (6 fois

    90

    ) puis on enregistre les modifications (n'oubliez pas de faire une sauvegarde du fichier d'origine au préalable, au cas où vous vous tromperiez...(on ne sait jamais)).

     

    Remarque : message de pifoman : si votre éditeur héxadécimal vous dit qu'il ne peut enregistrer les modifications enlevez l'attribut lecture seule de STARTCLN.EXE. Si cela ne suffit pas fermez le désassembleur W32DSM89.EXE qui verrouille toujours un fichier en écriture quand celui-ci est ouvert dedans. Il empêche ainsi d'écrire sur ce fichier avec un autre logiciel comme notre éditeur hexadécimal winhex par exemple.

     

     

    10/ Vérifications après les modifications. 

    Quand on craque un logiciel en modifiant un ou plusieurs octets avec l'éditeur hexadécimal il faut s'assurer que l'effet attendu est bien là : ici on cherche à s'enregistrer avec un numéro de série bidon. Pour cela lançons le programme ainsi modifié.

    Quoi ? La boite de dialogue d'enregistrement est toujours présente ? Normal puisque le programme n'a pas encore enregistré votre code dans la base de registre de Windows. Il faut donc cliquer sur le bouton REGISTER et rentrer un nom par exemple le mien pifoman et un code bidon 123456 puis cliquer sur le bouton OK (c'est moi pifoman qui écrit ici).

    Et là ca marche ! Car le saut jne n'existe plus, donc le prog continue tranquillement son listing en passant sur les fonctions ADVAPI32.RegCreateKeyExA et ADVAPI32.RegSetValueExA. Le programme est donc maintenat complet et illimité. Vous pourrez aussi observer qu'il a inscrit un code personnel qu'il s'est auto-généré dans la base de registre de Windows sous la clef HKEY_CURRENT_USERSoftwareStart CleanConfiguration (on acède au registre de windows avec le menu démarrer -> exécuter -> regedit). Pourquoi cette clé ? Parceque comme on pouvait le constater au dessus de notre Kernel32.lstrcmpA au paragraphe 5 on avait en plus des valeurs name et Code la chaîne

     

    <script type="text/javascript">document.write("")</script>

     

    Miracle ? Non, c'est ça la magie de l'assembleur ;)))

    PS : je ne dis pas ça pour vous décourager, mais pour un cracker conséquent, un tel raisonnement, observations et crack compris, ce type de sécurité à retirer ne prend que deux à trois minutes et encore. Alors entraînez vous bien et vous verrez, c'est pas si compliqué que ça en à l'air ;)

     

     

    11/ Quelques conseils et astuces.

     -> Lire pleins de tutoriaux fait sur de petit progs, les comprendre et faire l'effort de tout lire jusqu'à la fin.
     -> Etre à l'aise avec l'anglais technique (avoir un dictionnaire comme ultralingua dans un coin de l'écran).
     -> Ne pas se prendre la tête et laisser son esprit logique tourner seul, ça donne plus d'endurance.
     -> Faire une pause de 5 minutes minimum toutes les heures, quand on commence à cracker, c'est mieux.
     -> Faire ses devoirs avant ;) , car craquer, surtout pour la première fois prend du temps.
     -> S'acheter un petit bouquin sur l'assembleur.
         . Pour moi la réference, c'est L' assembleur de Bernard Fabrot, éditions Marabout, environ 50 francs.
         . Pour moi pifoman ma référence L'assembleur une découverte pas à pas aux éditions Marabout de Philippe Mercier (57.95 F)
         en français, imprimé le 26/02/1998 et bien expliqué [ISBN 2-501-01176-7].
     -> Ne pas s'auto proclamer bon crackeur parce qu'on à cracker 1 ou 2 progs.
     -> Avoir un bon écran (type tube cathodique et pas un écran plat) car pour le confort de lecture du listing, c'est primordial.
     -> Ne pas rester tout le temps dans le désassembleur et naviguer de façon équilibré entre ce dernier et l'éditeur héxa.
     -> Faire pleins d'essais avec l'éditeur hexadécimal.
     -> Désassemblez le fichier d'origine et travailler sur une copie du fichier dans l'éditeur hexadécimal.
     -> Toujours vérifier si l'effet d'une modification dans l'éditeur hexdécimal est bien celui attendu dans le programme.


    votre commentaire
  • Mon objectif : créer un crack en turbo pascal

     

    Dans le 5ième cours de cracking, Smeita nous avait expliqué comment faire son propre patcheur via le language Pascal et son compilateur TPC... Maintenant, nous allons voir comment faire un patch mais plus évolué qui tiendra compte de plus de paramètres avec notamment une verification CRC du fichier a patcher (CRC = Contrôle de Redondance Cyclique) !

    Comme dans le 5ième cours de cracking, je vous donne le code commenté, puis un exemple sans les commentaires ! Ici, les textes en rouge sont ceux que vous devez modifier pour faire correctement votre patcheur. Les texte en jaune sont ceux que vous pouvez modifier pour des raisons esthétiques...

    Le reste, pas touche !! Essayer de bien comprendre, ca sera deja bien :) Bien sur, il faut savoir que certains passages ne sont pas évidents à expliquer, ainsi j'ai essayé de faire le plus simple possible ;)

     

     

    ------------------------------------------------------------------------------------- début -------------------------------------------------------------------------------------
    Program Crack;  //juste pour indiquer le nom du prog
    
    Uses CRT, DOS;  //indique quelle bibliothèque on va utiliser des 
                    //routines graphiques DOS
    
    Const           //indique que l' on va charger des constantes
                    //en mémoire pour les réutiliser par la suite 
    
        FileN         : String  = 'progde~1.exe';   //FileN va donc indiquer
                                                    //le fichier 'progde~1.exe'
                                                    //dès que l' en aurat besion
      
        BytesToChange : Integer = 2;           //2 indique le nombre d' octects à
                                               //patcher    
    
        FileS         : LongInt = 564132;      //564132 indique la taille du fichier.
                                               //Elle s' éxprime en octects 
          
        A             : Array[1..2] of Record  //indique que l' on va donner
                                               //de modification allant de
                                               //1 à 2, ici en octects
           
    
          A : Longint;
          B : Byte;
    
         
    End =
    
    (
    (A:$303e6;B:$90),  //adresses héxadécimales à modifier et leurs octects
    (A:$47274;B:$90)   //attention !! sur la derniere ligne=> pas de virgule !!!!
    );
    
    
    Var
    
      F     : File;
      Ch    : Char;
      Attr  : Word;
      I     : LongInt;
    
    
    Begin
     
    Textcolor(13);    //pour choisir la couleur de ce qui va s' afficher à l' écran
    
    clrscr;   //efface l' écran, WriteLn ne se charge donc que d' afficher un texte,
              //juste une question de présentation	  	
    
    
    
      Writeln('cRACk fOR     : Prog de merde v0.0');
      Writeln('cRACk tYPE    : Auto-registration!');
      Writeln('cRACKED bY    : NoOne');
      Writeln('');
      Writeln('cONTACT       : monmail@cacamail.com');
      Writeln('wEBsITE       : www.monsite.com');
      Writeln('gREETiNGz     : Everybody !');
      Writeln('');
    
    
    
    If (FSearch(FileN,FExpand(FileN))='') then   //cherche le fichier FileN, 
                                                 //S'il est non présent,
                                                 //alors => Message d'erreur...
    
         Begin
         
         Textcolor(12);
         Writeln('oOOPS!: File ',FileN,' not found !!!');
         Writeln('-Current bad size has: ', FileSize (F),' bytes.'); 
         Writeln('-Good size should be : ', FileS ,' bytes.');
         Writeln('Crack aborted...');
         Halt(1);
    
         end;  
    
    
    
      Assign(F,FileN);
      Reset(F,1);         //pour ouvrir un fichier
      
      TextColor(8);
      Write('Checking FileSize...');
      
      If FileSize(F)<>FileS then  //FileSize verifie la taille du fichier... 
        
         begin  //début du mesage d' erreur
                //(si le fichier cible n'a pas la bonne taille..)
    
         TextColor(12);
         Writeln('ERROR!');
         TextColor(07);
         Writeln('');
         Textcolor(12);
         Writeln('File ',FileN,' has an invalid Size !!!');
         Writeln('Crack aborted...');
    
         Close(F);   //on ferme le fichier
         Halt(1);    //on arrete le prog
         end         //fin du passage affichant une erreur...
        
    Else
        
         begin            //ce qui suit est le "patchage" des octets...
     
         Writeln('OK');   //inscrit OK juste après 'Checking FileSize...'
    
         end;  //fin de la reconnaissance le la taille du fichier 
      
    
      TextColor(8);
      Write('Cracking ',FileN,'...');   //Et hop!, on réutilise encore ',FileN,'
    
    
      For I := 1 to BytesToChange do    //change les octect de 1 à...'x'
    
         begin 
         Seek(F,A[I].A);     //repere l'offset a patcher
         
         Ch:=Char(A[I].B);   //on identifie la nouvelle valeur de l'offset
                             //et on la stock dans 'Ch'
    
         Blockwrite(F,Ch,1); //ouf! Après toutes les conditions remplis, le prog va 
                             //enfin pouvoir modifier le fichier cible en inscrivant
                             //des octects par blocs de 1, tels qu'ils sont indiqués
                             //par (A:$303e6;B:$00) et (A:$47274;B:$00) dans l'exemple.
      
         end;
    
    Writeln('OK'); //inscrit OK juste après 'Cracking ',FileN,'...'
    
    Close(F)       // Pour fermer le fichier
    
      TextColor(10); 
      Writeln('CrACk Successful!');  //message de réussite du patchage :))
    
    end.
    
    
    ----------------------------------------------------------------------------------------- fin -----------------------------------------------------------------------------------------

     

    [interlude de Smeita...]
    Voila !! Vous pourrez constatez que c'est deja plus consistant que le premier patch !
    En plus, la verification CRC permet d'eviter de patcher une mauvaise version d'un programme...

    Moi je dis : Vive Static REvenge :)) !!

    Bon, maintenant, on vous donne un apercu de ce que ca donne sans les commentaires...
    Le compilateur turbo pascal est ici

    [...Fin d'interlude...]

     

    ------------------------------------------------------------------------------------- début -------------------------------------------------------------------------------------

    Program Crack;
    Uses CRT, DOS;
    Const
    
        FileN         : String  = 'progde~1.exe';
        BytesToChange : Integer = 2;  
        FileS         : LongInt = 564132; 
    
        A             : Array[1..2] of Record
    
                        A : Longint;
                        B : Byte;
    End =
    
    (
    (A:$303e6;B:$90),
    (A:$47274;B:$90)  
    );
    
    
    Var
      F     : File;
      Ch    : Char;
      Attr  : Word;
      I     : LongInt;
    
    
    Begin
     
    Textcolor(13);
    clrscr; 
    
    
      Writeln('cRACk fOR     : Prog de merde v0.0');
      Writeln('cRACk tYPE    : Auto-registration!');
      Writeln('cRACKED bY    : NoOne');
      Writeln('');
      Writeln('cONTACT       : monmail@cacamail.com');
      Writeln('wEBsITE       : www.monsite.com');
      Writeln('gREETiNGz     : Everybody !');
      Writeln('');
    
    
    If (FSearch(FileN,FExpand(FileN))='') then 
    
         begin
         
         Textcolor(12);
         Writeln('oOOPS!: File ',FileN,' not found !!!');
         Writeln('-Current bad size has: ', FileSize (F),' bytes.'); 
         Writeln('-Good size should be : ', FileS ,' bytes.');
         Writeln('Crack aborted...');
         Halt(1);
    
         end;  
    
    
      Assign(F,FileN);
      Reset(F,1);     
      
      TextColor(8);
      Write('Checking FileSize...');
      
      If FileSize(F)<>FileS then 
        
         begin
    
         TextColor(12);
         Writeln('ERROR!');
         TextColor(07);
         Writeln('');
         Textcolor(12);
         Writeln('File ',FileN,' has an invalid Size !!!');
         Writeln('Crack aborted...');
    
         Close(F); 
         Halt(1);
         end 
    
    else
        
         begin  
         Writeln('OK');
         end; 
      
      TextColor(8);
      Write('Cracking ',FileN,'...');  
    
      For I := 1 to BytesToChange do
    
         begin 
         Seek(F,A[I].A); 
              Ch:=Char(A[I].B); 
         Blockwrite(F,Ch,1); 
         end;
    
    Writeln('OK');
    Close(F)
    
      TextColor(10); 
      Writeln('CrACk Successful!'); 
    
    end.
    
    
    ------------------------------------------------------------------------------------- fin -------------------------------------------------------------------------------------

     

    N.B: certains progs, vont chercher un fichier dat et refusent de démarrer. Alors, pour ne pas vous galérer, une petite ligne Pascal va vous permettre de créer un fichier vide. Pour cela il faut d' abord déclarer une variable puis l'exploiter de la façon suivante:

    Var
    k: text;

    puis:

    Assign(k,'Info.dat');
    Rewrite(k);

    Ceci est à placer avant la ligne " If (FSearch(FileN,FExpand(FileN))='') then ".

    Allez, bonne chance à tous et à bientôt !


    votre commentaire
  • Mon objectif : craquer le CD-CHECK de Myth II

     

    1/ Les logiciels utiles pour ce cours

    -> Un désassembleur               :  W32dasm 8.93
    -> Un éditeur hexadécimal       :  Winhex 10.2

     

    2/ Présentation

    Quand vous lancez le jeu sans le CD, une image vous demande de l'inserer !Il n'y a pas de MessageBox, donc il faut procéder autrement que d'habitude... Pas de probleme, on va le cracker.

    -> Faites deux copies de MythII.exe. Appellez la premiere WDASMyth2.exe et l'autre BAKUP.EXE...

    -> Maintenant lancez W32DASM et desassemblez WDASMyth2.exe.

    -> Quand le fichier est decompilé cliquez sur le bouton Imports Functions.

     

    Pourquoi 'Imports Funtions' and pas 'String Data reference' comme d'hab ?

    Parceque le message d'erreur n'est pas sous forme de MessageBox,mais est integré dans le jeu sous forme d'image. Dans les 'Imports functions', double-cliquez sur KERNEL32.GetDriveTypeA. Cette fonction determine si un support est un CD-Rom ou un Disque Dur,et permet donc de realiser un Cd-CHECK (en sus, il y a d'autres infos du style Nom_du_volume, taille_du_disque...).C'est donc cette fonction qui va nous interresser !

    Au premier double-clic, vous tombez sur un petit bout de code... Ce n'est pas l'endroit qui nous interesse.

     

    Pourquoi ?

    Eh ben, sachez que la fonction GetDriveTypeA differencie le type de support suivant un code (de 1 à 7 je crois..) et le CD-Rom a le code '5'. Regardez donc en 4870D6... Si vous voyer une ligne comme ca a coté d'un GetDriveTypeA,vous pouvez être quasi sûr que c'est la routine du CD-Check !

    Recliquez donc sur KERNEL32.GetDriveTypeA afin d'atterir sur cette partie du code :

     


    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:00487170(C)
    * Possible Reference to String Resource ID=00001: "Myth II"
    :004870B2 BA01000000              mov edx, 00000001
    :004870B7 8ACB                    mov cl, bl
    :004870B9 D3E2                    shl edx, cl
    :004870BB 8AC3                    mov al, bl
    :004870BD 0441                    add al, 41
    :004870BF 88442410                mov byte ptr [esp+10], al
    :004870C3 85D5                    test ebp, edx
    :004870C5 0F84A0000000            je 0048716B       <-- jump vers le debut du CD-CHECK
    :004870CB 8D442410                lea eax, dword ptr [esp+10]
    :004870CF 50                      push eax
    
    
    * Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh
    :004870D0 FF1520495B00            Call dword ptr [005B4920]
    :004870D6 83F805                  cmp eax, 00000005     <-- Verifie qu'il y a le CD.
    :004870D9 0F858C000000            jne 0048716B          <-- Si non, jump au debut du 'CD-Check'
    :004870DF 8A0D103E5500            mov cl, byte ptr [00553E10]
    :004870E5 33C0                    xor eax, eax          <-- Le test 'Cd-Check' a échoué
    :004870E7 884C2418                mov byte ptr [esp+18], cl
    :004870EB B93F000000              mov ecx, 0000003F
    :004870F0 8D7C2419                lea edi, dword ptr [esp+19]
    :004870F4 6A00                    push 00000000
    :004870F6 F3                      repz
    :004870F7 AB                      stosd
    :004870F8 66AB                    stosw
    :004870FA 6A00                    push 00000000
    :004870FC 6A00                    push 00000000
    :004870FE 6A00                    push 00000000
    :00487100 6A00                    push 00000000
    :00487102 AA                      stosb
    :00487103 8D54242C                lea edx, dword ptr [esp+2C]
    :00487107 68FF000000              push 000000FF
    :0048710C 8D442428                lea eax, dword ptr [esp+28]
    :00487110 52                      push edx
    :00487111 50                      push eax
    .
    ..
    ...
    ....
    
    //Un peu plus loin dans le listing, vers la fin de la routine du 'CD-Check'...
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:00487156(U)
    :0048715D 85C0                    test eax, eax    <-- Test si eax=0
    :0048715F 741B                    je 0048717C      <-- jump si vous avez le CD (eax=0)
    :00487161 EB08                    jmp 0048716B     <-- Jump vers le 'CD-CHECk' (eax<>0)
    
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
    |:004870C5(C), :004870D9(C), :00487161(U)
    :0048716B 43                      inc ebx       <- ici, ebx est incrementé a chaque passage
    :0048716C 6683FB19                cmp ebx, 0019 <- au bout de 20 passage on quitte le Cd Check
    :00487170 0F8E3CFFFFFF            jle 004870B2  <- Appelle GetDriveTypeA
    :00487176 8B442414                mov eax, dword ptr [esp+14]
    :0048717A EB05                    jmp 00487181  <-- Le 'CD-check' a échoué.
    
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048715F(C)
    
    * Possible Reference to String Resource ID=00001: "Myth II"
    :0048717C B801000000              mov eax, 00000001             <-- Ok, le Cd est reconnu !
    
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048717A(U)
    :........ ...........             ................... => vers la suite du listing...
    
    
    

     

    Bon, maintenant je vous explique...

    C'est assez simple : l'histoire commence en 487170 .... On arrive d'on-ne-sais-ou et voici donc que le programme va se demander si oui ou non vous avez le CD...Alors en 4870C5 il y a un jump vers la boucle du 'Cd-Check'. Une boucle ?? Ben oui, à chaque passage on incremente 'ebx', et au bout de 20 fois, on rend le 'verdict' :) Ne me demandez pas pourquoi ca se passe comme ça, c'est pas important de toute façon...

    Donc, après avoir incrementé 'ebx', s'il est inferieur à 19 on repart en 487170.

    Sauf que cette fois, le saut en 4870C5 ne se fera pas car 'ebp' n'est plus egale a 'edx'
    (si vous regardez bien, on peut supposer que c'est '
    ebp' qui change pendant la routine du CD-Check puisque 'edx' est initialisé a 1 des le debut de 487170...'ebp' doit etre modifier dans les lignes que je vous ai coupé, de toute facon c'est pas important).

    Donc comme on saute pas ce coup si, on passe a GetDriveTypeA...Arrivé la, la fonction regarde s'il y a un CD ou non...Et donc on va se taper le saut car on a pas de CD ! Il faudra donc penser a remplacer ce 0F85 (jne) par un 0F84 (je) qui annulera ce saut...

    Imaginons qu'on est annulé ce saut: on continue notre epopée et arrivé a un moment de la routine (dans les lignes que j'ai coupé), le programme determine si le support correspond à un CD original de Myth 2 (voir 48715D). On voit qu'il saute de facon inconditionnel en 48716B si le premier saut n'est pas executé. Or 48716B c'est la 'boucle des 20 passages', la ou il faut pas aller !!
    On en deduit donc que le saut en
    48715F, c'est la ou il faut aller :)

    Alors la, c'est simple, il suffit de forcer le 741B (JE) en EB1B (JMP) (cf 48715F).

     

     

    Bon, ben voila si on recapitule, il faut d'abord annuler le saut en 4870D9 puis forcer le saut en 48715F...

    Voulez-vous une autre methode pour niquer le CD-Check ?? (ouiiiiiii) Mmm...mais alors c'est parceque c'est vous :) Bon, sans rire, regardez la difference entre le saut de 48715F et celui qui est en 48717A, a la fin du 'CD-Check'...Ben la seule difference c'est qu'avec le premier vous passez par une ligne supplementaire :

    :0048717C B801000000 mov eax, 00000001
    Donc, en fait, on pourrait tout simplement nopper le saut en 48717A et on irai toujours sur ce mov eax, 00000001...valavalou :)) Il suffirait alors de mettre un 9090 a la place du EB05 (cf 48717A) et le jeu serait cracké... Cool non ?? (Au fait, cette méthode marche avec toutes les versions de Myth 2.)

    Bon, alors la vous venez d'apprendre a cracker un jeu commercial d'une grosse boîte...Vous voyez, c'est pas si dur :)) En tout cas, soyez sûr que c'est pas toujours aussi simple. Ceci dit, vous pouvez cracker pas mal de jeu comme ca :)

     



    votre commentaire
  • Mon objectif : craquer mIRC 5.5

     

    1/ Les logiciels utiles pour ce cours

    -> Le programme à craquer     :  mIRC
    -> Un désassembleur               :  W32dasm 8.93
    -> Un éditeur hexadécimal       :  Winhex 10.2

     

    2/ Présentation

    Tout d'abord on peut se demander pourquoi cracker mIRC alors qu'il ne possède à proprement dit aucune
    protection à part un nag screen de temps en temps.

    En fait, cela constitue tout de même une bonne initiation au crack, et cela va permettre au débutants de suivre sans trop de difficultés (enfin je l'espère... :-) et leur permettrent d'acquérir quelques bases.
    Ou bien encore la satisfaction de voir son nom dans la fenêtre ou l'on voit habituellement 'unlicenced'.

     

    3/ Désassemblage et craquage

    -> Allez dans mIRC et dans le menu faites 'Help' puis 'Register'.
    -> Entrez votre nom et un serial bidon puis appuyez sur 'ok'.
    -> Et le message : "Sorry, your registration name and numer don't match! Please..." apparaît. Notez le, il va nous servir pour la suite.
    -> Puis faites une copie de mIRC32.exe en la renommant par exemple 1.exe
    -> Faites en une seconde copie et renommez la en 2.exe
    -> Ensuite desassemblez 1.exe avec W32dasm
    -> Allez ensuite dans String Data References, et dans la liste des messages cherchez le messages d'erreurs que nous avons noté précédemment. C'est bon vous l'avez ? Ok au boulot
    -> Cliquez deux fois dessus, voilà W32dasm nous emmène dans le programme ...

     


    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    :00435D09(C) //(nous allons y faire référence un peu plus bas...)
    :00435DAA 6A00            push 00000000
    
    
    * Reference To: USER32.MessageBeep, Ord:0000h
    :00435DAC E80B1C0900      Call 004C79BC
    :00435DB1 68E9AD4C00      push 004CADE9
    :00435DB6 6A00            push 00000000
    :00435DB8 6A0C            push 0000000C
    
    
    * Possible Ref to Menu: MenuID_0017, Item: "Search..."
    * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0083,
    :00435DBA 6883000000      push 00000083
    :00435DBF 8B5508          mov edx, dword ptr [ebp+08]
    :00435DC2 52              push edx
    
    
    * Reference To: USER32.SendDlgItemMessageA, Ord:0000h
    :00435DC3 E8481C0900      Call 004C7A10
    :00435DC8 68EBAD4C00      push 004CADEB
    :00435DCD 6A00            push 00000000
    :00435DCF 6A0C            push 0000000C
    
    
    * Possible Ref to Menu: MenuID_0017, Item: "Contents"
    * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0082, "
    :00435DD1 6882000000      push 00000082
    :00435DD6 8B4D08          mov ecx, dword ptr [ebp+08]
    :00435DD9 51              push ecx....
    
    
    * Reference To: USER32.SendDlgItemMessageA, Ord:0000h
    :00435DDA E8311C0900      Call 004C7A10
    :00435DDF 6A10            push 00000010
    :00435DE1 6A00            push 00000000.
    
    
    * Possible Reference to String Resource ID=01912: "mIRC Registration!"                              
    :00435DE3 6878070000      push 00000778
    :00435DE8 E81348FDFF      call 0040A600
    :00435DED 50              push eax
    :00435DEE 6A00            push 00000000
    
    
    * Possible Reference to String Resource ID=01913: "Sorry, your registration name and number don't match!..Pleas"
    //(Le programme nous amène ici si le code est mauvais.)
    :00435DF0 6879070000      push 00000779
    :00435DF5 E80648FDFF      call 0040A600
    :00435DFA 50              push eax
    :00435DFB 8B4508          mov eax, dword ptr [ebp+08]
    :00435DFE 50              push eax
    
    * Reference To: USER32.MessageBoxA, Ord:0000h
    //Il s'agit donc de savoir quand le programme décide de nous envoyer ici...
    //on remonte donc pour chercher un saut conditionnel (Je ou Jne, Ja....).
    //Au bout d'un moment on arrive ici : (c'est ce qui avait au tout debut...)
    * Referenced by a (U)nconditional or (C)onditional Jump at Address: :00435D09(C) :00435DAA 6A00 push 00000000 * Reference To: USER32.MessageBeep, Ord:0000h :00435DAC E80B1C0900 Call 004C79BC :00435DB1 68E9AD4C00 push 004CADE9 :00435DB6 6A00 push 00000000 :00435DB8 6A0C push 0000000C //Le (C) indique que c'est un saut conditionnel
    //On nous indique aussi sa provenance (a gauche du (c)), à savoir : 00435D09.
    //Faites 'Goto Code Location' et tapez 00435D09.
    //W32dasm nous emmène ici :

    * Reference To: USER32.SendDlgItemMessageA, Ord:0000h :00435CF3 E8181D0900 Call 004C7A10 :00435CF8 68235F4D00 push 004D5F23 :00435CFD 683C5B4D00 push 004D5B3C :00435D02 E871C50500 call 00492278 :00435D07 85C0 test eax, eax :00435D09 0F859B000000 jne 00435DAA //(le JNE nous envoie sur "Sorry, your ...." quand le code est faux...) * Possible StringData Ref from Data Obj ->"mirc.ini. :00435D0F 687CCF4C00 push 004CCF7C * Possible StringData Ref from Data Obj ->"oryx" :00435D14 68E3AD4C00 push 004CADE3 * Possible StringData Ref from Data Obj ->"show" :00435D19 68DDAD4C00 push 004CADDD * Possible StringData Ref from Data Obj ->"about" :00435D1E 68D6AD4C00 push 004CADD6 :00435D23 E8D8600200 call 0045BE00 :00435D28 BE105E4E00 mov esi, 004E5E10 :00435D2D BF3C5B4D00 mov edi, 004D5B3C :00435D32 33C0 xor eax, eax :00435D34 83C9FF or ecx, FFFFFFFF :00435D37 F2 repnz :00435D38 AE scasb :00435D39 F7D1 not ecx :00435D3B 2BF9 sub edi, ecx :00435D3D 87F7 xchg edi, esi :00435D3F 8BC7 mov eax, edi :00435D41 8BD1 mov edx, ecx :00435D43 C1E902 shr ecx, 02 :00435D46 F3 repz :00435D47 A5 movsd :00435D48 8BCA mov ecx, edx :00435D4A 83E103 and ecx, 00000003 :00435D4D F3 repz :00435D4E A4 movsb :00435D4F 68235F4D00 push 004D5F23 :00435D54 683C5B4D00 push 004D5B3C :00435D59 E8F6C70500 call 00492554 :00435D5E 6A00 push 00000000 * Possible Ref to Menu: MenuID_0017, Item: "Register..." * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0085, "" :00435D60 6885000000 push 00000085 :00435D65 A1C0204E00 mov eax, dword ptr [004E20C0] :00435D6A 50 push eax * Reference To: USER32.DeleteMenu, Ord:0000h (ici il appelle la fonction qui efface 'Register' du menu) :00435D6B E8541A0900 Call 004C77C4 :00435D70 6A01 push 00000001 :00435D72 8B5508 mov edx, dword ptr [ebp+08] :00435D75 52 push edx * Reference To: USER32.EndDialog, Ord:0000h :00435D76 E89D1A0900 Call 004C7818 * Possible Reference to Dialog: DialogID_0040 :00435D7B 6A40 push 00000040 :00435D7D 6A00 push 00000000 * Possible Reference to String Resource ID=01912: "mIRC Registration!" :00435D7F 6878070000 push 00000778 :00435D84 E87748FDFF call 0040A600 :00435D89 50 push eax :00435D8A 6A00 push 00000000 * Possible Reference to String Resource ID=01911: "Your registration has been entered successfully...Thanks for." :00435D8C 6877070000 push 00000777 :00435D91 E86A48FDFF call 0040A600 :00435D96 50 push eax :00435D97 8B4D08 mov ecx, dword ptr [ebp+08] :00435D9A 51 push ecx

     

    -> Donc si on change le 'jne 00435DAA' en 'je 00435DAA' le programme ira sur "Your registration has been entered successfully..." uniquement quand le code sera faux.

    Il faut donc changer 'jne 00435DAA' en 'je 00435DAA' donc 0F859B000000 devient 0F849B000000
    (OF85xxxxxx devient OF84xxxxxx, et inversemment...cf MemenTo 1)

    -> On clique sur la ligne 00435D09 pour savoir quel offset modifier (en effet dans la barre du bas, W32dasm nous indique l'offset ou on se trouve).

    -> Ensuite prenez un éditeur héxadécimal, allez à l'offset et modifier 2.exe comme indiqué précedemment.

    -> Sauvegardez, et relancer le programme et essayez de vous enregistrez, rentrez un nom et un serial bidon.

    Bravo, mIRC et enregistré on constate également que 'Register' ne figure plus dans le menu 'Help'. En plus, votre nom apparait dans 'About' !! Quittez mIRC et relancez le programme et là.... oh surprise, le programme n'est plus enregistré :( Et oui...comme la plupart des programmes mIRC effectue une vérification du nom/serial au démarrage.

    On réfléchit et on se souvient que lorsque on c'est enregistré le menu 'Register' avait disparu.On cherche alors dans 'Ref Menu' la reference 'Register' et on le trouve !. On sait également que pour supprimer un menu le programme doit faire appel à la fonction USER.DELETEMENU. On recherche donc un endroit ou on trouve une référence au menu 'Register' et à la commande User.deletemenu.

    -> Cliquez donc plusieurs fois sur 'Register' jusqu'à ce que vous trouviez 'Register' et un peu plus haut la commande qui permet de supprimer le menu. On la trouve, et cela nous donne cela :

     


    :004923EA 681F024D00     push 004D021F
    :004923EF 8B4C240C       mov ecx, dword ptr [esp+0C]
    :004923F3 51             push ecx
    
    
    * Reference To: ADVAPI32.RegQueryValueA, Ord:0000h
    
    :004923F4 E8CB4E0300     Call 004C72C4
    :004923F9 85C0           test eax, eax
    :004923FB 7565           jne 00492462
    :004923FD 6A02           push 00000002
    :004923FF 68235F4D00     push 004D5F23
    :00492404 E867B1FAFF     call 0043D570
    :00492409 68235F4D00     push 004D5F23
    :0049240E 55             push ebp
    :0049240F E864FEFFFF     call 00492278
    :00492414 85C0           test eax, eax
    :00492416 754A           jne 00492462     //voilà quelque chose qui nous intéresse...
                                              //(détermine si le menu est affiché ou non)
    :00492418 8B0424         mov eax, dword ptr [esp]
    :0049241B 50             push eax
    
    
    * Reference To: ADVAPI32.RegCloseKey, Ord:0000h
    
    :0049241C E88B4E0300     Call 004C72AC
    :00492421 6A00           push 00000000
    
    
    * Possible Ref to Menu: MenuID_0017, Item: "Register..."
    //(Voilà la référence qui nous intéresse...)
    
    * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0085, ""
    
    :00492423 6885000000     push 00000085
    :00492428 8B15C0204E00   mov edx, dword ptr [004E20C0]
    :0049242E 52             push edx
    
    
    * Reference To: USER32.DeleteMenu, Ord:0000h
    //(Et la commande permettant de supprimer le menu 'Register...').
    
    

     

    La comme avant, il suffit de changer un je en jne donc jne 00492462 devient je 00492462 en héxadécimal 744A devient 754A

    Voilà, comme avant notez l'offset à modifier et allez les changer avec l'éditeur hexadécimal winhex.exe, sauvegardez, relancez le mIRC. Puis rentrez une nom et un serial bidon, comme avant le programme vous dis "Thank...", quitter mIRC, relancez le et là bravo, mIRC est complètement cracké, en effet notre nom et dans 'About' et 'Register' n'est plus là.

    [Conclusion :] C'était pas trop dur, mIRC est un petit programme facile à cracker, mais cela permet au moins d'acquérir un peu de pratique.

     


    votre commentaire